UNPKG

navidev-adt-api

Version:

API de conexión al Abap Developer Tools

289 lines (287 loc) 13.4 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const repositoryConstants_1 = require("./repositoryConstants"); const xmlParser_1 = __importDefault(require("../shared/utilities/parser/xmlParser")); const Result_1 = require("../shared/core/Result"); class RepositoryApp { constructor(connectionController) { this.typesStructure = []; this.objectTypes = []; this.connectionController = connectionController; } /** * Devuelve la estructura de nodos de ADT. Los objetos del arbol de Eclipse o SE80 * @param adtConnection | Conexión para el ADT * @param ignoreCache | Ignorar cache * @returns Result con la lista de valores o Errores */ readTypesStructure() { return __awaiter(this, arguments, void 0, function* (ignoreCache = false) { if (ignoreCache) this.typesStructure = []; if (this.typesStructure.length == 0) { const response = yield this.connectionController.request(repositoryConstants_1.REPOSITORY_URL.TYPES, { method: "POST", }); if (response.isSuccess) { let httpResponse = response.getValue(); /* El XML original viene así: <asx:abap xmlns <asx:values> <DATA> <SEU_ADT_OBJECT_TYPE_DESCRIPTOR> .... </SEU_ADT_OBJECT_TYPE_DESCRIPTOR> </DATA> </asx:values> </asx:abap> El fullParse lo convierte a un objeto donde lo puedes acceder de esta manera: bodyParsed["asx:abap"]["asx:values"] */ let bodyParsed = xmlParser_1.default.fullParse(httpResponse.body); this.typesStructure = bodyParsed["asx:abap"]["asx:values"]["DATA"]["SEU_ADT_OBJECT_TYPE_DESCRIPTOR"].map((row) => { return { type: row.OBJECT_TYPE, typeDesc: row.OBJECT_TYPE_LABEL, uriTemplate: row.URI_TEMPLATE, category: row.CATEGORY, categoryLabel: row.CATEGORY_LABEL, }; }); } else { return Result_1.Result.fail(response.getErrorValue()); } } return Result_1.Result.ok(this.typesStructure); }); } /** * Devuelve los tipos de objetos del ADT * @param ignoreCache | Ignorar cache * @returns Result con la lista de valores o Errores */ readObjectTypes() { return __awaiter(this, arguments, void 0, function* (ignoreCache = false) { if (ignoreCache) this.objectTypes = []; if (this.objectTypes.length == 0) { const response = yield this.connectionController.request(repositoryConstants_1.REPOSITORY_URL.OBJECT_TYPES, { method: "GET", qs: { maxItemCount: 999, name: "*", data: "usedByProvider" }, }); if (response.isSuccess) { let httpResponse = response.getValue(); let bodyParsed = xmlParser_1.default.fullParse(httpResponse.body); this.objectTypes = bodyParsed["nameditem:namedItemList"]["nameditem:namedItem"].map((row) => { let data = row["nameditem:data"] || ""; // Sacamos los campos de type y usedBy ya que vienen con ";" y los valores const fields = data.split(";").reduce((acc, cur) => { const parts = cur.split(":", 2); acc[parts[0]] = parts[1] || ""; return acc; }, {}); return { name: row["nameditem:name"], nameDesc: row["nameditem:description"], internalType: fields.type, usedBy: fields.usedBy.split(","), }; }); } else { return Result_1.Result.fail(response.getErrorValue()); } } return Result_1.Result.ok(this.objectTypes); }); } /** * Devuelve los objetos los cuales se puede lanzar el servicio de validación o compilación * @returns Result con la lista de valores o Errores */ repositoryCheckRun() { return __awaiter(this, void 0, void 0, function* () { const response = yield this.connectionController.request(repositoryConstants_1.REPOSITORY_URL.CHECKRUNS, { method: "GET", }); if (response.isSuccess) { let httpResponse = response.getValue(); let checkRuns = []; let bodyParsed = xmlParser_1.default.fullParse(httpResponse.body); bodyParsed["chkrun:checkReporters"]["chkrun:reporter"] .filter((row) => row["@_chkrun:name"] == "abapCheckRun") .forEach((rowAbapCheckRun) => { rowAbapCheckRun["chkrun:supportedType"].forEach((rowSupportedType) => { checkRuns.push({ type: rowSupportedType }); }); }); return Result_1.Result.ok(checkRuns); } else { return Result_1.Result.fail(response.getErrorValue()); } }); } /** * Devuelve el tipo de objeto a partir del nombre de objeto. * Se usa en sitios como leer el contenido de un paquete, donde * se le pasa el nombre técnico. * @param name | Nombre del objeto * @returns Datos del objeto técnico */ getObjectTypeFromObjectName(name) { return __awaiter(this, void 0, void 0, function* () { if (this.objectTypes.length == 0) { let response = yield this.readObjectTypes(); if (response.isFailure) return Result_1.Result.fail(response.getErrorValue()); } return Result_1.Result.ok(this.objectTypes.find((row) => row.name == name)); }); } /** * Devuelve la definición del tipo de objeto a partir de su nombre * @param name | Nombre del objeto * @returns Datos del tipo de objeto */ getTypeFromObjectType(name) { return __awaiter(this, void 0, void 0, function* () { if (this.typesStructure.length == 0) { let response = yield this.readTypesStructure(); if (response.isFailure) return Result_1.Result.fail(response.getErrorValue()); } return Result_1.Result.ok(this.typesStructure.find((row) => row.type == name)); }); } /** * Devuelve las combinaciones de los objetos que se pueden usar para buscar. * @param searchQuery Texto a buscar, aunque realmente si no se informa nada devuelve lo mismo * @returns Array con la combinacion de objetos y descripciones a buscar */ searchMetadata() { return __awaiter(this, arguments, void 0, function* (searchQuery = "") { const response = yield this.connectionController.request(repositoryConstants_1.REPOSITORY_URL.SEARCH_METADATA, { method: "POST", qs: { RIS_REQUEST_TYPE: "OBJECT_TYPES_ALL", withSearchQuery: searchQuery, }, }); if (response.isSuccess) { let httpResponse = response.getValue(); let bodyParsed = xmlParser_1.default.fullParse(httpResponse.body); let objectTypes = bodyParsed["ris_meta_object_types"]["ris_meta_object_type"].map((row) => { return { trobjtype: row["trobjtype"], subtype: row["subtype"], legacy_type: row["legacy_type"], description_singular: row["description_singular"], description_plural: row["description_plural"], description_encl_object: row["description_encl_object"], has_combined_key: row["has_combined_key"], }; }); return Result_1.Result.ok(objectTypes); } else { return Result_1.Result.fail(response.getErrorValue()); } }); } /** * Busqueda individual de objetos, es decir, por un tipo y subtipo de objetos * @param objectType Tipo de objeto * @param legacyType Subtipo de objeto * @param searchQuery Objeto a buscar * @returns Resultado de la búsqueda */ searchObjectSingleType(objectType, legacyType, searchQuery) { return __awaiter(this, void 0, void 0, function* () { let body = `<?xml version="1.0" encoding="UTF-8"?><ris_search_request> <ris_object_type> <trobjtype>${objectType}</trobjtype> <subtype/> <legacy_type>${legacyType}</legacy_type> </ris_object_type> <ris_selected_packages/> </ris_search_request>`; const response = yield this.connectionController.request(repositoryConstants_1.REPOSITORY_URL.SEARCH_QUERY, { method: "POST", qs: { RIS_REQUEST_TYPE: "SEARCH_SINGLE", GENERIC_QUERY: searchQuery, }, body: body, }); if (response.isSuccess) { let httpResponse = response.getValue(); let bodyParsed = xmlParser_1.default.fullParse(httpResponse.body); let resultSearch = xmlParser_1.default.xmlArray(bodyParsed["adtcore:objectReferences"]["adtcore:objectReference"]).map((object) => { return { name: object["@_adtcore:name"], packageName: object["@_adtcore:packageName"], type: object["@_adtcore:type"], uri: object["@_adtcore:uri"], description: object["@_adtcore:description"], }; }); return Result_1.Result.ok(resultSearch); } else { return Result_1.Result.fail(response.getErrorValue()); } }); } /** * Busqueda rápida de objeto. Indicando el objeto su patrón y el tipo de objeto. * @param objectType Tipo de objeto * @param searchQuery Objeto a buscar * @param maxResults Numero máximo de resultados * @returns Resultado de la búsqueda */ quickSearch(searchQuery_1, objectType_1) { return __awaiter(this, arguments, void 0, function* (searchQuery, objectType, maxResults = 999) { const response = yield this.connectionController.request(repositoryConstants_1.REPOSITORY_URL.SEARCH_QUERY, { method: "GET", qs: { operation: "quickSearch", query: searchQuery, objectType: objectType, maxResults: maxResults, }, }); if (response.isSuccess) { let httpResponse = response.getValue(); let bodyParsed = xmlParser_1.default.fullParse(httpResponse.body); let resultSearch = xmlParser_1.default.xmlArray(bodyParsed["adtcore:objectReferences"]["adtcore:objectReference"]).map((object) => { return { name: object["@_adtcore:name"], packageName: object["@_adtcore:packageName"], type: object["@_adtcore:type"], uri: object["@_adtcore:uri"], description: object["@_adtcore:description"], }; }); return Result_1.Result.ok(resultSearch); } else { return Result_1.Result.fail(response.getErrorValue()); } }); } } exports.default = RepositoryApp;