@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
127 lines (123 loc) • 7.67 kB
JavaScript
;
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');
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 camelCaseString_utility = require('../../../camel-case-string.utility.js');
require('../../../../constant/utility/dto/constant.js');
var core_utility = require('../../../dto/generate/core.utility.js');
require('@nestjs/swagger');
require('../../../../external/tslib/tslib.es6.js');
require('../../../../class/utility/dto/exception/details/foreign-key-violation.class.js');
require('../../../../class/utility/dto/exception/details/unique-violation.class.js');
require('../../../../enum/utility/manual-dto-property-metadata-decorator.enum.js');
require('@nestjs/common');
require('class-transformer');
require('class-validator');
require('lodash/random.js');
require('@nestjs/swagger/dist/constants.js');
require('../../../../validator/must-match-one-of-schemas.validator.js');
require('../../../../constant/interface/api/property/default-string-format.constant.js');
require('../../../../validator/is-regular-expression.validator.js');
require('node:crypto');
require('../../../../enum/utility/exception-details-type.enum.js');
require('../../../../enum/filter/operand.enum.js');
require('../../../../enum/filter/operation.enum.js');
require('../../../../enum/filter/order-direction.enum.js');
var getListResponse_utility = require('../../../dto/generate/get-list-response.utility.js');
require('../../../../constant/decorator/api/function.constant.js');
require('typeorm');
require('reflect-metadata');
require('../../../../validator/all-or-none-of-listed-properties.validator.js');
const getListItemResponseDtoCache = new Map();
/**
* Resolves a DTO class for a generated controller route.
* Prefers an explicitly configured DTO and falls back to auto-generation.
* @param {IApiControllerProperties<E>} properties - Controller configuration
* @param {IApiEntity<E>} entity - Entity metadata
* @param {R} method - Route type
* @param {EApiDtoType} dtoType - DTO kind to resolve
* @param {TApiControllerPropertiesRoute<E, R>} routeConfig - Route-specific configuration
* @param {IApiControllerGetListQueryPlan} [queryPlan] - Route-scoped plan for dynamic GET_LIST QUERY DTO generation.
* @returns {Type<unknown> | undefined} -The resolved DTO class or undefined if no DTO is configured
* @template E - Entity type
* @template R - Route type
*/
function ApiControllerGetDto(properties, entity, method, dtoType, routeConfig, queryPlan) {
const configuredDto = routeConfig.dto?.[dtoType];
if (configuredDto) {
if (method === type_enum.EApiRouteType.GET_LIST && dtoType === dtoType_enum.EApiDtoType.RESPONSE && isGetListResponseDtoConfig(configuredDto)) {
return getGetListItemResponseDto(properties.entity, entity, configuredDto, method, dtoType);
}
return configuredDto;
}
const effectiveQueryPlan = method === type_enum.EApiRouteType.GET_LIST && dtoType === dtoType_enum.EApiDtoType.QUERY ? queryPlan : undefined;
return core_utility.DtoGenerate(properties.entity, entity, method, dtoType, routeConfig.autoDto?.[dtoType], routeConfig.security?.authentication?.guard, effectiveQueryPlan);
}
/**
* Builds a stable generated wrapper class name for GET_LIST custom item response DTOs.
* @param {IApiEntity<E>} entity - Entity metadata used for the resource name.
* @param {IApiControllerPropertiesRouteGetListResponseDtoConfig} config - Custom item response DTO config.
* @param {EApiRouteType} method - Current route type.
* @param {EApiDtoType} dtoType - Current DTO type.
* @returns {string} Generated wrapper DTO class name.
* @template E - Entity type.
*/
function buildGetListItemResponseDtoName(entity, config, method, dtoType) {
return config.name ?? `${entity.name ?? "UnknownResource"}${camelCaseString_utility.CamelCaseString(method)}${camelCaseString_utility.CamelCaseString(dtoType)}${config.itemType.name}`;
}
/**
* Generates or returns a cached list wrapper around a configured custom item response DTO.
* @param {ObjectLiteral} resourceClass - Entity class used for wrapper metadata.
* @param {IApiEntity<E>} entity - Entity metadata used for naming.
* @param {IApiControllerPropertiesRouteGetListResponseDtoConfig} config - Custom item response DTO config.
* @param {EApiRouteType} method - Current route type.
* @param {EApiDtoType} dtoType - Current DTO type.
* @returns {Type<unknown>} Generated list wrapper DTO class.
* @template E - Entity type.
*/
function getGetListItemResponseDto(resourceClass, entity, config, method, dtoType) {
const name = buildGetListItemResponseDtoName(entity, config, method, dtoType);
const cacheKey = `${entity.name ?? "UnknownResource"}_${config.itemType.name}_${name}`;
const cached = getListItemResponseDtoCache.get(cacheKey);
if (cached) {
return cached;
}
// @ts-ignore The existing list wrapper generator accepts the entity constructor at runtime.
const dto = getListResponse_utility.DtoGenerateGetListResponse(resourceClass, config.itemType, name);
getListItemResponseDtoCache.set(cacheKey, dto);
return dto;
}
/**
* Returns whether a route response DTO config describes a custom GET_LIST item DTO.
* @param {IApiControllerPropertiesRouteGetListResponseDtoConfig | Type<unknown>} value - Configured response DTO value.
* @returns {boolean} Whether the value is the item DTO config shape.
*/
function isGetListResponseDtoConfig(value) {
return typeof value === "object" && "itemType" in value && typeof value.itemType === "function";
}
exports.ApiControllerGetDto = ApiControllerGetDto;
//# sourceMappingURL=dto.utility.js.map