Skip to content

Commit

Permalink
refactor: isController function & apiHandler
Browse files Browse the repository at this point in the history
  • Loading branch information
jackey8616 committed Feb 3, 2024
1 parent 845981e commit 6d9c598
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 58 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Request as ExRequest, Response as ExResponse, NextFunction as ExNext } from 'express';
import { Controller, FieldErrors, TsoaRoute, ValidateError } from '@tsoa/runtime';

import { TemplateService, isController } from '../templateService';
import { TemplateService } from '../templateService';

type ExpressApiHandlerParameters = {
methodName: string;
Expand Down Expand Up @@ -33,22 +33,23 @@ export class ExpressTemplateService extends TemplateService<ExpressApiHandlerPar
super(models);
}

apiHandler(params: ExpressApiHandlerParameters) {
async apiHandler(params: ExpressApiHandlerParameters) {
const { methodName, controller, response, validatedArgs, successStatus, next } = params;
const promise = this.buildPromise(methodName, controller, validatedArgs);

return Promise.resolve(promise)
.then((data: any) => {
let statusCode = successStatus;
let headers;
if (isController(controller)) {
headers = controller.getHeaders();
statusCode = controller.getStatus() || statusCode;
}
try {
const data = await Promise.resolve(promise);
let statusCode = successStatus;
let headers;
if (this.isController(controller)) {
headers = controller.getHeaders();
statusCode = controller.getStatus() || statusCode;
}

this.returnHandler({ response, headers, statusCode, data });
})
.catch((error: any) => next(error));
this.returnHandler({ response, headers, statusCode, data });
} catch (error) {
return next(error);
}
}

getValidatedArgs(params: ExpressValidationArgsParameters): any[] {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Request as HRequest, ResponseToolkit as HResponse } from '@hapi/hapi';
import { boomify, isBoom, type Payload } from '@hapi/boom';
import { Controller, FieldErrors, TsoaRoute, ValidateError } from '@tsoa/runtime';

import { isController, TemplateService } from '../templateService';
import { TemplateService } from '../templateService';

const hapiTsoaResponsed = Symbol('@tsoa:template_service:hapi:responsed');

Expand Down Expand Up @@ -35,34 +35,33 @@ export class HapiTemplateService extends TemplateService<HapiApiHandlerParameter
super(models);
}

apiHandler(params: HapiApiHandlerParameters) {
async apiHandler(params: HapiApiHandlerParameters) {
const { methodName, controller, h, validatedArgs, successStatus } = params;
const promise = this.buildPromise(methodName, controller, validatedArgs);

return Promise.resolve(promise)
.then((data: any) => {
let statusCode = successStatus;
let headers;
try {
const data = await Promise.resolve(promise);
let statusCode = successStatus;
let headers;

if (isController(controller)) {
headers = controller.getHeaders();
statusCode = controller.getStatus() || statusCode;
}
return this.returnHandler({ h, headers, statusCode, data });
})
.catch((error: any) => {
if (isBoom(error)) {
throw error;
}
if (this.isController(controller)) {
headers = controller.getHeaders();
statusCode = controller.getStatus() || statusCode;
}
return this.returnHandler({ h, headers, statusCode, data });
} catch (error: any) {
if (isBoom(error)) {
throw error;
}

const boomErr = boomify(error instanceof Error ? error : new Error(error.message));
boomErr.output.statusCode = error.status || 500;
boomErr.output.payload = {
name: error.name,
message: error.message,
} as unknown as Payload;
throw boomErr;
});
const boomErr = boomify(error instanceof Error ? error : new Error(error.message));
boomErr.output.statusCode = error.status || 500;
boomErr.output.payload = {
name: error.name,
message: error.message,
} as unknown as Payload;
throw boomErr;
}
}

getValidatedArgs(params: HapiValidationArgsParameters): any[] {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Context, Next } from 'koa';
import { Controller, FieldErrors, TsoaRoute, ValidateError } from '@tsoa/runtime';

import { TemplateService, isController } from '../templateService';
import { TemplateService } from '../templateService';

const koaTsoaResponsed = Symbol('@tsoa:template_service:koa:is_responsed');

Expand Down Expand Up @@ -35,25 +35,24 @@ export class KoaTemplateService extends TemplateService<KoaApiHandlerParameters,
super(models);
}

apiHandler(params: KoaApiHandlerParameters) {
async apiHandler(params: KoaApiHandlerParameters) {
const { methodName, controller, context, validatedArgs, successStatus } = params;
const promise = this.buildPromise(methodName, controller, validatedArgs);

return Promise.resolve(promise)
.then((data: any) => {
let statusCode = successStatus;
let headers;
try {
const data = await Promise.resolve(promise);
let statusCode = successStatus;
let headers;

if (isController(controller)) {
headers = controller.getHeaders();
statusCode = controller.getStatus() || statusCode;
}
return this.returnHandler({ context, headers, statusCode, data });
})
.catch((error: any) => {
context.status = error.status || 500;
context.throw(context.status, error.message, error);
});
if (this.isController(controller)) {
headers = controller.getHeaders();
statusCode = controller.getStatus() || statusCode;
}
return this.returnHandler({ context, headers, statusCode, data });
} catch (error: any) {
context.status = error.status || 500;
context.throw(context.status, error.message, error);
}
}

getValidatedArgs(params: KoaValidationArgsParameters): any[] {
Expand Down
10 changes: 5 additions & 5 deletions packages/cli/src/routeGeneration/templates/templateService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,19 @@ export abstract class TemplateService<ApiHandlerParameters, ValidationArgsParame
this.validationService = new ValidationService(models);
}

abstract apiHandler(params: ApiHandlerParameters): any;
abstract apiHandler(params: ApiHandlerParameters): Promise<any>;

abstract getValidatedArgs(params: ValidationArgsParameters): any[];

protected abstract returnHandler(params: ReturnHandlerParameters): any;

protected isController(object: Controller | Object): object is Controller {
return 'getHeaders' in object && 'getStatus' in object && 'setStatus' in object;
}

protected buildPromise(methodName: string, controller: Controller | Object, validatedArgs: any) {
const prototype = Object.getPrototypeOf(controller);
const descriptor = Object.getOwnPropertyDescriptor(prototype, methodName);
return descriptor!.value.apply(controller, validatedArgs);
}
}

export function isController(object: any): object is Controller {
return 'getHeaders' in object && 'getStatus' in object && 'setStatus' in object;
}

0 comments on commit 6d9c598

Please sign in to comment.