@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
89 lines (85 loc) • 5.42 kB
JavaScript
;
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