feature(): use metadata cache for headers and status code

This commit is contained in:
Kamil Myśliwiec
2019-04-10 12:52:40 +02:00
parent 1dfc81459c
commit 0712346adc
6 changed files with 35 additions and 30 deletions

View File

@@ -30,8 +30,7 @@ export class TransformInterceptor {
@Injectable()
export class StatusInterceptor {
constructor(private statusCode: number){}
constructor(private statusCode: number) {}
intercept(context: ExecutionContext, next: CallHandler) {
const ctx = context.switchToHttp();
@@ -43,8 +42,7 @@ export class StatusInterceptor {
@Injectable()
export class HeaderInterceptor {
constructor(private headers: object){}
constructor(private headers: object) {}
intercept(context: ExecutionContext, next: CallHandler) {
const ctx = context.switchToHttp();

View File

@@ -1,6 +1,6 @@
import { HelloService } from './hello.service';
import { Controller, Get, Header, Param, Post } from '@nestjs/common';
import { Controller, Get, Header, Param } from '@nestjs/common';
import { Observable, of } from 'rxjs';
import { HelloService } from './hello.service';
import { UserByIdPipe } from './users/user-by-id.pipe';
@Controller('hello')

View File

@@ -7,6 +7,9 @@ export const HANDLER_METADATA_SYMBOL = Symbol.for('handler_metadata:cache');
export interface HandlerMetadata {
argsLength: number;
paramtypes: any[];
httpStatusCode: number;
responseHeaders: any[];
hasCustomHeaders: boolean;
getParamsMetadata: (
moduleKey: string,
contextId?: ContextId,

View File

@@ -83,7 +83,11 @@ export class RouterExecutionContext {
fnHandleResponse,
paramtypes,
getParamsMetadata,
} = this.getMetadata(instance, callback, methodName, module);
httpStatusCode,
responseHeaders,
hasCustomHeaders,
} = this.getMetadata(instance, callback, methodName, module, requestMethod);
const paramsOptions = this.contextUtils.mergeParamsMetatypes(
getParamsMetadata(module, contextId, inquirerId),
paramtypes,
@@ -131,17 +135,7 @@ export class RouterExecutionContext {
const args = this.contextUtils.createNullArray(argsLength);
fnCanActivate && (await fnCanActivate([req, res]));
const httpCode = this.reflectHttpStatusCode(callback);
const httpStatusCode = httpCode
? httpCode
: this.responseController.getStatusByMethod(requestMethod);
this.responseController.status(res, httpStatusCode);
const responseHeaders = this.reflectResponseHeaders(callback);
const hasCustomHeaders = !isEmpty(responseHeaders);
this.responseController.setStatus(res, httpStatusCode);
hasCustomHeaders &&
this.responseController.setHeaders(res, responseHeaders);
@@ -160,7 +154,8 @@ export class RouterExecutionContext {
instance: Controller,
callback: (...args: any[]) => any,
methodName: string,
module: string
module: string,
requestMethod: RequestMethod,
): HandlerMetadata {
const cacheMetadata = this.handlerMetadataStorage.get(instance, methodName);
if (cacheMetadata) {
@@ -199,13 +194,25 @@ export class RouterExecutionContext {
const fnHandleResponse = this.createHandleResponseFn(
callback,
isResponseHandled
isResponseHandled,
);
const httpCode = this.reflectHttpStatusCode(callback);
const httpStatusCode = httpCode
? httpCode
: this.responseController.getStatusByMethod(requestMethod);
const responseHeaders = this.reflectResponseHeaders(callback);
const hasCustomHeaders = !isEmpty(responseHeaders);
const handlerMetadata: HandlerMetadata = {
argsLength,
fnHandleResponse,
paramtypes,
getParamsMetadata,
httpStatusCode,
hasCustomHeaders,
responseHeaders,
};
this.handlerMetadataStorage.set(instance, methodName, handlerMetadata);
return handlerMetadata;
@@ -350,7 +357,7 @@ export class RouterExecutionContext {
public createHandleResponseFn(
callback: (...args: any[]) => any,
isResponseHandled: boolean,
httpStatusCode?: number
httpStatusCode?: number,
) {
const renderTemplate = this.reflectRenderTemplate(callback);

View File

@@ -51,10 +51,7 @@ export class RouterResponseController {
);
}
public status<TResponse = any>(
response: TResponse,
statusCode: number
) {
public setStatus<TResponse = any>(response: TResponse, statusCode: number) {
this.applicationRef.status(response, statusCode);
}
}

View File

@@ -35,7 +35,9 @@ describe('RouterResponseController', () => {
if (isNil(body)) {
return responseRef.send();
}
return isObject(body) ? responseRef.json(body) : responseRef.send(String(body));
return isObject(body)
? responseRef.json(body)
: responseRef.send(String(body));
});
});
describe('nil', () => {
@@ -162,10 +164,8 @@ describe('RouterResponseController', () => {
const response = {};
const statusCode = 400;
routerResponseController.status(response, statusCode);
expect(
statusStub.calledWith(response, statusCode),
).to.be.true;
routerResponseController.setStatus(response, statusCode);
expect(statusStub.calledWith(response, statusCode)).to.be.true;
});
});
});