UNPKG

@elsikora/nestjs-crud-automator

Version:

A library for automating the creation of CRUD operations in NestJS.

87 lines (84 loc) 5.09 kB
import { ApiServiceBase } from '../../../class/api/service-base.class.js'; import '../../../class/api/subscriber/discovery-service.class.js'; import '../../../class/api/subscriber/executor.class.js'; import '../../../class/api/subscriber/registry.class.js'; import '../../../enum/decorator/api/action.enum.js'; import '../../../enum/decorator/api/authentication-type.enum.js'; import { EApiControllerLoadRelationsStrategy } from '../../../enum/decorator/api/controller/load-relations-strategy.enum.js'; import '../../../enum/decorator/api/controller/request-transformer-type.enum.js'; import '../../../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 { BadRequestException } from '@nestjs/common'; import { ErrorException } from '../../error-exception.utility.js'; import { GetEntityColumns } from '../../get-entity-columns.utility.js'; /** * Manages loading related entities when processing API requests. * Determines which relations to load based on configuration strategy (MANUAL or AUTO), * finds the appropriate service for each relation, and loads the related entities. * @param {TApiControllerMethod<E>} controllerMethod - The controller method with access to service instances * @param {IApiControllerProperties<E>} properties - Controller configuration properties * @param {TApiControllerPropertiesRouteBaseRequestRelations<E> | undefined} relationConfig - Configuration for relation loading * @param {DeepPartial<E> | Partial<E> | TApiControllerGetListQuery<E>} parameters - The request parameters containing relation IDs * @returns {Promise<void>} A promise that resolves when all relations are loaded * @throws {BadRequestException} When an invalid relation ID is provided * @throws {Error} When service configuration is invalid or services are not found * @template E - The entity type * @template R - The route type */ async function ApiControllerHandleRequestRelations(controllerMethod, properties, relationConfig, parameters) { if (relationConfig?.shouldLoadRelations) { for (const propertyName of GetEntityColumns({ entity: properties.entity, shouldTakeRelationsOnly: true })) { // @ts-expect-error if (parameters[propertyName] !== undefined && typeof propertyName === "string") { if (relationConfig.relationsLoadStrategy === EApiControllerLoadRelationsStrategy.MANUAL && !relationConfig.relationsToLoad.includes(propertyName)) { continue; } let serviceName; if (relationConfig.servicesLoadStrategy === EApiControllerLoadRelationsStrategy.MANUAL) { const manualServiceName = relationConfig.relationsServices[propertyName]; if (manualServiceName === undefined) { throw ErrorException(`Service name not specified for property ${propertyName} in manual mode`); } serviceName = manualServiceName; } else { serviceName = `${propertyName}Service`; } if (!serviceName) { throw ErrorException(`Service name not specified for property ${propertyName}`); } const service = controllerMethod[serviceName]; if (!service) { if ((relationConfig.servicesLoadStrategy === EApiControllerLoadRelationsStrategy.AUTO && relationConfig.shouldForceAllServicesToBeSpecified) || relationConfig.servicesLoadStrategy === EApiControllerLoadRelationsStrategy.MANUAL) { throw ErrorException(`Service ${serviceName} not found in controller`); } continue; } if (!(service instanceof ApiServiceBase)) { throw ErrorException(`Service ${serviceName} is not an instance of BaseApiService`); } const requestProperties = { where: { id: parameters[propertyName], }, }; const entity = (await service.get(requestProperties)); if (!entity) { throw new BadRequestException(`Invalid ${String(propertyName)} ID`); } // @ts-expect-error parameters[propertyName] = entity; } } } } export { ApiControllerHandleRequestRelations }; //# sourceMappingURL=handle-request-relations.utility.js.map