UNPKG

@elsikora/nestjs-crud-automator

Version:

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

89 lines (85 loc) 5.42 kB
'use strict'; var serviceBase_class = require('../../../class/api/service-base.class.js'); require('../../../class/api/subscriber/discovery-service.class.js'); require('../../../class/api/subscriber/executor.class.js'); require('../../../class/api/subscriber/registry.class.js'); require('../../../enum/decorator/api/action.enum.js'); require('../../../enum/decorator/api/authentication-type.enum.js'); var loadRelationsStrategy_enum = require('../../../enum/decorator/api/controller/load-relations-strategy.enum.js'); require('../../../enum/decorator/api/controller/request-transformer-type.enum.js'); require('../../../enum/decorator/api/dto-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-type.enum.js'); var common = require('@nestjs/common'); var errorException_utility = require('../../error-exception.utility.js'); var getEntityColumns_utility = require('../../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_utility.GetEntityColumns({ entity: properties.entity, shouldTakeRelationsOnly: true })) { // @ts-expect-error if (parameters[propertyName] !== undefined && typeof propertyName === "string") { if (relationConfig.relationsLoadStrategy === loadRelationsStrategy_enum.EApiControllerLoadRelationsStrategy.MANUAL && !relationConfig.relationsToLoad.includes(propertyName)) { continue; } let serviceName; if (relationConfig.servicesLoadStrategy === loadRelationsStrategy_enum.EApiControllerLoadRelationsStrategy.MANUAL) { const manualServiceName = relationConfig.relationsServices[propertyName]; if (manualServiceName === undefined) { throw errorException_utility.ErrorException(`Service name not specified for property ${propertyName} in manual mode`); } serviceName = manualServiceName; } else { serviceName = `${propertyName}Service`; } if (!serviceName) { throw errorException_utility.ErrorException(`Service name not specified for property ${propertyName}`); } const service = controllerMethod[serviceName]; if (!service) { if ((relationConfig.servicesLoadStrategy === loadRelationsStrategy_enum.EApiControllerLoadRelationsStrategy.AUTO && relationConfig.shouldForceAllServicesToBeSpecified) || relationConfig.servicesLoadStrategy === loadRelationsStrategy_enum.EApiControllerLoadRelationsStrategy.MANUAL) { throw errorException_utility.ErrorException(`Service ${serviceName} not found in controller`); } continue; } if (!(service instanceof serviceBase_class.ApiServiceBase)) { throw errorException_utility.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 common.BadRequestException(`Invalid ${String(propertyName)} ID`); } // @ts-expect-error parameters[propertyName] = entity; } } } } exports.ApiControllerHandleRequestRelations = ApiControllerHandleRequestRelations; //# sourceMappingURL=handle-request-relations.utility.js.map