Instantly share code, notes, and snippets.
Created
June 23, 2020 10:00
-
Star
(0)
0
You must be signed in to star a gist -
Fork
(0)
0
You must be signed in to fork a gist
-
Save kdeenanauth/13ebecfd73eb71eef4bcf2b6d3fcc605 to your computer and use it in GitHub Desktop.
Example of custom TSOA template to create separate express servers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* tslint:disable */ | |
/* eslint-disable */ | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
{{#if canImportByAlias}} | |
import { Controller, ValidationService, FieldErrors, ValidateError, TsoaRoute, HttpStatusCodeLiteral, TsoaResponse } from 'tsoa'; | |
{{else}} | |
import { Controller, ValidationService, FieldErrors, ValidateError, TsoaRoute, HttpStatusCodeLiteral, TsoaResponse } from '../../../src'; | |
{{/if}} | |
{{#each controllers}} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
import { {{name}} } from '{{modulePath}}'; | |
{{/each}} | |
{{#if authenticationModule}} | |
import { expressAuthentication } from '{{authenticationModule}}'; | |
{{/if}} | |
{{#if iocModule}} | |
import { iocContainer } from '{{iocModule}}'; | |
{{/if}} | |
import * as express from 'express'; | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
const models: TsoaRoute.Models = { | |
{{#each models}} | |
"{{@key}}": { | |
{{#if enums}} | |
"dataType": "refEnum", | |
"enums": {{{json enums}}}, | |
{{/if}} | |
{{#if properties}} | |
"dataType": "refObject", | |
"properties": { | |
{{#each properties}} | |
"{{@key}}": {{{json this}}}, | |
{{/each}} | |
}, | |
"additionalProperties": {{{json additionalProperties}}}, | |
{{/if}} | |
{{#if type}} | |
"dataType": "refAlias", | |
"type": {{{json type}}}, | |
{{/if}} | |
}, | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
{{/each}} | |
}; | |
const validationService = new ValidationService(models); | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
{{#each controllers}} | |
export function Register{{name}}Routes(app: express.Express) { | |
// ########################################################################################################### | |
// NOTE: If you do not see routes for all of your controllers in this file, then you might not have informed tsoa of where to look | |
// Please look into the "controllerPathGlobs" config option described in the readme: https://github.com/lukeautry/tsoa | |
// ########################################################################################################### | |
{{#each actions}} | |
app.{{method}}('{{fullPath}}', | |
{{#if security.length}} | |
authenticateMiddleware({{json security}}), | |
{{/if}} | |
function (request: any, response: any, next: any) { | |
const args = { | |
{{#each parameters}} | |
{{@key}}: {{{json this}}}, | |
{{/each}} | |
}; | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
let validatedArgs: any[] = []; | |
try { | |
validatedArgs = getValidatedArgs(args, request, response); | |
} catch (err) { | |
return next(err); | |
} | |
{{#if ../../iocModule}} | |
const controller: any = iocContainer.get<{{../name}}>({{../name}}); | |
if (typeof controller['setStatus'] === 'function') { | |
controller.setStatus(undefined); | |
} | |
{{else}} | |
const controller = new {{../name}}(); | |
{{/if}} | |
const promise = controller.{{name}}.apply(controller, validatedArgs as any); | |
promiseHandler(controller, promise, response, next); | |
}); | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
{{/each}} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
} | |
{{/each}} | |
function getValidatedArgs(args: any, request: any, response: any): any[] { | |
const fieldErrors: FieldErrors = {}; | |
const values = Object.keys(args).map((key) => { | |
const name = args[key].name; | |
switch (args[key].in) { | |
case 'request': | |
return request; | |
case 'query': | |
return validationService.ValidateParam(args[key], request.query[name], name, fieldErrors, undefined, {{{json minimalSwaggerConfig}}}); | |
case 'path': | |
return validationService.ValidateParam(args[key], request.params[name], name, fieldErrors, undefined, {{{json minimalSwaggerConfig}}}); | |
case 'header': | |
return validationService.ValidateParam(args[key], request.header(name), name, fieldErrors, undefined, {{{json minimalSwaggerConfig}}}); | |
case 'body': | |
return validationService.ValidateParam(args[key], request.body, name, fieldErrors, undefined, {{{json minimalSwaggerConfig}}}); | |
case 'body-prop': | |
return validationService.ValidateParam(args[key], request.body[name], name, fieldErrors, 'body.', {{{json minimalSwaggerConfig}}}); | |
case 'res': | |
return responder(response); | |
} | |
}); | |
if (Object.keys(fieldErrors).length > 0) { | |
throw new ValidateError(fieldErrors, ''); | |
} | |
return values; | |
} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
function returnHandler(response: any, statusCode?: number, data?: any, headers: any = {}) { | |
Object.keys(headers).forEach((name: string) => { | |
response.set(name, headers[name]); | |
}); | |
if (data && typeof data.pipe === 'function' && data.readable && typeof data._read === 'function') { | |
data.pipe(response); | |
} else if (data || data === false) { // === false allows boolean result | |
response.status(statusCode || 200).json(data); | |
} else { | |
response.status(statusCode || 204).end(); | |
} | |
} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
function responder(response: any): TsoaResponse<HttpStatusCodeLiteral, unknown> { | |
return function(status, data, headers) { | |
returnHandler(response, status, data, headers); | |
}; | |
}; | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
function isController(object: any): object is Controller { | |
return 'getHeaders' in object && 'getStatus' in object && 'setStatus' in object; | |
} | |
function promiseHandler(controllerObj: any, promise: any, response: any, next: any) { | |
return Promise.resolve(promise) | |
.then((data: any) => { | |
let statusCode; | |
let headers; | |
if (isController(controllerObj)) { | |
headers = controllerObj.getHeaders(); | |
statusCode = controllerObj.getStatus(); | |
} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
returnHandler(response, statusCode, data, headers) | |
}) | |
.catch((error: any) => next(error)); | |
} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
{{#if useSecurity}} | |
function authenticateMiddleware(security: TsoaRoute.Security[] = []) { | |
return (request: any, _response: any, next: any) => { | |
let responded = 0; | |
let success = false; | |
const succeed = function(user: any) { | |
if (!success) { | |
success = true; | |
responded++; | |
request['user'] = user; | |
next(); | |
} | |
} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
const fail = function(error: any) { | |
responded++; | |
if (responded == security.length && !success) { | |
error.status = error.status || 401; | |
next(error) | |
} | |
} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa | |
for (const secMethod of security) { | |
if (Object.keys(secMethod).length > 1) { | |
let promises: Promise<any>[] = []; | |
for (const name in secMethod) { | |
promises.push(expressAuthentication(request, name, secMethod[name])); | |
} | |
Promise.all(promises) | |
.then((users) => { succeed(users[0]); }) | |
.catch(fail); | |
} else { | |
for (const name in secMethod) { | |
expressAuthentication(request, name, secMethod[name]) | |
.then(succeed) | |
.catch(fail); | |
} | |
} | |
} | |
} | |
} | |
{{/if}} | |
// WARNING: This file was auto-generated with tsoa. Please do not modify it. Re-run tsoa to re-generate this file: https://github.com/lukeautry/tsoa |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment