@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
87 lines (84 loc) • 4.89 kB
JavaScript
import '../../../enum/decorator/api/action.enum.js';
import '../../../enum/decorator/api/authentication-type.enum.js';
import '../../../enum/decorator/api/controller/load-relations-strategy.enum.js';
import '../../../enum/decorator/api/controller/request-transformer-type.enum.js';
import { EApiDtoType } from '../../../enum/decorator/api/dto-type.enum.js';
import '../../../enum/decorator/api/function/type.enum.js';
import '../../../enum/decorator/api/on-type.enum.js';
import '../../../enum/decorator/api/property/data-type.enum.js';
import '../../../enum/decorator/api/property/date/identifier.enum.js';
import '../../../enum/decorator/api/property/date/type.enum.js';
import '../../../enum/decorator/api/property/desribe-type.enum.js';
import '../../../enum/decorator/api/property/number-type.enum.js';
import '../../../enum/decorator/api/property/string-type.enum.js';
import '../../../enum/decorator/api/route-type.enum.js';
import { assignMetadata } from '@nestjs/common';
import { ROUTE_ARGS_METADATA, PARAMTYPES_METADATA } from '@nestjs/common/constants';
import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum';
import '../../../constant/decorator/api/function.constant.js';
import '../../../constant/utility/dto/constant.js';
import '@nestjs/swagger';
import '../../../external/tslib/tslib.es6.js';
import 'class-transformer';
import 'class-validator';
import 'lodash/random';
import '../../../validator/is-regular-expression.validator.js';
import 'node:crypto';
import '../../../enum/filter-operation.enum.js';
import '../../../validator/must-match-one-of-schemas.validator.js';
import { DtoGenerate } from '../../dto/generate.utility.js';
import '../../../enum/filter-order-direction.enum.js';
import 'typeorm';
import 'reflect-metadata';
import '../../../validator/all-or-none-of-listed-properties.validator.js';
/**
* Applies metadata for NestJS controller methods to enable proper dependency injection.
* Sets up parameter metadata for route arguments including DTOs, headers, IP, and authentication requests.
* @param {object} target - The target controller class
* @param {object} targetPrototype - The prototype of the target controller class
* @param {IApiEntity<E>} entity - The entity metadata for the controller
* @param {IApiControllerProperties<E>} properties - Controller configuration properties
* @param {EApiRouteType} method - The type of route (CREATE, DELETE, GET, etc.)
* @param {string} methodName - The name of the method being configured
* @param {TApiControllerPropertiesRoute<E, typeof method>} routeConfig - Route-specific configuration
* @returns {void}
* @template E - The entity type
*/
function ApiControllerApplyMetadata(target, targetPrototype, entity, properties, method, methodName, routeConfig) {
let parameterIndex = 0;
let routeArgumentsMetadata = {};
const parameterTypes = [];
const requestDto = routeConfig.dto?.request ?? DtoGenerate(properties.entity, entity, method, EApiDtoType.REQUEST, routeConfig.autoDto?.[EApiDtoType.REQUEST], routeConfig.authentication?.guard);
const queryDto = routeConfig.dto?.query ?? DtoGenerate(properties.entity, entity, method, EApiDtoType.QUERY, routeConfig.autoDto?.[EApiDtoType.QUERY], routeConfig.authentication?.guard);
const bodyDto = routeConfig.dto?.body ?? DtoGenerate(properties.entity, entity, method, EApiDtoType.BODY, routeConfig.autoDto?.[EApiDtoType.BODY], routeConfig.authentication?.guard);
if (requestDto) {
routeArgumentsMetadata = assignMetadata(routeArgumentsMetadata, RouteParamtypes.PARAM, parameterIndex);
parameterTypes.push(requestDto);
parameterIndex++;
}
if (queryDto) {
routeArgumentsMetadata = assignMetadata(routeArgumentsMetadata, RouteParamtypes.QUERY, parameterIndex);
parameterTypes.push(queryDto);
parameterIndex++;
}
if (bodyDto) {
routeArgumentsMetadata = assignMetadata(routeArgumentsMetadata, RouteParamtypes.BODY, parameterIndex);
parameterTypes.push(bodyDto);
parameterIndex++;
}
routeArgumentsMetadata = assignMetadata(routeArgumentsMetadata, RouteParamtypes.HEADERS, parameterIndex);
parameterTypes.push(Object);
parameterIndex++;
routeArgumentsMetadata = assignMetadata(routeArgumentsMetadata, RouteParamtypes.IP, parameterIndex);
parameterTypes.push(Object);
parameterIndex++;
if (routeConfig.authentication) {
routeArgumentsMetadata = assignMetadata(routeArgumentsMetadata, RouteParamtypes.REQUEST, parameterIndex);
parameterTypes.push(Object);
parameterIndex++;
}
Reflect.defineMetadata(ROUTE_ARGS_METADATA, routeArgumentsMetadata, target, methodName);
Reflect.defineMetadata(PARAMTYPES_METADATA, parameterTypes, targetPrototype, methodName);
}
export { ApiControllerApplyMetadata };
//# sourceMappingURL=apply-metadata.utility.js.map