nralcm
Version:
This is a framework based on NodeJs to manage rest api request lifecycle
52 lines (51 loc) • 2.49 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
require("reflect-metadata/Reflect");
const common_1 = require("../common");
const functions_1 = require("../common/functions");
/**
* Route Decorator to define routes in controller
* @param httpMethod HttpMethod of api
* @param route route string for api method
*/
function Route(httpMethod, route) {
return function (target, propertyKey, descriptor) {
if (route && route.indexOf("{") >= 0 && route.indexOf("}") >= 0) {
const routeParts = route.startsWith("/") ? route.substring(1).split("/") : route.split("/");
const methodParameters = functions_1.getMethodParameters(descriptor.value, propertyKey);
routeParts.forEach(ro => {
const openCurlyBraceIndex = ro.indexOf("{");
const closeCurlyBraceIndex = ro.indexOf("}");
if (openCurlyBraceIndex >= 0 && closeCurlyBraceIndex >= 0) {
const paramName = ro.substring(openCurlyBraceIndex + 1, closeCurlyBraceIndex);
if (methodParameters.findIndex(p => p === paramName) === -1) {
throw new Error(`Paramerter ${paramName} is missing in method ${propertyKey}`);
}
}
});
}
if (httpMethod === common_1.HttpMethod.GET) {
const methodParametersType = Reflect.getMetadata("design:paramtypes", target, propertyKey);
if (methodParametersType && methodParametersType.length) {
methodParametersType.forEach(type => {
if (!(type.name === "Number" || type.name === "String" || type.name === "Boolean" ||
!(type.constructor && type.constructor.name === "Date"))) {
throw new Error(`Get request method ${propertyKey} cannot have ${type.name} as parameter`);
}
});
}
}
const routeDescriptor = {
route: route || propertyKey,
descriptor: descriptor,
methodName: propertyKey,
httpMethod: httpMethod
};
// injecting all routes of controller in metadata
const routeDescriptors = Reflect.getMetadata("routes", target) ?
Reflect.getMetadata("routes", target) : [];
routeDescriptors.push(routeDescriptor);
Reflect.defineMetadata("routes", routeDescriptors, target);
};
}
exports.Route = Route;