UNPKG

@elsikora/nestjs-crud-automator

Version:

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

114 lines (110 loc) 6.63 kB
'use strict'; var node_crypto = require('node:crypto'); 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 NO_READ_PLAN = Object.freeze({}); const identityParametersDtoCache = new WeakMap(); /** * Generates a PARAMETERS DTO for a GET identity alias and optional inherited read scope. * @param {IApiEntity<E>} entityMetadata - Entity metadata supplying field decorators. * @param {IApiControllerIdentityPlan} identityPlan - Compiled identity alias plan. * @param {IApiControllerReadPlan} [readPlan] - Optional compiled owner-scope plan. * @param {IApiControllerPropertiesRouteAutoDtoConfig} [dtoConfig] - Auto DTO validators. * @param {Type<IAuthGuard>} [currentGuard] - Route authentication guard. * @returns {Type<unknown>} Generated PARAMETERS DTO. * @template E - Entity type. */ function DtoGenerateIdentityReadParameters(entityMetadata, identityPlan, readPlan, dtoConfig, currentGuard) { let readPlanCache = identityParametersDtoCache.get(identityPlan); if (!readPlanCache) { readPlanCache = new WeakMap(); identityParametersDtoCache.set(identityPlan, readPlanCache); } const readPlanKey = readPlan ?? NO_READ_PLAN; let guardCache = readPlanCache.get(readPlanKey); if (!guardCache) { guardCache = new Map(); readPlanCache.set(readPlanKey, 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 = [{ field: identityPlan.field, parameter: identityPlan.parameter }, ...(readPlan?.parameters ?? [])]; class GeneratedIdentityReadParametersDTO { 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, }); } } } const combinedSignature = readPlan ? node_crypto.createHash("sha256").update(identityPlan.signature).update(":").update(readPlan.signature).digest("hex") : undefined; const schemaName = readPlan ? `${identityPlan.controllerName}${entityMetadata.name ?? "UnknownResource"}GetParameters${combinedSignature}DTO` : identityPlan.schemaName; Object.defineProperty(GeneratedIdentityReadParametersDTO, "name", { value: 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 identity/read field ${parameter.field} not found`); } const decorators = buildDecorator_utility.DtoBuildDecorator(type_enum.EApiRouteType.GET, metadata, entityMetadata, dtoType_enum.EApiDtoType.PARAMETERS, parameter.parameter, currentGuard); if (decorators) { for (const decorator of decorators) { decorator(GeneratedIdentityReadParametersDTO.prototype, parameter.parameter); } } } if (dtoConfig?.validators) { for (const validator of dtoConfig.validators) { classValidator.Validate(validator.constraintClass, validator.options)(GeneratedIdentityReadParametersDTO.prototype, "object"); } } dtoConfigCache.set(dtoConfig, GeneratedIdentityReadParametersDTO); return GeneratedIdentityReadParametersDTO; } exports.DtoGenerateIdentityReadParameters = DtoGenerateIdentityReadParameters; //# sourceMappingURL=identity-read-parameters.utility.js.map