UNPKG

fully-api

Version:

API framework for Fully Stacked, LLC REST-ful APIs

160 lines 7.83 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Controller = void 0; const ErrorObj_1 = require("./ErrorObj"); const Q = require('q'); const fs_1 = __importDefault(require("fs")); const path = require('path'); const rootDir = path.dirname(require.main.filename); // =============================================================================== // UTILITY FUNCTIONS // =============================================================================== class Controller { constructor(da, utils, ac, sr, st, m, e, c) { this.dataAccess = da; this.utilities = utils; this.accessControl = ac; this.serviceRegistration = sr; this.settings = st; this.models = m; this.endpoints = e; this.config = c; } ; resolveServiceCall(serviceCallDescriptor, req, callback) { const deferred = Q.defer(); // =================================================================== // PULL THE APPROPRIATE VERSION OF WEB SERVICE WITH APPROPRIATE VERB // =================================================================== let versionObj; try { versionObj = this.makeVersionObject(serviceCallDescriptor.version); } catch (err) { const errorObj = new ErrorObj_1.ErrorObj(400, 'c0001', __filename, 'resolveServiceCall', 'invalid version string', 'Invalid version string. Please follow version format x.y.x - major.minor.bug', err); deferred.reject(errorObj); return deferred.promise; } let versionOfWS; if (serviceCallDescriptor.verb.toLowerCase() === 'get' || serviceCallDescriptor.verb.toLowerCase() === 'post' || serviceCallDescriptor.verb.toLowerCase() === 'put' || serviceCallDescriptor.verb.toLowerCase() === 'patch' || serviceCallDescriptor.verb.toLowerCase() === 'delete') { const wsNoVerb = this.getVersionOfWebService(serviceCallDescriptor.area.toLowerCase(), serviceCallDescriptor.controller.toLowerCase(), versionObj); if (wsNoVerb !== null) { versionOfWS = wsNoVerb[serviceCallDescriptor.verb.toLowerCase()]; } else { versionOfWS = null; } } else { const errorObj = new ErrorObj_1.ErrorObj(400, 'c0002', __filename, 'resolveServiceCall', 'unsupported http verb', 'That http verb is not supported. Please use GET, POST, PUT, PATCH, or DELETE'); deferred.reject(errorObj); return deferred.promise; } if (versionOfWS === null) { const errorObj = new ErrorObj_1.ErrorObj(500, 'c0003', __filename, 'resolveServiceCall', 'error locating correct controller file', 'Problem finding that endpoint', serviceCallDescriptor); deferred.reject(errorObj); return deferred.promise; } let funcName = null; let foundFuncName = false; const funcNames = Object.keys(versionOfWS); for (let fIdx = 0; fIdx < funcNames.length; fIdx++) { if (funcNames[fIdx].toLowerCase() === serviceCallDescriptor.call.toLowerCase()) { foundFuncName = true; funcName = funcNames[fIdx]; break; } } if (foundFuncName) { const mainCall = Q.denodeify(versionOfWS[funcName]); mainCall(req) .then(function (results) { deferred.resolve(results); }) .fail(function (err) { let errorObj; if (err !== undefined && err !== null && typeof (err.addToError) === 'function') { errorObj = err.addToError(__filename, 'resolveServiceCall', 'main function call failed'); } else { errorObj = new ErrorObj_1.ErrorObj(500, 'c0004', __filename, 'resolveServiceCall', 'main function call failed', 'Something went wrong', err); } errorObj.timestamp = new Date(); console.log('\n========================== ERROR =========================='); console.log(errorObj); console.log('=============================================================\n'); deferred.reject(errorObj); }); } else { const errorObj = new ErrorObj_1.ErrorObj(400, 'c1005', __filename, 'resolveServiceCall', 'error locating correct function in controller file', 'Problem finding that endpoint', serviceCallDescriptor); deferred.reject(errorObj); } deferred.promise.nodeify(callback); return deferred.promise; } ; /** * Takes a version string and generates a JS version object. * @param {string} versionString - A version string following the format x.y.z - major.minor.bug. * @return {object} versionObject - JS object detailing version information. * @throws Will throw an error on invalid input (wrong format, non-numerical) */ makeVersionObject(versionString) { const digits = /^\d+$/; const versionDetails = versionString.split('.'); if (versionDetails.length != 3) { throw new Error("Invalid arguments for makeVersionObject()"); } else if ((digits.test(versionDetails[0]) || digits.test(versionDetails[1]) || digits.test(versionDetails[2])) == false) { throw new Error("Invalid arguments for makeVersionObject()"); } const versionObject = { 'major': versionDetails[0], 'minor': versionDetails[1], 'bug': versionDetails[2] }; return versionObject; } getVersionOfWebService(areaName, controllerName, versionObj) { const servicesDir = this.utilities.getDirectoryFromDistNPM("./areas/" + areaName + '/'); const services = fs_1.default.readdirSync(servicesDir); let baseServiceName = null; const inputVersionString = versionObj.major + '_' + versionObj.minor + '_' + versionObj.bug; for (let sIdx = 0; sIdx < services.length; sIdx++) { const serviceName = services[sIdx].substring(0, services[sIdx].indexOf('_')); let versionString = services[sIdx].substring(services[sIdx].indexOf('_') + 1); versionString = versionString.substring(0, versionString.indexOf('.')); if (serviceName.toLowerCase() === controllerName.toLowerCase() && versionString === inputVersionString) { baseServiceName = serviceName; break; } } if (baseServiceName === null) { return null; } try { const serviceCallsPath = servicesDir + baseServiceName + '_' + inputVersionString + '.js'; const className = baseServiceName.charAt(0).toUpperCase() + baseServiceName.slice(1); const ServiceCalls = require(serviceCallsPath)[className]; const versionOfWS = new ServiceCalls(this.dataAccess, this.utilities, this.accessControl, this.serviceRegistration, this.settings, this.models, this.endpoints, this.config); return versionOfWS; } catch (e) { const errorObj = new ErrorObj_1.ErrorObj(500, 'c1006', __filename, 'getVersionOfWebService', 'error loading web service file', 'There was a problem with your request. Please try again.', e); this.utilities.writeErrorToLog(errorObj); } } } exports.Controller = Controller; //# sourceMappingURL=controller.js.map