Uecko_ERP/packages/rdx-criteria/src/criteria-to-sequelize-converter.ts

89 lines
2.4 KiB
TypeScript
Raw Normal View History

2025-05-26 14:45:03 +00:00
import { Filter } from "@codelytv/criteria";
2025-05-26 10:38:45 +00:00
import { FindOptions, Op, OrderItem, WhereOptions } from "sequelize";
2025-05-26 14:45:03 +00:00
import { Criteria } from "./critera";
2025-05-26 10:38:45 +00:00
2025-09-29 18:22:59 +00:00
type CriteriaMappings = { [key: string]: string };
2025-05-26 10:38:45 +00:00
export class CriteriaToSequelizeConverter {
//convert(fieldsToSelect: string[], criteria: Criteria, mappings: Mappings = {}): FindOptions {
2025-09-29 18:22:59 +00:00
convert(criteria: Criteria, mappings: CriteriaMappings = {}): FindOptions {
2025-05-26 10:38:45 +00:00
const options: FindOptions = {};
// Selección de campos
/*if (fieldsToSelect.length > 0) {
options.attributes = fieldsToSelect;
}*/
// Filtros
if (criteria.hasFilters()) {
options.where = this.buildWhere(criteria.filters.value, mappings);
}
// Orden
if (criteria.hasOrder()) {
const field = mappings[criteria.order.orderBy.value] || criteria.order.orderBy.value;
const direction = criteria.order.orderType.value.toUpperCase();
options.order = [[field, direction]] as OrderItem[];
}
// Paginación
if (criteria.pageSize !== null) {
options.limit = criteria.pageSize;
}
if (criteria.pageSize !== null && criteria.pageNumber !== null) {
options.offset = criteria.pageSize * criteria.pageNumber;
}
return options;
}
2025-09-29 18:22:59 +00:00
private buildWhere(filters: Filter[], mappings: CriteriaMappings): WhereOptions {
2025-05-26 10:38:45 +00:00
const where: WhereOptions = {};
filters.forEach((filter) => {
const field = mappings[filter.field.value] || filter.field.value;
const operator = this.mapOperator(filter.operator.value);
const value = filter.value.value;
if (!where[field]) {
where[field] = {};
}
where[field][operator] = this.transformValue(operator, value);
});
return where;
}
private mapOperator(operator: string): symbol {
switch (operator) {
case "CONTAINS":
return Op.like;
case "NOT_CONTAINS":
return Op.notLike;
case "NOT_EQUALS":
return Op.ne;
case "GREATER_THAN":
return Op.gt;
case "GREATER_THAN_OR_EQUAL":
return Op.gte;
case "LOWER_THAN":
return Op.lt;
case "LOWER_THAN_OR_EQUAL":
return Op.lte;
case "EQUALS":
return Op.eq;
default:
return Op.eq;
}
}
private transformValue(operator: symbol, value: any): any {
if (operator === Op.like || operator === Op.notLike) {
return `%${value}%`;
}
return value;
}
}