navidev-adt-api
Version:
API de conexión al Abap Developer Tools
289 lines (287 loc) • 13.4 kB
JavaScript
"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;