UNPKG

@elsikora/nestjs-crud-automator

Version:

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

93 lines (89 loc) 6.16 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/load-relations-strategy.enum.js'); require('../../../enum/decorator/api/controller/request-transformer-type.enum.js'); var dtoType_enum = require('../../../enum/decorator/api/dto-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-type.enum.js'); var constants = require('@nestjs/swagger/dist/constants'); var camelCaseString_utility = require('../../camel-case-string.utility.js'); require('../../../constant/utility/dto/constant.js'); require('@nestjs/swagger'); require('../../../external/tslib/tslib.es6.js'); require('@nestjs/common'); require('class-transformer'); require('class-validator'); require('lodash/random'); require('../../../validator/is-regular-expression.validator.js'); require('node:crypto'); require('../../../enum/filter-operation.enum.js'); require('../../../validator/must-match-one-of-schemas.validator.js'); var generate_utility = require('../../dto/generate.utility.js'); require('../../../enum/filter-order-direction.enum.js'); require('typeorm'); require('reflect-metadata'); require('../../../validator/all-or-none-of-listed-properties.validator.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 * @returns {void} * @template E - The entity type */ function ApiControllerWriteDtoSwagger(target, entity, properties, method, routeConfig, entityMetadata) { const swaggerModels = (Reflect.getMetadata(constants.DECORATORS.API_EXTRA_MODELS, target) ?? []); const requestDto = routeConfig.dto?.request ?? generate_utility.DtoGenerate(properties.entity, entity, method, dtoType_enum.EApiDtoType.REQUEST, routeConfig.autoDto?.[dtoType_enum.EApiDtoType.REQUEST], routeConfig.authentication?.guard); const queryDto = routeConfig.dto?.query ?? generate_utility.DtoGenerate(properties.entity, entity, method, dtoType_enum.EApiDtoType.QUERY, routeConfig.autoDto?.[dtoType_enum.EApiDtoType.QUERY], routeConfig.authentication?.guard); const bodyDto = routeConfig.dto?.body ?? generate_utility.DtoGenerate(properties.entity, entity, method, dtoType_enum.EApiDtoType.BODY, routeConfig.autoDto?.[dtoType_enum.EApiDtoType.BODY], routeConfig.authentication?.guard); const responseDto = routeConfig.dto?.response ?? generate_utility.DtoGenerate(properties.entity, entity, method, dtoType_enum.EApiDtoType.RESPONSE, routeConfig.autoDto?.[dtoType_enum.EApiDtoType.RESPONSE], routeConfig.authentication?.guard); const dtoList = [requestDto, queryDto, bodyDto, responseDto]; for (const dto of dtoList) { if (dto && !swaggerModels.includes(dto)) { swaggerModels.push(dto); const storage = metadataStorage_class.MetadataStorage.getInstance(); const metadata = storage.getMetadata(entityMetadata.name ?? "UnknownResource"); 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.DECORATORS.API_EXTRA_MODELS, swaggerModels, target); } } } exports.ApiControllerWriteDtoSwagger = ApiControllerWriteDtoSwagger; //# sourceMappingURL=write-dto-swagger.utility.js.map