UNPKG

@elsikora/nestjs-crud-automator

Version:

A library for automating the creation of CRUD operations in NestJS.

112 lines (108 loc) 6.22 kB
'use strict'; require('../../../constant/decorator/api/function.constant.js'); var propertyDescribe_constant = require('../../../constant/decorator/api/property-describe.constant.js'); require('../../../enum/decorator/api/action.enum.js'); require('../../../enum/decorator/api/authentication-type.enum.js'); require('../../../enum/decorator/api/controller/get-list/query/filter/missing-behavior.enum.js'); require('../../../enum/decorator/api/controller/get-list/query/pagination-mode.enum.js'); require('../../../enum/decorator/api/controller/get-list/query/unlisted-fields.enum.js'); require('../../../enum/decorator/api/controller/relation-reference-shape.enum.js'); require('../../../enum/decorator/api/controller/request/target.enum.js'); require('../../../enum/decorator/api/controller/request/transformer-type.enum.js'); require('../../../enum/decorator/api/controller/response-target.enum.js'); var dtoType_enum = require('../../../enum/decorator/api/dto-type.enum.js'); require('../../../enum/decorator/api/function/context-storage-kind.enum.js'); require('../../../enum/decorator/api/function/subscriber-transaction-expectation.enum.js'); require('../../../enum/decorator/api/function/transaction/event-status.enum.js'); require('../../../enum/decorator/api/function/transaction/failure-stage.enum.js'); require('../../../enum/decorator/api/function/transaction/mode.enum.js'); require('../../../enum/decorator/api/function/transaction/outcome.enum.js'); require('../../../enum/decorator/api/function/transaction/owner-kind.enum.js'); require('../../../enum/decorator/api/function/transaction/trace-type.enum.js'); require('../../../enum/decorator/api/function/type.enum.js'); require('../../../enum/decorator/api/on-type.enum.js'); require('../../../enum/decorator/api/property/data-type.enum.js'); require('../../../enum/decorator/api/property/date/identifier.enum.js'); require('../../../enum/decorator/api/property/date/type.enum.js'); require('../../../enum/decorator/api/property/desribe-type.enum.js'); require('../../../enum/decorator/api/property/number-type.enum.js'); require('../../../enum/decorator/api/property/string-type.enum.js'); require('../../../enum/decorator/api/route/subscriber-authorization-expectation.enum.js'); var type_enum = require('../../../enum/decorator/api/route/type.enum.js'); var buildDecorator_utility = require('../build-decorator.utility.js'); var exception_utility = require('../../error/exception.utility.js'); var classValidator = require('class-validator'); const readParametersDtoCache = new WeakMap(); /** * Generates a cached PARAMETERS DTO for route-local inherited read scope. * @template E - Entity type owned by the generated route. * @param {IApiEntity<E>} entityMetadata - Entity metadata used for field decorators. * @param {EApiRouteType} method - Generated GET or GET_LIST route type. * @param {IApiControllerReadPlan} readPlan - Validated route-local read plan. * @param {IApiControllerPropertiesRouteAutoDtoConfig} [dtoConfig] - Optional auto DTO validators. * @param {Type<IAuthGuard>} [currentGuard] - Authentication guard used for field exposure metadata. * @returns {Type<unknown>} Cached generated parameters DTO class. */ function DtoGenerateReadParameters(entityMetadata, method, readPlan, dtoConfig, currentGuard) { let guardCache = readParametersDtoCache.get(readPlan); if (!guardCache) { guardCache = new Map(); readParametersDtoCache.set(readPlan, guardCache); } let dtoConfigCache = guardCache.get(currentGuard); if (!dtoConfigCache) { dtoConfigCache = new Map(); guardCache.set(currentGuard, dtoConfigCache); } const cached = dtoConfigCache.get(dtoConfig); if (cached) { return cached; } const parameters = []; if (method === type_enum.EApiRouteType.GET) { const primaryKey = entityMetadata.primaryKey; if (!primaryKey) { throw exception_utility.ErrorException(`Primary key for entity ${String(entityMetadata.name)} not found in metadata storage`); } parameters.push({ field: String(primaryKey.name), parameter: String(primaryKey.name) }); } parameters.push(...readPlan.parameters); class GeneratedReadParametersDTO { constructor() { for (const parameter of parameters) { Object.defineProperty(this, parameter.parameter, { // eslint-disable-next-line @elsikora/typescript/naming-convention configurable: true, // eslint-disable-next-line @elsikora/typescript/naming-convention enumerable: true, value: undefined, // eslint-disable-next-line @elsikora/typescript/naming-convention writable: true, }); } } } Object.defineProperty(GeneratedReadParametersDTO, "name", { value: readPlan.schemaName }); for (const parameter of parameters) { const column = entityMetadata.columns.find((candidate) => String(candidate.name) === parameter.field); const metadata = column?.metadata?.[propertyDescribe_constant.PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT.METADATA_KEY]; if (!column || !metadata) { throw exception_utility.ErrorException(`Metadata for generated read scope field ${parameter.field} not found`); } const decorators = buildDecorator_utility.DtoBuildDecorator(method, metadata, entityMetadata, dtoType_enum.EApiDtoType.PARAMETERS, parameter.parameter, currentGuard); if (decorators) { for (const decorator of decorators) { decorator(GeneratedReadParametersDTO.prototype, parameter.parameter); } } } if (dtoConfig?.validators) { for (const validator of dtoConfig.validators) { classValidator.Validate(validator.constraintClass, validator.options)(GeneratedReadParametersDTO.prototype, "object"); } } dtoConfigCache.set(dtoConfig, GeneratedReadParametersDTO); return GeneratedReadParametersDTO; } exports.DtoGenerateReadParameters = DtoGenerateReadParameters; //# sourceMappingURL=read-parameters.utility.js.map