@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
122 lines (118 loc) • 7.78 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/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