UNPKG

@elsikora/nestjs-crud-automator

Version:

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

125 lines (122 loc) 7.41 kB
import '../../../../enum/decorator/api/action.enum.js'; import '../../../../enum/decorator/api/authentication-type.enum.js'; import '../../../../enum/decorator/api/controller/get-list/query/filter/missing-behavior.enum.js'; import '../../../../enum/decorator/api/controller/get-list/query/unlisted-fields.enum.js'; import '../../../../enum/decorator/api/controller/relation-reference-shape.enum.js'; import '../../../../enum/decorator/api/controller/request/target.enum.js'; import '../../../../enum/decorator/api/controller/request/transformer-type.enum.js'; import '../../../../enum/decorator/api/controller/response-target.enum.js'; import { EApiDtoType } from '../../../../enum/decorator/api/dto-type.enum.js'; import '../../../../enum/decorator/api/function/context-storage-kind.enum.js'; import '../../../../enum/decorator/api/function/subscriber-transaction-expectation.enum.js'; import '../../../../enum/decorator/api/function/transaction/event-status.enum.js'; import '../../../../enum/decorator/api/function/transaction/failure-stage.enum.js'; import '../../../../enum/decorator/api/function/transaction/mode.enum.js'; import '../../../../enum/decorator/api/function/transaction/outcome.enum.js'; import '../../../../enum/decorator/api/function/transaction/owner-kind.enum.js'; import '../../../../enum/decorator/api/function/transaction/trace-type.enum.js'; import '../../../../enum/decorator/api/function/type.enum.js'; import '../../../../enum/decorator/api/on-type.enum.js'; import '../../../../enum/decorator/api/property/data-type.enum.js'; import '../../../../enum/decorator/api/property/date/identifier.enum.js'; import '../../../../enum/decorator/api/property/date/type.enum.js'; import '../../../../enum/decorator/api/property/desribe-type.enum.js'; import '../../../../enum/decorator/api/property/number-type.enum.js'; import '../../../../enum/decorator/api/property/string-type.enum.js'; import '../../../../enum/decorator/api/route/subscriber-authorization-expectation.enum.js'; import { EApiRouteType } from '../../../../enum/decorator/api/route/type.enum.js'; import { CamelCaseString } from '../../../camel-case-string.utility.js'; import '../../../../constant/utility/dto/constant.js'; import { DtoGenerate } from '../../../dto/generate/core.utility.js'; import '@nestjs/swagger'; import '../../../../external/tslib/tslib.es6.js'; import '../../../../class/utility/dto/exception/details/foreign-key-violation.class.js'; import '../../../../class/utility/dto/exception/details/unique-violation.class.js'; import '../../../../enum/utility/manual-dto-property-metadata-decorator.enum.js'; import '@nestjs/common'; import 'class-transformer'; import 'class-validator'; import 'lodash/random.js'; import '@nestjs/swagger/dist/constants.js'; import '../../../../validator/must-match-one-of-schemas.validator.js'; import '../../../../constant/interface/api/property/default-string-format.constant.js'; import '../../../../validator/is-regular-expression.validator.js'; import 'node:crypto'; import '../../../../enum/utility/exception-details-type.enum.js'; import '../../../../enum/filter/operand.enum.js'; import '../../../../enum/filter/operation.enum.js'; import '../../../../enum/filter/order-direction.enum.js'; import { DtoGenerateGetListResponse } from '../../../dto/generate/get-list-response.utility.js'; import '../../../../constant/decorator/api/function.constant.js'; import 'typeorm'; import 'reflect-metadata'; import '../../../../validator/all-or-none-of-listed-properties.validator.js'; const getListItemResponseDtoCache = new Map(); /** * Resolves a DTO class for a generated controller route. * Prefers an explicitly configured DTO and falls back to auto-generation. * @param {IApiControllerProperties<E>} properties - Controller configuration * @param {IApiEntity<E>} entity - Entity metadata * @param {R} method - Route type * @param {EApiDtoType} dtoType - DTO kind to resolve * @param {TApiControllerPropertiesRoute<E, R>} routeConfig - Route-specific configuration * @param {IApiControllerGetListQueryPlan} [queryPlan] - Route-scoped plan for dynamic GET_LIST QUERY DTO generation. * @returns {Type<unknown> | undefined} -The resolved DTO class or undefined if no DTO is configured * @template E - Entity type * @template R - Route type */ function ApiControllerGetDto(properties, entity, method, dtoType, routeConfig, queryPlan) { const configuredDto = routeConfig.dto?.[dtoType]; if (configuredDto) { if (method === EApiRouteType.GET_LIST && dtoType === EApiDtoType.RESPONSE && isGetListResponseDtoConfig(configuredDto)) { return getGetListItemResponseDto(properties.entity, entity, configuredDto, method, dtoType); } return configuredDto; } const effectiveQueryPlan = method === EApiRouteType.GET_LIST && dtoType === EApiDtoType.QUERY ? queryPlan : undefined; return DtoGenerate(properties.entity, entity, method, dtoType, routeConfig.autoDto?.[dtoType], routeConfig.security?.authentication?.guard, effectiveQueryPlan); } /** * Builds a stable generated wrapper class name for GET_LIST custom item response DTOs. * @param {IApiEntity<E>} entity - Entity metadata used for the resource name. * @param {IApiControllerPropertiesRouteGetListResponseDtoConfig} config - Custom item response DTO config. * @param {EApiRouteType} method - Current route type. * @param {EApiDtoType} dtoType - Current DTO type. * @returns {string} Generated wrapper DTO class name. * @template E - Entity type. */ function buildGetListItemResponseDtoName(entity, config, method, dtoType) { return config.name ?? `${entity.name ?? "UnknownResource"}${CamelCaseString(method)}${CamelCaseString(dtoType)}${config.itemType.name}`; } /** * Generates or returns a cached list wrapper around a configured custom item response DTO. * @param {ObjectLiteral} resourceClass - Entity class used for wrapper metadata. * @param {IApiEntity<E>} entity - Entity metadata used for naming. * @param {IApiControllerPropertiesRouteGetListResponseDtoConfig} config - Custom item response DTO config. * @param {EApiRouteType} method - Current route type. * @param {EApiDtoType} dtoType - Current DTO type. * @returns {Type<unknown>} Generated list wrapper DTO class. * @template E - Entity type. */ function getGetListItemResponseDto(resourceClass, entity, config, method, dtoType) { const name = buildGetListItemResponseDtoName(entity, config, method, dtoType); const cacheKey = `${entity.name ?? "UnknownResource"}_${config.itemType.name}_${name}`; const cached = getListItemResponseDtoCache.get(cacheKey); if (cached) { return cached; } // @ts-ignore The existing list wrapper generator accepts the entity constructor at runtime. const dto = DtoGenerateGetListResponse(resourceClass, config.itemType, name); getListItemResponseDtoCache.set(cacheKey, dto); return dto; } /** * Returns whether a route response DTO config describes a custom GET_LIST item DTO. * @param {IApiControllerPropertiesRouteGetListResponseDtoConfig | Type<unknown>} value - Configured response DTO value. * @returns {boolean} Whether the value is the item DTO config shape. */ function isGetListResponseDtoConfig(value) { return typeof value === "object" && "itemType" in value && typeof value.itemType === "function"; } export { ApiControllerGetDto }; //# sourceMappingURL=dto.utility.js.map