@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
81 lines (77 loc) • 5.39 kB
JavaScript
'use strict';
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');
var type_enum = require('../../enum/decorator/api/route/type.enum.js');
var decorator_utility = require('./generate/decorator.utility.js');
var decoratorConfig_utility = require('./get/decorator-config.utility.js');
var handleDateProperty_utility = require('./handle-date-property.utility.js');
var exposedForGuard_utility = require('./is/property/exposed-for-guard.utility.js');
var infrastructureTimestamp_utility = require('./is/property/infrastructure-timestamp.utility.js');
/**
* Creates property decorators for DTOs based on property metadata, entity information, and context.
* Handles special cases for date properties and guard-based exposure rules.
* @param {M} method - The API route type (CREATE, DELETE, GET, etc.)
* @param {TApiPropertyDescribeProperties} propertyMetadata - Metadata describing the property
* @param {IApiEntity<E>} entity - The entity metadata
* @param {D} dtoType - The type of DTO (REQUEST, RESPONSE, etc.)
* @param {string} propertyName - The name of the property
* @param {Type<IAuthGuard>} [currentGuard] - Optional authentication guard
* @param {Record<string, Type<unknown>>} [generatedDTOs] - Optional record of dynamically generated DTOs
* @returns {Array<PropertyDecorator> | undefined} Array of property decorators or undefined if property should not be included
* @template E - The entity type
* @template M - The API route type
* @template D - The DTO type
*/
// eslint-disable-next-line @elsikora/typescript/no-unnecessary-type-parameters
function DtoBuildDecorator(method, propertyMetadata, entity, dtoType, propertyName, currentGuard, generatedDTOs) {
const properties = propertyMetadata.properties?.[method];
if (properties?.[dtoType]?.isEnabled === false || (properties?.[dtoType]?.isResponse && properties?.[dtoType]?.isExpose === false)) {
return undefined;
}
if (!exposedForGuard_utility.DtoIsPropertyExposedForGuard(method, propertyMetadata, dtoType, currentGuard)) {
return undefined;
}
const isWriteBody = dtoType === dtoType_enum.EApiDtoType.BODY && (method === type_enum.EApiRouteType.CREATE || method === type_enum.EApiRouteType.UPDATE || method === type_enum.EApiRouteType.PARTIAL_UPDATE);
if (isWriteBody && infrastructureTimestamp_utility.DtoIsPropertyInfrastructureTimestamp(propertyMetadata)) {
return undefined;
}
if (propertyMetadata.type === desribeType_enum.EApiPropertyDescribeType.DATE) {
const dateMetadata = propertyMetadata;
if (method === type_enum.EApiRouteType.GET_LIST && dtoType === dtoType_enum.EApiDtoType.QUERY) {
const dateProperties = handleDateProperty_utility.DtoHandleDateProperty(propertyName, dateMetadata.identifier);
return dateProperties.map((property) => {
const newMetadata = { ...dateMetadata, identifier: property.identifier };
const config = decoratorConfig_utility.DtoGetDecoratorConfig(method, newMetadata, dtoType);
return decorator_utility.DtoGenerateDecorator(newMetadata, entity, config, method, dtoType, propertyName);
});
}
}
const config = decoratorConfig_utility.DtoGetDecoratorConfig(method, propertyMetadata, dtoType);
return [decorator_utility.DtoGenerateDecorator(propertyMetadata, entity, config, method, dtoType, propertyName, generatedDTOs)];
}
exports.DtoBuildDecorator = DtoBuildDecorator;
//# sourceMappingURL=build-decorator.utility.js.map