navidev-abap-gw-api
Version:
API para la extracción de datos de servicios SAP GW
161 lines (160 loc) • 6.1 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const odata_query_1 = __importDefault(require("odata-query"));
const crudOperationsTypes_1 = require("./crudOperationsTypes");
const metadataOdataTypes_1 = require("../gwMetadata/metadataOdataTypes");
const baseUtils_1 = __importDefault(require("./baseUtils"));
class QueryUtils extends baseUtils_1.default {
/**
* Construye la parte de la URL para el método QUERY
* @param parameters
* @returns
*/
buildQuery(parameters) {
let filter = {};
if (((parameters === null || parameters === void 0 ? void 0 : parameters.filters) && parameters.filters.length > 0) ||
(parameters === null || parameters === void 0 ? void 0 : parameters.filterComplex))
filter = this.buildFilter(parameters === null || parameters === void 0 ? void 0 : parameters.filters, parameters.filterComplex);
return (0, odata_query_1.default)({
format: "json",
filter,
top: parameters === null || parameters === void 0 ? void 0 : parameters.top,
skip: parameters === null || parameters === void 0 ? void 0 : parameters.skip,
expand: parameters === null || parameters === void 0 ? void 0 : parameters.expand,
});
}
/**
* Construye la parte de la URL para el método READ
* @param parameters
* @returns
*/
buildReadQuery(keys) {
let key = {};
Object.keys(keys).forEach((rowKey) => {
key[rowKey] = this.convertQueryValue(keys[rowKey], rowKey);
});
return (0, odata_query_1.default)({
format: "json",
key,
});
}
/**
* Construye los filtros
* @param filters
* @returns
*/
buildFilter(filters, filterComplex) {
let filterQuery = { and: [] };
if (filters) {
const filtersGroupBy = this.groupBy(filters, "field");
for (const field in filtersGroupBy) {
if (filtersGroupBy[field].length == 1) {
filterQuery.and.push(this.buildFieldCondition(filtersGroupBy[field][0]));
}
else {
let fieldOr = { or: [] };
filtersGroupBy[field].forEach((rowFilter) => {
fieldOr.or.push(this.buildFieldCondition(rowFilter));
});
filterQuery.and.push(fieldOr);
}
}
}
// Se añaden los filtros complejos que no se pueden construir como los filtros simples
if (filterQuery)
filterQuery.and.push(filterComplex);
return filterQuery;
}
/**
* Construye la condición por campo
* @param filter
* @returns
*/
buildFieldCondition(filter) {
var _a;
let condition = {};
let option = this.convertFilterOption2Text((_a = filter.option) !== null && _a !== void 0 ? _a : crudOperationsTypes_1.FilterOptions.equal);
if (filter.option == crudOperationsTypes_1.FilterOptions.between) {
condition = {
[filter.field]: {
ge: this.determineType(filter.field)
? {
value: this.convertQueryValue(filter.value1, filter.field),
type: this.determineType(filter.field),
}
: this.convertQueryValue(filter.value1, filter.field),
le: this.determineType(filter.field)
? {
value: this.convertQueryValue(filter.value2, filter.field),
type: this.determineType(filter.field),
}
: this.convertQueryValue(filter.value2, filter.field),
},
};
}
else {
condition = {
[filter.field]: {
[option]: this.determineType(filter.field)
? {
value: this.convertQueryValue(filter.value1, filter.field),
type: this.determineType(filter.field),
}
: this.convertQueryValue(filter.value1, filter.field),
},
};
}
return condition;
}
/**
* Determina el tipo del campo para la libreria del odata-query
* @param fieldName
* @returns
*/
determineType(fieldName) {
const fieldInfo = this.entityInfo.fields.find((row) => row.name == fieldName);
if (!fieldInfo)
return undefined;
if (fieldInfo.type === metadataOdataTypes_1.ODATA_TYPES.DATETIME)
return "raw";
return undefined;
}
/**
* Convierte el enum de las opciones a text
* @param option
* @returns
*/
convertFilterOption2Text(option) {
if (option == crudOperationsTypes_1.FilterOptions.equal)
return "eq";
if (option == crudOperationsTypes_1.FilterOptions.greaterEqual)
return "ge";
if (option == crudOperationsTypes_1.FilterOptions.greaterThan)
return "gt";
if (option == crudOperationsTypes_1.FilterOptions.between)
return "bt";
if (option == crudOperationsTypes_1.FilterOptions.lessEqual)
return "le";
if (option == crudOperationsTypes_1.FilterOptions.lessThan)
return "lt";
if (option == crudOperationsTypes_1.FilterOptions.notEqual)
return "ne";
return "eq";
}
/**
* Agrupa los filtros por campos
* @param xs
* @param key
* @returns
*/
groupBy(xs, key) {
return xs.reduce(function (rv, x) {
(rv[x[key]] = rv[x[key]] || []).push(x);
return rv;
}, {});
}
}
exports.default = QueryUtils;