Skip to content

Commit

Permalink
feat(core): add changelog releases routes ✨
Browse files Browse the repository at this point in the history
  • Loading branch information
PierreBrisorgueil committed Jul 18, 2020
1 parent 893256a commit 57d9faf
Show file tree
Hide file tree
Showing 8 changed files with 247 additions and 2 deletions.
21 changes: 20 additions & 1 deletion config/defaults/development.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,26 @@ module.exports = {
origin: ['http://localhost:8080'],
credentials: true,
},
domain: '',
repos: [{ // generate releases and changelogs list auto /api/core/changelogs /api/core/releases
title: 'Node',
owner: 'weareopensource',
repo: 'node',
changelog: 'CHANGELOG.md',
token: null,
}, {
title: 'Vue',
owner: 'weareopensource',
repo: 'vue',
changelog: 'CHANGELOG.md',
token: null,
}, {
title: 'Swift',
owner: 'weareopensource',
repo: 'swift',
changelog: 'CHANGELOG.md',
token: null,
}],
// Data filter whitelist & Blacklist
blacklists: {
},
Expand Down Expand Up @@ -148,7 +168,6 @@ module.exports = {
noDefaults: false, // automatically set to true for put method (update)
},
},
domain: '',
seedDB: {
seed: true,
options: {
Expand Down
37 changes: 37 additions & 0 deletions modules/core/controllers/core.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/**
* Module dependencies
*/
const path = require('path');

const errors = require(path.resolve('./lib/helpers/errors'));
const responses = require(path.resolve('./lib/helpers/responses'));

const CoreService = require('../services/core.service');

/**
* @desc Endpoint to ask the service to get the releases
* @param {Object} req - Express request object
* @param {Object} res - Express response object
*/
exports.releases = async (req, res) => {
try {
const releases = await CoreService.releases();
responses.success(res, 'releases')(releases);
} catch (err) {
responses.error(res, 422, 'Unprocessable Entity', errors.getMessage(err))(err);
}
};

/**
* @desc Endpoint to ask the service to get the changelogs
* @param {Object} req - Express request object
* @param {Object} res - Express response object
*/
exports.changelogs = async (req, res) => {
try {
const changelogs = await CoreService.changelogs();
responses.success(res, 'changelogs')(changelogs);
} catch (err) {
responses.error(res, 422, 'Unprocessable Entity', errors.getMessage(err))(err);
}
};
22 changes: 22 additions & 0 deletions modules/core/policies/core.policy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/**
* Module dependencies
* */
const path = require('path');

const policy = require(path.resolve('./lib/middlewares/policy'));

/**
* Invoke Tasks Permissions
*/
exports.invokeRolesPolicies = () => {
policy.Acl.allow([{
roles: ['guest'],
allows: [{
resources: '/api/core/releases',
permissions: ['get'],
}, {
resources: '/api/core/changelogs',
permissions: ['get'],
}],
}]);
};
19 changes: 19 additions & 0 deletions modules/core/routes/core.route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* Module dependencies
*/
const path = require('path');

const policy = require(path.resolve('./lib/middlewares/policy'));
const core = require('../controllers/core.controller');

/**
* Routes
*/
module.exports = (app) => {
// changelogs
app.route('/api/core/releases').all(policy.isAllowed)
.get(core.releases);
// changelogs
app.route('/api/core/changelogs').all(policy.isAllowed)
.get(core.changelogs);
};
47 changes: 47 additions & 0 deletions modules/core/services/core.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/**
* Module dependencies
*/
const axios = require('axios');
const path = require('path');

const config = require(path.resolve('./config'));
/**
* @desc Function to get all versions
* @return {Promise} All versions
*/
exports.releases = async () => {
const requests = config.repos.map((item) => axios.get(`https://api.github.com/repos/${item.owner}/${item.repo}/releases`, {
headers: item.token ? { Authorization: `token ${item.token}` } : {},
}));
let results = await axios.all(requests);
results = results.map((result, i) => ({
title: config.repos[i].title,
list: result.data.map((release) => ({
name: release.name,
prerelease: release.prerelease,
published_at: release.published_at,
})),
}));
return Promise.resolve(results);
};

/**
* @desc Function to get all changelogs
* @return {Promise} All changelogs
*/
exports.changelogs = async () => {
const requests = config.repos.map((item) => axios.get(`https://api.github.com/repos/${item.owner}/${item.repo}/contents/${item.changelog}`, {
headers: item.token ? { Authorization: `token ${item.token}` } : {},
}));
let results = await axios.all(requests);
results = results.map((result, i) => ({
title: config.repos[i].title,
data: {
type: result.data.type,
size: result.data.size,
encoding: result.data.encoding,
content: result.data.content,
},
}));
return Promise.resolve(results);
};
69 changes: 69 additions & 0 deletions modules/core/tests/core.crud.tests.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
/**
* Module dependencies.
*/
const request = require('supertest');
const path = require('path');

const express = require(path.resolve('./lib/services/express'));
const mongooseService = require(path.resolve('./lib/services/mongoose'));
const multerService = require(path.resolve('./lib/services/multer'));

/**
* Unit tests
*/
describe('Tasks CRUD Tests :', () => {
let app;
let agent;

// init
beforeAll(async () => {
try {
// init mongo
await mongooseService.connect();
await multerService.storage();
await mongooseService.loadModels();
// init application
app = express.init();
agent = request.agent(app);
} catch (err) {
console.log(err);
}
});

describe('Logout', () => {
test('should not be able to save a task', async () => {
try {
const result = await agent.get('/api/core/releases')
.expect(200);
expect(result.body.type).toBe('success');
expect(result.body.message).toBe('releases');
expect(result.body.data).toBeInstanceOf(Array);
} catch (err) {
expect(err).toBeFalsy();
console.log(err);
}
});

test('should not be able to save a task', async () => {
try {
const result = await agent.get('/api/core/changelogs')
.expect(200);
expect(result.body.type).toBe('success');
expect(result.body.message).toBe('changelogs');
expect(result.body.data).toBeInstanceOf(Array);
} catch (err) {
expect(err).toBeFalsy();
console.log(err);
}
});
});

// Mongoose disconnect
afterAll(async () => {
try {
await mongooseService.disconnect();
} catch (err) {
console.log(err);
}
});
});
31 changes: 31 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@
}
},
"dependencies": {
"@hapi/joi": "^17.1.1",
"acl": "~0.4.11",
"axios": "^0.19.2",
"bcrypt": "^5.0.0",
"body-parser": "^1.19.0",
"bson": "^4.0.4",
Expand All @@ -66,7 +68,6 @@
"handlebars": "^4.7.6",
"helmet": "~3.23.3",
"idtoken-verifier": "^2.0.3",
"@hapi/joi": "^17.1.1",
"jsonwebtoken": "^8.5.1",
"lodash": "^4.17.19",
"lusca": "~1.6.1",
Expand Down

0 comments on commit 57d9faf

Please sign in to comment.