UNPKG

@elsikora/nestjs-crud-automator

Version:

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

122 lines (118 loc) 7.78 kB
'use strict'; var metadataStorage_class = require('../../../../class/metadata-storage.class.js'); 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/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'); var desribeType_enum = 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'); require('../../../../enum/decorator/api/route/type.enum.js'); var constants_js = require('@nestjs/swagger/dist/constants.js'); var dto_utility = require('../get/dto.utility.js'); var camelCaseString_utility = require('../../../camel-case-string.utility.js'); var registerAutoDtoChild_utility = require('../../../register-auto-dto-child.utility.js'); /** * Generates and registers Swagger documentation for DTOs. * Creates or uses existing DTOs for request, query, body, and response, * and ensures they're properly registered with Swagger for API documentation. * @param {object} target - The target controller class * @param {IApiEntity<E>} entity - The entity definition * @param {IApiControllerProperties<E>} properties - Controller configuration properties * @param {EApiRouteType} method - The type of route (CREATE, DELETE, GET, etc.) * @param {TApiControllerPropertiesRoute<E, typeof method>} routeConfig - Route-specific configuration * @param {IApiEntity<E>} entityMetadata - The entity metadata containing column information * @param {IApiControllerGetListQueryPlan} [queryPlan] - Route-scoped plan used by dynamic QUERY DTO generation. * @returns {void} * @template E - The entity type */ function ApiControllerWriteDtoSwagger(target, entity, properties, method, routeConfig, entityMetadata, queryPlan) { const swaggerModels = (Reflect.getMetadata(constants_js.DECORATORS.API_EXTRA_MODELS, target) ?? []); const entityNames = []; if (typeof properties.entity === "function") { let current = properties.entity; while (current) { entityNames.push(current.name); const parentPrototype = Object.getPrototypeOf(current.prototype); const parentConstructor = parentPrototype ? Reflect.get(parentPrototype, "constructor") : undefined; const parent = typeof parentConstructor === "function" ? parentConstructor : undefined; if (!parent || parent === Object) { break; } current = parent; } } else if (properties.entity.name) { entityNames.push(properties.entity.name); } const requestDto = dto_utility.ApiControllerGetDto(properties, entity, method, dtoType_enum.EApiDtoType.PARAMETERS, routeConfig, queryPlan); const queryDto = dto_utility.ApiControllerGetDto(properties, entity, method, dtoType_enum.EApiDtoType.QUERY, routeConfig, queryPlan); const bodyDto = dto_utility.ApiControllerGetDto(properties, entity, method, dtoType_enum.EApiDtoType.BODY, routeConfig, queryPlan); const responseDto = dto_utility.ApiControllerGetDto(properties, entity, method, dtoType_enum.EApiDtoType.RESPONSE, routeConfig, queryPlan); const dtoList = [requestDto, queryDto, bodyDto, responseDto]; for (const dto of dtoList) { for (const swaggerDto of dto ? [dto, ...registerAutoDtoChild_utility.GetRegisteredAutoDtoChildrenRecursive(dto.prototype)] : []) { if (swaggerModels.includes(swaggerDto)) { continue; } swaggerModels.push(swaggerDto); const storage = metadataStorage_class.MetadataStorage.getInstance(); const mergedMetadata = {}; let hasMetadata = false; for (const entityName of entityNames.toReversed()) { const currentMetadata = storage.getMetadata(entityName); if (currentMetadata) { hasMetadata = true; Object.assign(mergedMetadata, currentMetadata); } } const metadata = hasMetadata ? mergedMetadata : undefined; if (metadata) for (const key of Object.keys(metadata)) { if (metadata[key]?.[propertyDescribe_constant.PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT.METADATA_KEY] && metadata[key]?.[propertyDescribe_constant.PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT.METADATA_KEY]?.type === desribeType_enum.EApiPropertyDescribeType.RELATION) { const relationClass = class GeneratedDTO { constructor() { Object.defineProperty(this, "id", { // 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(relationClass, "name", { value: `${String(entityMetadata.name)}${camelCaseString_utility.CamelCaseString(method)}${camelCaseString_utility.CamelCaseString(dtoType_enum.EApiDtoType.BODY)}${key}DTO`, }); swaggerModels.push(relationClass); } } Reflect.defineMetadata(constants_js.DECORATORS.API_EXTRA_MODELS, swaggerModels, target); } } } exports.ApiControllerWriteDtoSwagger = ApiControllerWriteDtoSwagger; //# sourceMappingURL=dto-swagger.utility.js.map