@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
101 lines (97 loc) • 5.52 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');
var relationReferenceShape_enum = 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');
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 exception_utility = require('../../../error/exception.utility.js');
/**
* Projects loaded relation objects into the configured response reference shape.
* @template E - Entity type that owns the relation configuration.
* @template R - Response value type.
* @param {IApiControllerPropertiesRouteBaseRelationsResponse<E> | undefined} relationConfig - Response relation projection configuration.
* @param {R} response - Response value to project.
* @returns {R} Response value with projected relation references.
*/
function ApiRouteProjectRelationResponse(relationConfig, response) {
if (!relationConfig?.load?.include || Object.keys(relationConfig.load.include).length === 0) {
return response;
}
validateResponseReferenceConfig(relationConfig.reference);
const relationNames = Object.keys(relationConfig.load.include);
const referenceKey = relationConfig.reference.key ?? "id";
const responses = [];
if (Array.isArray(response)) {
for (const item of response) {
if (item === null || typeof item !== "object") {
continue;
}
responses.push(item);
}
}
else {
const responseValue = response;
if (responseValue !== null && typeof responseValue === "object" && "items" in responseValue && Array.isArray(responseValue.items)) {
for (const item of responseValue.items) {
if (item === null || typeof item !== "object") {
continue;
}
responses.push(item);
}
}
else if (responseValue !== null && typeof responseValue === "object") {
responses.push(responseValue);
}
}
for (const projectedResponse of responses) {
for (const relationName of relationNames) {
const relationValue = projectedResponse[relationName];
if (relationValue === null || relationValue === undefined || typeof relationValue !== "object") {
continue;
}
const referenceValue = relationValue[referenceKey];
projectedResponse[relationName] = relationConfig.reference.shape === relationReferenceShape_enum.EApiControllerRelationReferenceShape.SCALAR ? referenceValue : { [referenceKey]: referenceValue };
}
}
return response;
}
/**
* Ensures response relation reference settings are valid route configuration.
* @param {IApiControllerPropertiesRouteBaseRelationsResponse<IApiBaseEntity>["reference"] | undefined} referenceConfig - Response relation reference config.
* @returns {void}
*/
function validateResponseReferenceConfig(referenceConfig) {
if (!referenceConfig) {
throw exception_utility.ErrorException("Response relation reference config is required when relation loading is configured");
}
if (!Object.values(relationReferenceShape_enum.EApiControllerRelationReferenceShape).includes(referenceConfig.shape)) {
throw exception_utility.ErrorException("Response relation reference shape must be OBJECT or SCALAR");
}
if (referenceConfig.key?.length === 0) {
throw exception_utility.ErrorException("Response relation reference key must not be empty");
}
}
exports.ApiRouteProjectRelationResponse = ApiRouteProjectRelationResponse;
//# sourceMappingURL=project-relation.utility.js.map