import express, { NextFunction, Response } from 'express'; import { MetadataKeys } from '../../const'; import { InternalWarpOpts } from '../../interfaces/internalWarpOpts'; import { Request } from '../../interfaces'; export type HandlerParamSelector = ( req: Request, res: Response, next: NextFunction, meta: HandlerParamMeta, opts: InternalWarpOpts ) => T; export interface HandlerParamMeta { index: number; selector: HandlerParamSelector; paramType: any; } export let getHandlerParamMetaList = (controller: any, propertyKey: string): HandlerParamMeta[] => { let metaList = Reflect.getMetadata(MetadataKeys.param, controller, propertyKey); if (metaList == null) return []; return metaList; }; export let setHandlerParamMetaList = (controller: any, meta: HandlerParamMeta[], propertyKey: string) => { Reflect.defineMetadata(MetadataKeys.param, meta, controller, propertyKey); }; export let BaseParam = (selector: HandlerParamSelector) => { return (target: any, propertyKey: string, index: number) => { let previousHandlerParamList = getHandlerParamMetaList(target.constructor, propertyKey); let meta: HandlerParamMeta[] = [ { index, selector, paramType: Reflect.getMetadata('design:paramtypes', target, propertyKey)[index] }, ...previousHandlerParamList ]; setHandlerParamMetaList(target.constructor, meta, propertyKey); }; };