@sap/subaccount-destination-service-provider
Version:
Provide service consumption of SAP subaccount services
176 lines • 9.16 kB
JavaScript
;
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());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.C4cRetrieve = void 0;
const vkbeautify = require("vkbeautify");
const service_provider_apis_1 = require("@sap/service-provider-apis");
const systemUtils_1 = require("../../utils/systemUtils");
const c4cDestinationProviderSystem_1 = require("../providers/c4cDestinationProviderSystem");
const c4cService_1 = require("../type/c4cService");
const utils_1 = require("../utils/utils");
const messages_1 = require("../../i18n/messages");
const baseRetriever_1 = require("../../common/baseRetriever");
const errorUtils_1 = require("../../common/utils/errorUtils");
const C4C_GET_SERVICE_SUFFIX_URL = "/sap/c4c/odata/v1/odataservicecatalog/ODataServiceCollection";
const DEPRECATED_SERVICES_NAME = ["c4codata"];
const SUPER_SERVICE = "c4codataapi";
const SUPER_SERVICES_SUFFIX_URL = `/sap/c4c/odata/v1/odata_apihub_services/GetIndividualServices?VirtualServiceName='c4codataapi'`;
const METADATA_FILTER = "?$filter=";
class C4cRetrieve extends baseRetriever_1.BaseRetriever {
constructor(connectivityProvider) {
super(connectivityProvider);
}
retrieveAnnotations(systemName, serviceId, credentials) {
return __awaiter(this, void 0, void 0, function* () {
throw new Error(messages_1.messages.METHOD_NOT_IMPLEMENTED());
});
}
retrieveDestinations(filter) {
return __awaiter(this, void 0, void 0, function* () {
try {
const c4cFilter = (0, utils_1.getC4cDestinationFilter)(filter);
const c4cDestinations = yield this.connectivityProvider.getSubAccountDestinations();
const systems = [];
c4cDestinations.forEach((destinationConfiguration) => {
if ((0, systemUtils_1.filterDestination)(destinationConfiguration, c4cFilter)) {
systems.push(this.DestinationListInfoToC4cProviderSystem(destinationConfiguration));
}
});
return systems;
}
catch (e) {
const error = e;
throw new service_provider_apis_1.ServiceProviderError(service_provider_apis_1.ServiceProviderErrorCode.RETRIEVE_DATA, error);
}
});
}
retrieveServices(systemName, systemUrl, credentials, filter) {
return __awaiter(this, void 0, void 0, function* () {
try {
const basHeader = (0, systemUtils_1.getCredentialsHeader)(credentials);
const rawServices = yield this.getRawServices(C4C_GET_SERVICE_SUFFIX_URL, basHeader, systemName);
let superService;
const services = [];
rawServices.forEach((rawService) => {
if (DEPRECATED_SERVICES_NAME.includes(rawService.ServiceName)) {
return;
}
else if (SUPER_SERVICE === rawService.ServiceName) {
superService = new c4cService_1.C4cService(rawService);
return;
}
services.push(new c4cService_1.C4cService(rawService));
});
if (!superService) {
return services;
}
const additionalService = yield this.superServiceToServices(superService, SUPER_SERVICES_SUFFIX_URL, basHeader, systemName);
return [...services, ...additionalService];
}
catch (e) {
(0, errorUtils_1.handleProviderError)(e, service_provider_apis_1.messages.SYS_ERROR_FAIL_RETRIEVE_SERVICES, this.logger);
}
});
}
superServiceToServices(superService, url, headers, destinationName) {
return __awaiter(this, void 0, void 0, function* () {
let rawSuperServiceList;
try {
rawSuperServiceList = yield this.getRawServices(url, headers, destinationName);
}
catch (e) {
return [superService];
}
return rawSuperServiceList.map((rawSuperService) => {
const rawService = {
ServiceName: (0, utils_1.addSpaceBeforeCapitalLetter)(rawSuperService.LeadingEntityTypeName),
Namespace: superService.namespace,
MetadataURL: superService.url,
metadataFilter: `${METADATA_FILTER}${rawSuperService.LeadingEntityTypeName}`,
};
return new c4cService_1.C4cService(rawService);
});
});
}
retrieveMetadata(systemName, serviceUrl, encoding, credentials) {
return __awaiter(this, void 0, void 0, function* () {
try {
if (encoding !== service_provider_apis_1.EncodingMode.XML) {
const e = new Error(`${service_provider_apis_1.messages.SYS_ERROR_FAIL_PARSE_RESPONSE}`);
throw new service_provider_apis_1.ServiceProviderError(service_provider_apis_1.ServiceProviderErrorCode.RETRIEVE_DATA, e);
}
const basHeader = this.getMetadataHeaders(credentials);
const connProviderParams = {
urlPath: serviceUrl,
responseType: "text",
method: "get",
headers: basHeader,
};
const connectivityResponse = yield this.connectivityProvider.sendRequestViaDestination(connProviderParams, systemName);
return {
data: vkbeautify.xml(connectivityResponse),
encoding: service_provider_apis_1.EncodingMode.XML,
};
}
catch (e) {
(0, errorUtils_1.handleProviderError)(e, service_provider_apis_1.messages.SYS_ERROR_FAIL_RETRIEVE_METADATA, this.logger);
}
});
}
retrieveLiveData(systemName, serviceUrl, entityName, encoding, filter, credentials, headerParameters) {
return __awaiter(this, void 0, void 0, function* () {
const requestParams = (0, service_provider_apis_1.getRequestParamString)(filter);
const liveDataUrl = `${serviceUrl}/${entityName}${requestParams}`;
try {
const basHeader = (0, systemUtils_1.getCredentialsHeader)(credentials);
const connProviderParams = {
urlPath: liveDataUrl,
responseType: "json",
method: "get",
headers: basHeader,
};
const connectivityResponse = yield this.connectivityProvider.sendRequestViaDestination(connProviderParams, systemName);
return {
data: JSON.stringify(connectivityResponse),
encoding: service_provider_apis_1.EncodingMode.JSON,
};
}
catch (e) {
(0, errorUtils_1.handleProviderError)(e, service_provider_apis_1.messages.SYS_ERROR_FAIL_RETRIEVE_ENTITY_DATA(entityName), this.logger);
}
});
}
getRawServices(url, headers, destinationName) {
return __awaiter(this, void 0, void 0, function* () {
const connProviderParams = {
urlPath: url,
responseType: "json",
method: "get",
headers,
};
const connectivityResponse = yield this.connectivityProvider.sendRequestViaDestination(connProviderParams, destinationName);
if (connectivityResponse && connectivityResponse.d && connectivityResponse.d.results) {
return connectivityResponse.d.results;
}
return [];
});
}
DestinationListInfoToC4cProviderSystem(destination) {
return new c4cDestinationProviderSystem_1.C4cDestinationProviderSystem(destination.name, destination.host, service_provider_apis_1.DataType.CATALOG_C4C, (0, systemUtils_1.getProxyType)(destination.proxyType), destination.credentials.authentication, this, destination["product.name"] || destination.productName, destination.description);
}
getMetadataHeaders(credentials) {
const headers = (0, systemUtils_1.getCredentialsHeader)(credentials);
headers.Accept = systemUtils_1.APPLICATION_XML_HEADER;
return headers;
}
}
exports.C4cRetrieve = C4cRetrieve;
//# sourceMappingURL=c4cRetrieve.js.map