fully-api
Version:
API framework for Fully Stacked, LLC REST-ful APIs
160 lines • 7.83 kB
JavaScript
;
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