UNPKG

navidev-abap-gw-api

Version:

API para la extracción de datos de servicios SAP GW

161 lines (160 loc) 6.1 kB
"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;