UNPKG

gbox-apis

Version:

An Gbox API's npm Package for Node.js and Sails.js

292 lines (234 loc) 8.09 kB
let dbConfig = {}; const mysql = require('mysql2/promise'); 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`); } /** * Execute DB query * * @return rows */ function executeQuery(query) { return new Promise(async (resolve, reject) => { let connection; // establish DB connections try { connection = await mysql.createConnection(dbConfig); } catch (e) { reject('***** Error: Unable to establish connection to DB. Contact System Administrator. *****'); } connection.query(query, (err, results, fields) => { connection.end(); if (err) reject(err); resolve(results); }); }); } /** * Insert GaussBox API data in database * * @returns {number} API id */ async function saveApi() { let query = ` INSERT INTO apis (createdAt, updatedAt, deleteFlag, apiName, slug, version, description, url, port) VALUES (UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, '${packageJson.descriptiveName || packageJson.name}', '${packageJson.name}', '${packageJson.version}', '${packageJson.description || ''}', '${process.env.homepage || `127.0.0.1:${process.env.PORT}`}', '${process.env.PORT}')`; // execute query let res; try { res = await executeQuery(query); } catch (e) { console.log('\x1b[31m', `[GB ERROR] Unable to save Api data: ${query}`, e, '\x1b[0m'); // log error throw new Error(e); } // return data id return res.insertId; } /** * Update GaussBox API data * * @returns {array} */ async function updateApi(oldApi) { // PREPARE DATA let query = ` UPDATE apis SET apiName = '${packageJson.descriptiveName || ''}', url = '${process.env.homepage || `127.0.0.1:${process.env.PORT}`}', version = '${packageJson.version || ''}', description = '${packageJson.description || ''}', port = '${process.env.PORT || ''}' WHERE id = ${oldApi.id}`; // execute query try { await executeQuery(query); } catch (e) { console.log('\x1b[31m', `[GB ERROR] Unable to update Api data: ${query}`, e, '\x1b[0m'); // log error throw new Error(e); } return 'API model updated'; } /** * Get GaussBox API's existing data * * @returns {array} */ async function getApi(apiName = null) { // prepare query for getting api data let query = ` SELECT a.id AS apiId, a.apiName, a.slug, a.version, a.description, a.url, a.port, am.id AS apiModuleId, am.moduleName, ac.id AS apiModuleActionId, ac.action, ac.actionName, ac.type, ac.routeVersion, ac.method, ac.route, ac.visibility, ac.level, ac.controllerActions FROM apis a LEFT JOIN apiModuleActions ac ON ac.api = a.id LEFT JOIN apiModules am ON ac.apiModule = am.id WHERE a.deleteFlag = 0 `; if (apiName) query += ` AND a.slug = '${apiName}' `; // execute query let res; try { let data = await executeQuery(query); res = Helper.filterApiData(data); } catch (e) { console.log('\x1b[31m', `[GB ERROR] Unable to retrieve Api data: ${query}`, e, '\x1b[0m'); // log error throw new Error(e); } return res; } /** * Insert GaussBox API module data in database * * @returns {number} API Module id */ async function saveApiModule(apiId) { let moduleName = packageJson.name.split('-'); let query = ` INSERT INTO apiModules (createdAt, updatedAt, deleteFlag, moduleName, api) VALUES (UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, '${moduleName[0]}', ${apiId})`; // execute query let res; try { res = await executeQuery(query); } catch (e) { console.log('\x1b[31m', `[GB ERROR] Unable to save Api modules: ${query}`, e, '\x1b[0m'); // log error throw new Error(e); } // return data id return res.insertId; } /** * Insert GaussBox API module actions data in database * * @returns {array} */ async function saveApiActions(apiActions, apiId, apiModuleId) { let res; let query = ''; try { // prepare query query = ` INSERT INTO apiModuleActions (createdAt, updatedAt, actionName, action, type, routeVersion, method, route, visibility, level, controllerActions, api, apiModule) VALUES `; let firstCheck = true; for (let action of apiActions) { if (!firstCheck) query += ', '; query += `(UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), '${action.actionName}', '${action.action}', '${action.type}', '${action.routeVersion}', '${action.routeMethod}', '${action.route}', '${ (action.visibility && action.visibility !== '') ? JSON.stringify(action.visibility) : ''}', '${ (action.level && action.level !== '') ? JSON.stringify(action.level) : ''}', '${ (action.controllerActions) ? JSON.stringify(action.controllerActions) : '[]'}', ${apiId}, ${apiModuleId})`; firstCheck = false; } res = await executeQuery(query); } catch (e) { console.log('\x1b[31m', `[GB ERROR] Unable to save Api actions: ${query}`, e, '\x1b[0m'); // log error throw new Error(e); } // return data id return res; } /** * Update GaussBox API actions data from database * * @returns {array} */ async function updateApiActions(apiActions) { for (let action of apiActions) { let query = ` UPDATE apiModuleActions SET updatedAt = UNIX_TIMESTAMP(), actionName = '${action.actionName}', action = '${action.action}', type = '${action.type}', routeVersion = '${action.routeVersion}', visibility = '${action.visibility ? JSON.stringify(action.visibility) : ""}', level = '${action.level ? JSON.stringify(action.level) : ""}', controllerActions = '${action.controllerActions ? JSON.stringify(action.controllerActions) : "[]"}' WHERE route = '${action.route}' AND method = '${action.routeMethod}'`; // execute query try { await executeQuery(query); } catch (e) { console.log('\x1b[31m', `[GB ERROR] Unable to update Api actions: ${query}`, e, '\x1b[0m'); // log error throw new Error(e); } } return 'API actions updated.'; } /** * Remove GaussBox API actions data from database * * @returns {array} */ async function removeApiActions(apiActions) { // prepare query let query = ` DELETE FROM apiModuleActions WHERE id IN (`; let firstCheck = true; for (let action of apiActions) { if (!firstCheck) query += ', '; query += action.id; firstCheck = false; } query += `)`; // execute query let res; try { res = await executeQuery(query); } catch (e) { console.log('\x1b[31m', `[GB ERROR] Unable to remove Api actions: ${query}`, e, '\x1b[0m'); // log error throw new Error(e); } return res; } // managing Gauss Box API'S module.exports = (config) => { dbConfig = config; return { saveApi: saveApi, updateApi: updateApi, getApi: getApi, saveApiModule: saveApiModule, saveApiActions: saveApiActions, updateApiActions: updateApiActions, removeApiActions: removeApiActions, } };