@elsikora/nestjs-crud-automator
Version:
A library for automating the creation of CRUD operations in NestJS.
108 lines (104 loc) • 6.56 kB
JavaScript
;
require('../../../constant/decorator/api/function.constant.js');
var propertyDescribe_constant = require('../../../constant/decorator/api/property-describe.constant.js');
var factoryDtoGetListQuery_constant = require('../../../constant/factory-dto-get-list-query.constant.js');
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');
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');
var dtoType_enum = 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');
var desribeType_enum = 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');
var type_enum = require('../../../enum/decorator/api/route/type.enum.js');
var shouldBeMarked_utility = require('../is/property/should-be-marked.utility.js');
var exception_utility = require('../../error/exception.utility.js');
var generateEntityInformation_utility = require('../../generate-entity-information.utility.js');
/**
* Resolves metadata-backed GET_LIST filter properties for legacy or normalized-plan DTO generation.
* @param {IApiEntity<E>} entityMetadata - Root entity metadata.
* @param {Array<{isPrimary: boolean; metadata: TApiPropertyDescribeProperties; name: keyof E}>} markedProperties - Legacy metadata-visible root properties.
* @param {Type<IAuthGuard>} currentGuard - Active route guard used by legacy visibility checks.
* @param {IApiControllerGetListQueryPlan} queryPlan - Optional normalized typed query plan.
* @returns {Array<object>} Filter properties consumed by the dynamic DTO generator.
* @template E - Root entity type.
*/
function DtoGenerateGetListQueryProperties(entityMetadata, markedProperties, currentGuard, queryPlan) {
const queryFilterProperties = [];
if (queryPlan && !queryPlan.filter.isLegacy) {
for (const field of Object.values(queryPlan.filter.fields)) {
if (!field.isEnabled) {
continue;
}
const path = field.path.split(".");
let propertyEntityMetadata = entityMetadata;
if (path.length === factoryDtoGetListQuery_constant.GET_LIST_QUERY_DTO_FACTORY_CONSTANT.NESTED_FILTER_PATH_SEGMENT_COUNT) {
const relationColumn = entityMetadata.columns.find((column) => String(column.name) === path[0]);
if (!relationColumn?.relation?.target) {
throw exception_utility.ErrorException(`Relation metadata for GET_LIST query field "${field.path}" is unavailable`);
}
propertyEntityMetadata = generateEntityInformation_utility.GenerateEntityInformation(relationColumn.relation.target);
}
queryFilterProperties.push({
allowedOperations: field.allowedOperations,
entityMetadata: propertyEntityMetadata,
metadata: field.metadata,
name: field.path,
});
}
return queryFilterProperties;
}
for (const property of markedProperties) {
if (property.metadata.type !== desribeType_enum.EApiPropertyDescribeType.RELATION) {
queryFilterProperties.push({
entityMetadata: entityMetadata,
metadata: property.metadata,
name: property.name,
});
continue;
}
const relationColumn = entityMetadata.columns.find((column) => column.name == property.name);
if (!relationColumn?.relation?.target)
continue;
let relationEntityMetadata;
try {
relationEntityMetadata = generateEntityInformation_utility.GenerateEntityInformation(relationColumn.relation.target);
}
catch {
continue;
}
for (const relationProperty of relationEntityMetadata.columns) {
const relationPropertyMetadata = relationProperty.metadata?.[propertyDescribe_constant.PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT.METADATA_KEY];
if (!relationPropertyMetadata || relationPropertyMetadata.type === desribeType_enum.EApiPropertyDescribeType.RELATION || relationPropertyMetadata.type === desribeType_enum.EApiPropertyDescribeType.OBJECT)
continue;
if (!relationProperty.isPrimary && !shouldBeMarked_utility.DtoIsPropertyShouldBeMarked(type_enum.EApiRouteType.GET_LIST, dtoType_enum.EApiDtoType.QUERY, relationProperty.name, relationPropertyMetadata, relationProperty.isPrimary, currentGuard))
continue;
queryFilterProperties.push({
entityMetadata: relationEntityMetadata,
metadata: relationPropertyMetadata,
name: `${property.name}.${relationProperty.name}`,
});
}
}
return queryFilterProperties;
}
exports.DtoGenerateGetListQueryProperties = DtoGenerateGetListQueryProperties;
//# sourceMappingURL=get-list-query-properties.utility.js.map