1 | (function (request, Joi, Promise, util, logger) {
|
2 | 'use strict';
|
3 |
|
4 | var optionsValidation = Joi.object({
|
5 | endpoint: Joi.string().min(1).optional().example('https://api.codacy.com/2.0/coverage/:commitId/:language')
|
6 | });
|
7 | var tokenValidation = Joi.string().required().min(1).example('1234567890');
|
8 | var commitIdValidation = Joi.string().required().min(1).example('1234567890');
|
9 | var coverageDataValidation = Joi.object({
|
10 | total: Joi.number().integer().required().min(0).max(100),
|
11 | fileReports: Joi.array().required().items(Joi.object({
|
12 | filename: Joi.string().required().min(1),
|
13 | total: Joi.number().integer().required().min(0).max(100),
|
14 | coverage: Joi.object().pattern(/\d/, Joi.number().integer().min(1))
|
15 | }).required())
|
16 | }).example({total: 50, fileReports: [{filename: 'filename', total: 10, coverage: {1: 1, 2: 3}}]});
|
17 |
|
18 | module.exports = function (options) {
|
19 | logger.trace(util.format('Creating reporter for %j', options));
|
20 | var optionsValid = Joi.validate(options, optionsValidation, {
|
21 | stripUnknown: true
|
22 | });
|
23 |
|
24 | if (optionsValid.error) {
|
25 | logger.error(optionsValid.error);
|
26 | throw optionsValid.error;
|
27 | }
|
28 |
|
29 | var endpoint = options.endpoint || 'https://api.codacy.com/2.0/coverage/:commitId/javascript';
|
30 | logger.debug('Setting up reporter communicating to: ' + endpoint);
|
31 |
|
32 | return {
|
33 | sendCoverage: function sendCoverage(token, commitId, data) {
|
34 | return new Promise(function (resolve, reject) {
|
35 | logger.trace(util.format('Sending Coverage for token [%s] and commitId [%s]', token, commitId));
|
36 | var tokenValid = Joi.validate(token, tokenValidation);
|
37 | var commitIdValid = Joi.validate(commitId, commitIdValidation);
|
38 | var dataValid = Joi.validate(data, coverageDataValidation, {
|
39 | stripUnknown: true
|
40 | });
|
41 | var validationErr = tokenValid.error || commitIdValid.error || dataValid.error;
|
42 |
|
43 | if (validationErr) {
|
44 | logger.error(validationErr);
|
45 | return reject(validationErr);
|
46 | }
|
47 |
|
48 | var url = endpoint.replace(':commitId', commitId);
|
49 | logger.trace(util.format('Sending POST to %s', url));
|
50 |
|
51 | return request({
|
52 | url: url,
|
53 | method: 'POST',
|
54 | json: data,
|
55 | headers: {
|
56 |
|
57 | 'project_token': token
|
58 |
|
59 | },
|
60 | resolveWithFullResponse: true
|
61 | }).then(function (res) {
|
62 | if (res.statusCode !== 200) {
|
63 | var err = new Error(util.format('Expected Status Code of 200, but got [%s]', res.statusCode));
|
64 | logger.error(util.format('Status Code [%s] - Error [%j]', res.statusCode, res.error));
|
65 | return reject(err);
|
66 | }
|
67 | logger.debug('Successfully sent coverage data');
|
68 | resolve();
|
69 | }, function (res) {
|
70 | var err = new Error(util.format('Expected Successful Status Code, but got [%s]', res.statusCode));
|
71 | logger.error(util.format('Status Code [%s] - Error [%j]', res.statusCode, res.error));
|
72 | reject(err);
|
73 | });
|
74 | });
|
75 | }
|
76 | };
|
77 | };
|
78 | }(require('request-promise'), require('joi'), require('bluebird'), require('util'), require('./logger')()));
|