UNPKG

@itwin/insights-client

Version:

Insights client for the iTwin platform

130 lines 5.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ODataClient = void 0; const Errors_1 = require("../../common/Errors"); const EntityListIteratorImpl_1 = require("../../common/iterators/EntityListIteratorImpl"); const IteratorUtil_1 = require("../../common/iterators/IteratorUtil"); const OperationsBase_1 = require("../../common/OperationsBase"); const fast_xml_parser_1 = require("fast-xml-parser"); class ODataClient extends OperationsBase_1.OperationsBase { constructor(basePath) { super(basePath ?? OperationsBase_1.REPORTING_BASE_PATH); } async getODataReport(accessToken, reportId) { const url = `${this.basePath}/odata/${encodeURIComponent(reportId)}`; const requestOptions = this.createRequest("GET", accessToken); return this.fetchJSON(url, requestOptions); } async getODataReportEntityPage(accessToken, reportId, odataItem, sequence) { const segments = odataItem.url.split("/"); // region, manifestId, entityType if (segments.length !== 3) { throw new Errors_1.RequiredError("odataItem", "Parameter odataItem item was invalid."); } const url = `${this.basePath}/odata/${encodeURIComponent(reportId)}/${odataItem.url}?sequence=${encodeURIComponent(sequence)}`; const requestOptions = this.createRequest("GET", accessToken); return this.fetchJSON(url, requestOptions); } async getODataReportEntities(accessToken, reportId, odataItem) { const segments = odataItem.url.split("/"); // region, manifestId, entityType if (segments.length !== 3) { throw new Errors_1.RequiredError("odataItem", "Parameter odataItem item was invalid."); } const reportData = []; const oDataReportEntitiesIt = this.getODataReportEntitiesIterator(accessToken, reportId, odataItem); for await (const oDataReportEntity of oDataReportEntitiesIt) { reportData.push(oDataReportEntity); } return reportData; } getODataReportEntitiesIterator(accessToken, reportId, odataItem) { const segments = odataItem.url.split("/"); // region, manifestId, entityType if (segments.length !== 3) { throw new Errors_1.RequiredError("odataItem", "Parameter odataItem item was invalid."); } const url = `${this.basePath}/odata/${encodeURIComponent(reportId)}/${odataItem.url}`; const request = this.createRequest("GET", accessToken); return new EntityListIteratorImpl_1.EntityListIteratorImpl(async () => (0, IteratorUtil_1.getEntityCollectionPage)(url, async (nextUrl) => { const response = await this.fetchJSON(nextUrl, request); const link = { self: { href: nextUrl, }, }; if (response["@odata.nextLink"]) { link.next = { href: response["@odata.nextLink"], }; } return { values: response.value, // eslint-disable-next-line @typescript-eslint/naming-convention _links: link, }; })); } async getODataReportMetadata(accessToken, reportId) { const url = `${this.basePath}/odata/${encodeURIComponent(reportId)}/$metadata`; const requestOptions = this.createRequest("GET", accessToken); const response = await this.fetchData(url, requestOptions); return this.parseXML(response); } async parseXML(response) { const options = { ignoreAttributes: false, attributeNamePrefix: "", transformTagName: (tagName) => tagName.charAt(0).toLowerCase() + tagName.slice(1), }; const parser = new fast_xml_parser_1.XMLParser(options); const text = await response.text(); const parsedXML = parser.parse(text); if (!parsedXML["edmx:Edmx"]["edmx:DataServices"].hasOwnProperty("schema") || !(parsedXML["edmx:Edmx"]["edmx:DataServices"].schema instanceof Array)) { return []; } const schemas = parsedXML["edmx:Edmx"]["edmx:DataServices"].schema; const defaultSchema = schemas.find((s) => s.Namespace === "Default"); if (defaultSchema === undefined) { return []; } const entitySet = this.makeArray(defaultSchema.entityContainer.entitySet); const result = []; for (const entity of entitySet) { result.push(this.getEntitySetByName(entity, schemas)); } return result; } getEntitySetByName(entity, schemas) { const table = { name: entity.Name, columns: [], annotations: [], }; const identifiers = entity.EntityType.split("."); const entityTypes = []; schemas.filter((schema) => schema.Namespace === identifiers[0]) .forEach((schema) => entityTypes.push(...this.makeArray(schema.entityType))); const targetEntity = entityTypes.find((entityType) => entityType.Name === identifiers[1]); const properties = this.makeArray(targetEntity.property); properties.forEach((property) => { table.columns.push({ name: property.Name, type: property.Type, }); }); const annotationNodes = entity.annotation; if (annotationNodes) { const annotations = this.makeArray(annotationNodes); annotations.forEach((annotation) => { table.annotations.push({ term: annotation.Term, stringValue: annotation.String, }); }); } return table; } makeArray(entity) { return entity instanceof Array ? entity : [entity]; } } exports.ODataClient = ODataClient; //# sourceMappingURL=ODataClient.js.map