From 7701b76b8f0417087b7b15e9b5eeed5baa199df5 Mon Sep 17 00:00:00 2001 From: sahachide Date: Wed, 21 Oct 2020 18:58:06 +0200 Subject: [PATCH] feat: add @body context annotation --- src/decorators/context.ts | 6 ++++ src/decorators/index.ts | 1 + src/dependencies/Injector.ts | 4 ++- .../InjectorAction/BodyContextAction.ts | 29 +++++++++++++++++++ src/types/enums.ts | 1 + 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/decorators/context.ts create mode 100644 src/dependencies/InjectorAction/BodyContextAction.ts diff --git a/src/decorators/context.ts b/src/decorators/context.ts new file mode 100644 index 0000000..4afd889 --- /dev/null +++ b/src/decorators/context.ts @@ -0,0 +1,6 @@ +import type { Class } from 'type-fest' +import { REFLECT_METADATA } from '../types/enums' + +export function body(target: Class, propertyKey: string, parameterIndex: number): void { + Reflect.defineMetadata(REFLECT_METADATA.CONTEXT_BODY, parameterIndex, target, propertyKey) +} diff --git a/src/decorators/index.ts b/src/decorators/index.ts index 4893d97..9a6a5fe 100644 --- a/src/decorators/index.ts +++ b/src/decorators/index.ts @@ -4,3 +4,4 @@ export * from './database' export * from './controller' export * from './redis' export * from './security' +export * from './context' diff --git a/src/dependencies/Injector.ts b/src/dependencies/Injector.ts index afaa482..dcc7053 100644 --- a/src/dependencies/Injector.ts +++ b/src/dependencies/Injector.ts @@ -14,6 +14,7 @@ import type { RequestConfigControllerUser, } from '../types/interfaces' +import { BodyContextAction } from './InjectorAction/BodyContextAction' import type { Class } from 'type-fest' import type { Context } from '../http/Context' import type { ModuleContext } from './ModuleContext' @@ -49,6 +50,7 @@ export class Injector { new RepositoryAction(this), new SecurityProviderAction(this), new SessionAction(this, context, loadedUser, injectedSessions), + new BodyContextAction(this, context), ] let params: InjectorFunctionParameter[] = [] @@ -59,7 +61,7 @@ export class Injector { if (result.length) { params = [...params, ...result.filter((val) => val !== null)] } - } else { + } else if (result) { params.push(result) } } diff --git a/src/dependencies/InjectorAction/BodyContextAction.ts b/src/dependencies/InjectorAction/BodyContextAction.ts new file mode 100644 index 0000000..6f5dcf0 --- /dev/null +++ b/src/dependencies/InjectorAction/BodyContextAction.ts @@ -0,0 +1,29 @@ +import type { GenericControllerInstance, InjectorFunctionParameter } from '../../types/interfaces' + +import { AbstractAction } from './AbstractAction' +import type { Context } from '../../http/Context' +import type { Injector } from '../Injector' +import { REFLECT_METADATA } from '../../types' + +export class BodyContextAction extends AbstractAction { + protected readonly context: Context + + constructor(injector: Injector, context: Context) { + super(injector) + + this.context = context + } + + public run(instance: GenericControllerInstance, method: string): InjectorFunctionParameter { + if (!Reflect.hasMetadata(REFLECT_METADATA.CONTEXT_BODY, instance, method)) { + return + } + + const metadata = Reflect.getMetadata(REFLECT_METADATA.CONTEXT_BODY, instance, method) as number + + return { + index: metadata, + value: this.context.body, + } + } +} diff --git a/src/types/enums.ts b/src/types/enums.ts index 6bf6397..2a2c62a 100644 --- a/src/types/enums.ts +++ b/src/types/enums.ts @@ -30,6 +30,7 @@ export enum ERROR { export enum REFLECT_METADATA { AUTH_PROVIDER = 'authProvider', + CONTEXT_BODY = 'contextBody', CONTROLLER_KEY = 'controllerKey', DATABASE_CONNECTION = 'database:connection', DATABASE_EM = 'database:em',