@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
93 lines (89 loc) • 6.16 kB
JavaScript
;
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