UNPKG

tsoa-custom-decorators

Version:

Build swagger-compliant REST APIs using TypeScript and Node

147 lines (137 loc) 5.88 kB
/* tslint:disable */ import { ValidateParam } from '../../../src/routeGeneration/templateHelpers'; import { Controller } from '../../../src/interfaces/controller'; import { iocContainer } from './ioc'; import { ManagedController } from './managedController'; const models: any = { "TestModel": { properties: { "numberValue": { "required": true, "typeName": "double" }, "numberArray": { "required": true, "typeName": "array", "array": { "typeName": "double" } }, "stringValue": { "required": true, "typeName": "string" }, "stringArray": { "required": true, "typeName": "array", "array": { "typeName": "string" } }, "boolValue": { "required": true, "typeName": "boolean" }, "boolArray": { "required": true, "typeName": "array", "array": { "typeName": "boolean" } }, "enumValue": { "required": false, "typeName": "enum", "enumMembers": [0, 1] }, "enumArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": [0, 1] } }, "enumStringValue": { "required": false, "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] }, "enumStringArray": { "required": false, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["VALUE_1", "VALUE_2"] } }, "modelValue": { "required": true, "typeName": "TestSubModel" }, "modelsArray": { "required": true, "typeName": "array", "array": { "typeName": "TestSubModel" } }, "strLiteralVal": { "required": true, "typeName": "enum", "enumMembers": ["Foo", "Bar"] }, "strLiteralArr": { "required": true, "typeName": "array", "array": { "typeName": "enum", "enumMembers": ["Foo", "Bar"] } }, "dateValue": { "required": false, "typeName": "datetime" }, "optionalString": { "required": false, "typeName": "string" }, "modelsObjectIndirect": { "required": false, "typeName": "TestSubModelContainer" }, "modelsObjectIndirectNS": { "required": false, "typeName": "TestSubModelContainerNamespace.TestSubModelContainer" }, "modelsObjectIndirectNS2": { "required": false, "typeName": "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2" }, "modelsObjectIndirectNS_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_TestSubModelContainer" }, "modelsObjectIndirectNS2_Alias": { "required": false, "typeName": "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2" }, "id": { "required": true, "typeName": "double" }, }, }, "TestSubModel": { properties: { "email": { "required": true, "typeName": "string" }, "circular": { "required": false, "typeName": "TestModel" }, "id": { "required": true, "typeName": "double" }, }, }, "TestSubModel2": { properties: { "testSubModel2": { "required": true, "typeName": "boolean" }, "email": { "required": true, "typeName": "string" }, "circular": { "required": false, "typeName": "TestModel" }, "id": { "required": true, "typeName": "double" }, }, }, "TestSubModelContainer": { properties: { }, additionalProperties: [ { typeName: 'TestSubModel2' }, ], }, "TestSubModelNamespace.TestSubModelNS": { properties: { "testSubModelNS": { "required": true, "typeName": "boolean" }, "email": { "required": true, "typeName": "string" }, "circular": { "required": false, "typeName": "TestModel" }, "id": { "required": true, "typeName": "double" }, }, }, "TestSubModelContainerNamespace.TestSubModelContainer": { properties: { }, additionalProperties: [ { typeName: 'TestSubModelNamespace.TestSubModelNS' }, ], }, "TestSubModelContainerNamespace.InnerNamespace.TestSubModelContainer2": { properties: { }, additionalProperties: [ { typeName: 'TestSubModelNamespace.TestSubModelNS' }, ], }, "TestSubModelContainerNamespace_TestSubModelContainer": { properties: { }, }, "TestSubModelContainerNamespace_InnerNamespace_TestSubModelContainer2": { properties: { }, }, }; export function RegisterRoutes(app: any) { app.get('/v1/ManagedTest', function(request: any, response: any, next: any) { const args = { }; let validatedArgs: any[] = []; try { validatedArgs = getValidatedArgs(args, request); } catch (err) { return next(err); } const controller = iocContainer.get<ManagedController>(ManagedController); const promise = controller.getModel.apply(controller, validatedArgs); let statusCode = undefined; if (controller instanceof Controller) { statusCode = (controller as Controller).getStatus(); } promiseHandler(promise, statusCode, response, next); }); function promiseHandler(promise: any, statusCode: any, response: any, next: any) { return promise .then((data: any) => { if (data) { response.json(data); response.status(statusCode || 200); } else { response.status(statusCode || 204); response.end(); } }) .catch((error: any) => next(error)); } function getValidatedArgs(args: any, request: any): any[] { return Object.keys(args).map(key => { const name = args[key].name; switch (args[key].in) { case 'request': return request; case 'query': return ValidateParam(args[key], request.query[name], models, name) case 'path': return ValidateParam(args[key], request.params[name], models, name) case 'header': return ValidateParam(args[key], request.header(name), models, name); case 'body': return ValidateParam(args[key], request.body, models, name); case 'body-prop': return ValidateParam(args[key], request.body[name], models, name); } }); } }