gbox-apis
Version:
An Gbox API's npm Package for Node.js and Sails.js
141 lines (109 loc) • 4.46 kB
JavaScript
let dbConfig = {}, routes = {}, controllerActions = {};
const Helper = require('./Helper');
const path = require('path');
let packageJson = null
if(typeof sails == "object" ) {
packageJson = require(path.join(process.cwd(), 'package.json'));
} else {
let Helpers = use('Helpers')
packageJson =require(`${Helpers.appRoot()}/package.json`);
}
/**
* Check-in GaussBox API to MasterAPI, and make it accessible to all GaussBox API's
*
* @returns {API}
*/
async function checkIn(apiRoutes) {
routes = apiRoutes; // save routes globally
const Api = require('./Api')(dbConfig);
if (!packageJson) throw new Error('***** Error: Missing package.json file! *****');
let valPackageJson = Helper.validatePackageJson(packageJson); // validate package.json file
if (!valPackageJson.valid) {
console.log('\x1b[31m', `[GB ERROR] ${valPackageJson.errorMsg}`, '\x1b[0m'); // log error
throw new Error(valPackageJson.errorMsg);
}
let valRoutes = Helper.validateRoutes(routes); // validate routes json
if (!valRoutes.valid) {
console.log('\x1b[31m', `[GB ERROR] ${valRoutes.errorMsg}`, '\x1b[0m'); // log error
throw new Error(valRoutes.errorMsg);
}
let exist = await Api.getApi(packageJson.name); // check if API exist
// if not exist, added it
if (!exist.length) {
try {
let apiId = await Api.saveApi();
let apiModuleId = await Api.saveApiModule(apiId);
await Api.saveApiActions(routes, apiId, apiModuleId);
} catch (e) {
console.log('\x1b[31m', '[GB ERROR] Problem with saving api data.', e, '\x1b[0m'); // log error
throw new Error(e);
}
} else {
try {
let oldApi = (await Api.getApi(packageJson.name))[0]; // get existing api data
await Api.updateApi(oldApi); // update api model
// handle route actions
let actions = { new: [], update: [], remove: [] };
if (oldApi.actions.length) {
// check for routes which need to be removed or updated
for (let existAction of oldApi.actions) {
let check = routes.find(apiAction => {
if (apiAction.route === existAction.route && apiAction.routeMethod === existAction.method)
return apiAction;
});
if (!check) actions.remove.push(existAction);
else actions.update.push(check);
}
// check for new routes
for (let route of routes) {
let check = oldApi.actions.find(action => {
if (action.route === route.route && action.method === route.routeMethod)
return action;
});
if (!check) actions.new.push(route);
}
}
if (actions.new.length) await Api.saveApiActions(actions.new, oldApi.id, oldApi.module.id); // save new actions
if (actions.update.length) await Api.updateApiActions(actions.update); // update actions
if (actions.remove.length) await Api.removeApiActions(actions.remove); // remove unused actions
} catch (e) {
console.log('\x1b[31m', '[GB ERROR] Problem with updating api data.', e, '\x1b[0m'); // log error
throw new Error(e);
}
}
return 'API checked in successfully!';
}
/**
* Get Gauss Box API data
*
* @returns {API}
*/
async function getData(apiName = null) {
const Api = require('./Api')(dbConfig);
let data;
try {
data = await Api.getApi(apiName);
if (!data.length) {
console.log('\x1b[31m', `[GB ERROR] ${apiName} is unknown API!`, '\x1b[0m'); // log error
throw new Error('Unknown API!');
}
return data;
} catch (e) {
console.log('\x1b[31m', '[GB ERROR] Error getting apiData!', e, '\x1b[0m'); // log error
throw new Error(e);
}
};
// managing Gauss Box API'S
module.exports = (config) => {
dbConfig = {
host: config.host,
port: config.port,
user: config.user,
password: config.password,
database: config.database
};
return {
checkIn: checkIn,
getData: getData
}
};