jec-sandcat
Version:
JEC Sandcat - The default RESTful web services framework for GlassCat applications.
152 lines (151 loc) • 6.41 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const jec_exchange_1 = require("jec-exchange");
const jec_commons_1 = require("jec-commons");
const ResponseHandlerBuilder_1 = require("../builders/ResponseHandlerBuilder");
const UrlPatternMapperBuilder_1 = require("../builders/UrlPatternMapperBuilder");
const ParameterInjector_1 = require("../reflect/ParameterInjector");
const SandcatError_1 = require("../exceptions/SandcatError");
const JsletMethod_1 = require("../reflect/JsletMethod");
const RequestPropertiesBuilder_1 = require("../builders/RequestPropertiesBuilder");
const HttpHeadersValidator_1 = require("../utils/HttpHeadersValidator");
const SandcatLocaleManager_1 = require("../i18n/SandcatLocaleManager");
const SandcatLoggerProxy_1 = require("../logging/SandcatLoggerProxy");
class SandcatResourceJsletProxy extends jec_exchange_1.HttpJslet {
constructor() {
super();
this._resource = null;
this._urlPatterns = null;
this._name = null;
this._handlerBuilder = null;
this._urlPatternMapper = null;
this._paramInjector = null;
this._httpHeadersValidator = null;
this.initObj();
}
initObj() {
this._handlerBuilder = new ResponseHandlerBuilder_1.ResponseHandlerBuilder();
this._paramInjector = new ParameterInjector_1.ParameterInjector();
this._httpHeadersValidator = new HttpHeadersValidator_1.HttpHeadersValidator();
}
processJsletOperation(jsletMethod) {
const operation = this._resource.getResourceDescriptor().jsletMethodsMap.get(jsletMethod);
let action = null;
if (operation) {
action = operation.action;
action.apply(this._resource);
}
}
doNotFound(req, res, exit) {
exit(req, res.sendStatus(jec_commons_1.HttpStatusCode.NOT_FOUND), null);
}
processOperation(httpMethod, req, res, exit) {
const descriptor = this._resource.getResourceDescriptor();
const requestProperties = RequestPropertiesBuilder_1.RequestPropertiesBuilder.getInstance().build(httpMethod, req);
const patternMatcher = this._urlPatternMapper.matchRequest(requestProperties);
let action = null;
let responseHandler = null;
let operation = null;
let parameters = null;
let operationStatus = -1;
let header = null;
if (patternMatcher) {
operation = descriptor.methodsMap
.get(patternMatcher.descriptor.getMappedMethod());
}
if (operation) {
header = descriptor.produces;
if (header) {
res.setHeader(jec_commons_1.HttpHeader.CONTENT_TYPE, header);
}
header = descriptor.crossDomainPolicy;
if (header) {
res.setHeader(jec_commons_1.HttpHeader.ACCESS_CONTROL_ALLOW_ORIGIN, header);
}
operationStatus =
this._httpHeadersValidator.validate(operation, requestProperties);
if (operationStatus === jec_commons_1.HttpStatusCode.OK) {
responseHandler = this._handlerBuilder.build(req, res, exit);
parameters = this._paramInjector.buildParameters(patternMatcher, responseHandler, operation, req);
action = operation.action;
header = operation.produces;
if (header) {
res.setHeader(jec_commons_1.HttpHeader.CONTENT_TYPE, header);
}
header = operation.crossDomainPolicy;
if (header) {
res.setHeader(jec_commons_1.HttpHeader.ACCESS_CONTROL_ALLOW_ORIGIN, header);
}
action.apply(this._resource, parameters);
}
else {
exit(req, res.sendStatus(operationStatus), null);
}
}
else {
this.doNotFound(req, res, exit);
}
}
getResource() {
return this._resource;
}
setResource(resource) {
const mapperBuilder = UrlPatternMapperBuilder_1.UrlPatternMapperBuilder.getInstance();
const descriptor = resource.getResourceDescriptor();
const resourceName = resource.constructor.name;
let message = null;
if (!descriptor) {
message = SandcatLocaleManager_1.SandcatLocaleManager.getInstance()
.get("errors.descriptor", resourceName);
SandcatLoggerProxy_1.SandcatLoggerProxy.getInstance().log(message);
throw new SandcatError_1.SandcatError(message);
}
this._resource = resource;
this._name = resourceName;
this._urlPatterns = descriptor.urlPatterns;
this._urlPatternMapper = mapperBuilder.build(descriptor);
}
getUrlPatterns() {
return this._urlPatterns;
}
getName() {
return this._name;
}
init() {
this.processJsletOperation(JsletMethod_1.JsletMethod.INIT);
}
destroy() {
this.processJsletOperation(JsletMethod_1.JsletMethod.DESTROY);
}
before() {
this.processJsletOperation(JsletMethod_1.JsletMethod.BEFORE);
}
after() {
this.processJsletOperation(JsletMethod_1.JsletMethod.AFTER);
}
doDelete(req, res, exit) {
this.processOperation(jec_commons_1.HttpMethod.DELETE, req, res, exit);
}
doGet(req, res, exit) {
this.processOperation(jec_commons_1.HttpMethod.GET, req, res, exit);
}
doOptions(req, res, exit) {
this.processOperation(jec_commons_1.HttpMethod.OPTIONS, req, res, exit);
}
doTrace(req, res, exit) {
this.processOperation(jec_commons_1.HttpMethod.TRACE, req, res, exit);
}
doHead(req, res, exit) {
this.processOperation(jec_commons_1.HttpMethod.HEAD, req, res, exit);
}
doConnect(req, res, exit) {
this.processOperation(jec_commons_1.HttpMethod.CONNECT, req, res, exit);
}
doPut(req, res, exit) {
this.processOperation(jec_commons_1.HttpMethod.PUT, req, res, exit);
}
doPost(req, res, exit) {
this.processOperation(jec_commons_1.HttpMethod.POST, req, res, exit);
}
}
exports.SandcatResourceJsletProxy = SandcatResourceJsletProxy;