@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
142 lines (138 loc) • 8.29 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');
require('../../../enum/decorator/api/route/type.enum.js');
var common = require('@nestjs/common');
var constants_js = require('@nestjs/common/constants.js');
var routeParamtypes_enum_js = require('@nestjs/common/enums/route-paramtypes.enum.js');
var swagger = require('@nestjs/swagger');
var dto_utility = require('../controller/get/dto.utility.js');
var buildOpenApiSchema_utility = require('./discriminator/build-open-api-schema.utility.js');
var isDtoProperties_utility = require('./discriminator/is-dto-properties.utility.js');
require('@nestjs/swagger/dist/constants.js');
var dtoCollectWithRegisteredChildren_utility = require('./dto-collect-with-registered-children.utility.js');
var generateEntityInformation_utility = require('../../generate-entity-information.utility.js');
/**
* Applies request DTO metadata used by Nest Swagger for custom routes.
* @template E - Entity type represented by the route metadata.
* @param {object} target - Controller prototype that owns the custom route.
* @param {string | symbol} propertyKey - Custom route method name.
* @param {IApiRouteMetadata<E>} metadata - Route metadata used to resolve generated DTOs.
* @param {IApiRouteRuntimeProperties<E, undefined>} runtimeProperties - Runtime route config containing dto/autoDto.
* @param {PropertyDescriptor} descriptor - Custom route method descriptor.
* @returns {void}
*/
function ApiRouteApplyDtoMetadata(target, propertyKey, metadata, runtimeProperties, descriptor) {
const bodyDto = resolveRequestDto(metadata, runtimeProperties, dtoType_enum.EApiDtoType.BODY);
const parametersDtoConfig = resolveRequestDto(metadata, runtimeProperties, dtoType_enum.EApiDtoType.PARAMETERS);
const queryDtoConfig = resolveRequestDto(metadata, runtimeProperties, dtoType_enum.EApiDtoType.QUERY);
const parametersDto = isDtoProperties_utility.ApiRouteIsDiscriminatedDtoProperties(parametersDtoConfig) ? undefined : parametersDtoConfig;
const queryDto = isDtoProperties_utility.ApiRouteIsDiscriminatedDtoProperties(queryDtoConfig) ? undefined : queryDtoConfig;
const routeArgumentsMetadata = Reflect.getMetadata(constants_js.ROUTE_ARGS_METADATA, target.constructor, propertyKey);
const parameterTypes = [...(Reflect.getMetadata(constants_js.PARAMTYPES_METADATA, target, propertyKey) ?? [])];
for (const { dto, parameterType } of [
{ dto: isDtoProperties_utility.ApiRouteIsDiscriminatedDtoProperties(bodyDto) ? Object : bodyDto, parameterType: routeParamtypes_enum_js.RouteParamtypes.BODY },
{ dto: parametersDto, parameterType: routeParamtypes_enum_js.RouteParamtypes.PARAM },
{ dto: queryDto, parameterType: routeParamtypes_enum_js.RouteParamtypes.QUERY },
]) {
if (!dto) {
continue;
}
const argumentIndex = resolveRouteArgumentIndex(routeArgumentsMetadata, parameterType);
if (argumentIndex !== undefined) {
parameterTypes[argumentIndex] = dto;
}
}
if (parameterTypes.length > 0) {
Reflect.defineMetadata(constants_js.PARAMTYPES_METADATA, parameterTypes, target, propertyKey);
}
const requestDtos = [];
for (const dto of [bodyDto, parametersDto, queryDto]) {
if (isDtoProperties_utility.ApiRouteIsDiscriminatedDtoProperties(dto)) {
dtoCollectWithRegisteredChildren_utility.ApiRouteCollectDtoWithRegisteredChildren(requestDtos, dto.type);
}
else if (dto) {
dtoCollectWithRegisteredChildren_utility.ApiRouteCollectDtoWithRegisteredChildren(requestDtos, dto);
}
}
const swaggerDecorators = requestDtos.length > 0 ? [swagger.ApiExtraModels(...requestDtos)] : [];
if (isDtoProperties_utility.ApiRouteIsDiscriminatedDtoProperties(bodyDto)) {
swaggerDecorators.push(swagger.ApiBody({
schema: buildOpenApiSchema_utility.ApiRouteBuildDiscriminatedDtoOpenApiSchema(bodyDto, "ApiRouteCustom body"),
}));
}
if (swaggerDecorators.length > 0) {
common.applyDecorators(...swaggerDecorators)(target, propertyKey, descriptor);
}
}
/**
* Resolves an explicitly configured request DTO or a generated DTO when the custom route has a CRUD route type.
* @template E - Entity type represented by the route metadata.
* @param {IApiRouteMetadata<E>} metadata - Route metadata used for entity and route type.
* @param {IApiRouteRuntimeProperties<E, undefined>} runtimeProperties - Runtime route config containing dto/autoDto.
* @param {Exclude<EApiDtoType, EApiDtoType.RESPONSE>} dtoType - Request DTO target.
* @returns {TApiRouteRequestDto | undefined} Resolved request DTO.
*/
function resolveRequestDto(metadata, runtimeProperties, dtoType) {
const configuredDto = runtimeProperties.dto?.[dtoType];
if (configuredDto) {
return configuredDto;
}
if (!metadata.route.type || !runtimeProperties.autoDto?.[dtoType]) {
return undefined;
}
const entity = generateEntityInformation_utility.GenerateEntityInformation(metadata.resource.entity);
const controllerProperties = {
entity: metadata.resource.entity};
const routeConfig = {
...runtimeProperties,
security: metadata.security,
};
return dto_utility.ApiControllerGetDto(controllerProperties, entity, metadata.route.type, dtoType, routeConfig);
}
/**
* Resolves an argument index from Nest route argument metadata.
* @param {Record<string, { data?: unknown; index?: number }> | undefined} routeArgumentsMetadata - Nest route arguments metadata.
* @param {RouteParamtypes} parameterType - Nest parameter type to find.
* @returns {number | undefined} Whole-object argument index for the requested parameter type.
*/
function resolveRouteArgumentIndex(routeArgumentsMetadata, parameterType) {
if (!routeArgumentsMetadata) {
return undefined;
}
for (const entry of Object.entries(routeArgumentsMetadata)) {
const [key, value] = entry;
const [type] = key.split(":");
const metadataParameterType = Number(type);
if (metadataParameterType === parameterType && value.data === undefined) {
return value.index;
}
}
return undefined;
}
exports.ApiRouteApplyDtoMetadata = ApiRouteApplyDtoMetadata;
//# sourceMappingURL=apply-dto-metadata.utility.js.map