|
| 1 | +import { BadRequestException, createParamDecorator, ExecutionContext } from '@nestjs/common'; |
| 2 | +import { plainToClass } from 'class-transformer'; |
| 3 | +import { ClientContext, ClientMetadata } from 'src/common/models'; |
| 4 | +import { sessionFromRequestFactory } from 'src/common/decorators'; |
| 5 | +import { Validator } from 'class-validator'; |
| 6 | +import { API_PARAM_DATABASE_ID } from 'src/common/constants'; |
| 7 | + |
| 8 | +const validator = new Validator(); |
| 9 | + |
| 10 | +export interface IClientMetadataParamOptions { |
| 11 | + databaseIdParam?: string, |
| 12 | + uniqueIdParam?: string, |
| 13 | + context?: ClientContext, |
| 14 | +} |
| 15 | + |
| 16 | +export const clientMetadataParamFactory = ( |
| 17 | + options: IClientMetadataParamOptions, |
| 18 | + ctx: ExecutionContext, |
| 19 | +): ClientMetadata => { |
| 20 | + const opts: IClientMetadataParamOptions = { |
| 21 | + context: ClientContext.Common, |
| 22 | + databaseIdParam: API_PARAM_DATABASE_ID, |
| 23 | + ...options, |
| 24 | + }; |
| 25 | + |
| 26 | + const req = ctx.switchToHttp().getRequest(); |
| 27 | + |
| 28 | + let databaseId; |
| 29 | + if (opts?.databaseIdParam) { |
| 30 | + databaseId = req.params?.[opts.databaseIdParam]; |
| 31 | + } |
| 32 | + |
| 33 | + let uniqueId; |
| 34 | + if (opts?.uniqueIdParam) { |
| 35 | + uniqueId = req.params?.[opts.uniqueIdParam]; |
| 36 | + } |
| 37 | + |
| 38 | + const clientMetadata = plainToClass(ClientMetadata, { |
| 39 | + session: sessionFromRequestFactory(undefined, ctx), |
| 40 | + databaseId, |
| 41 | + uniqueId, |
| 42 | + context: opts?.context || ClientContext.Common, |
| 43 | + }); |
| 44 | + |
| 45 | + const errors = validator.validateSync(clientMetadata, { |
| 46 | + whitelist: false, // we need this to allow additional fields if needed for flexibility |
| 47 | + }); |
| 48 | + |
| 49 | + if (errors?.length) { |
| 50 | + throw new BadRequestException(Object.values(errors[0].constraints) || 'Bad request'); |
| 51 | + } |
| 52 | + |
| 53 | + return clientMetadata; |
| 54 | +}; |
| 55 | + |
| 56 | +export const ClientMetadataParam = createParamDecorator(clientMetadataParamFactory); |
0 commit comments