UNPKG

@elsikora/nestjs-crud-automator

Version:

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

101 lines (97 loc) 5.52 kB
'use strict'; 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