UNPKG

@deltares/fews-pi-requests

Version:

Library for making requests to the FEWS PI webservice

249 lines 9.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PiArchiveWebserviceProvider = void 0; const index_js_1 = require("./utils/index.js"); const index_js_2 = require("./requestParameters/index.js"); const fews_web_oc_utils_1 = require("@deltares/fews-web-oc-utils"); const attributesForKey = { parameterIds: 'long_name', }; class PiArchiveWebserviceProvider { baseUrl; maxUrlLength; API_ENDPOINT = 'rest/fewspiservice/v1'; webservice; addPiJsonFormat(queryParameters) { const preFix = queryParameters.length == 0 ? "?" : "&"; return queryParameters + preFix + "documentFormat=" + index_js_2.DocumentFormat.PI_JSON; } /** * Constructor for PiArchiveWebserviceProvider * * @param url the base url where the PI servive is available * @param {Object} [options] Optional constructor options * @param {number} [options.maxUrlLength] A number that specifies the maximum length of the URL. If the URL length exceeds this value, the requests will be split up. * @param {TransformRequestFunction} [options.transformRequestFn] A function that can be used to modify the Request * before it is sent to the server. This function takes a Request as a parameter and returns the modified Request. * If this option is not specified, the Request will be sent as is. */ constructor(url, options = {}) { if (!url.endsWith("/")) { url += "/"; } this.baseUrl = (0, index_js_1.absoluteUrl)(url); this.maxUrlLength = options.maxUrlLength ?? Infinity; this.webservice = new fews_web_oc_utils_1.PiRestService(url, options.transformRequestFn); } /** * Request parameters * * @param filter an object with request query parameters * @returns Parameters PI API response * @throws 'Fetch Error' if fetch result is not ok */ async getParameters(filter) { const url = this.parametersUrl(filter); const res = await this.webservice.getData(url.toString()); return res.data; } /** * Construct URL for parameters request * * @param filter an object with request query parameters * @returns complete url for making a request */ parametersUrl(filter) { const queryParameters = (0, index_js_1.filterToParams)(filter); return new URL(`${this.baseUrl.pathname}${this.API_ENDPOINT}/archive/parameters${queryParameters}`, this.baseUrl); } /** * Request locations from the archive * * @param filter an object with request query parameters * @returns Locations PI API response * @throws 'Fetch Error' if fetch result is not ok */ async getLocations(filter) { const url = this.locationsUrl(filter); const res = await this.webservice.getData(url.toString()); return res.data; } /** * Construct URL for locations request * * @param filter an object with request query parameters * @returns complete url for making a request */ locationsUrl(filter) { const queryParameters = (0, index_js_1.filterToParams)(filter); return new URL(`${this.baseUrl.pathname}${this.API_ENDPOINT}/archive/locations${queryParameters}`, this.baseUrl); } /** * Request areas from the archive * * @param filter an object with request query parameters * @returns ArchiveAreas PI API response * @throws 'Fetch Error' if fetch result is not ok */ async getAreas(filter) { const url = this.areasUrl(filter); const res = await this.webservice.getData(url.toString()); return res.data; } /** * Construct URL for archive areas request * * @param filter an object with request query parameters * @returns complete url for making a request */ areasUrl(filter) { const queryParameters = (0, index_js_1.filterToParams)(filter); return new URL(`${this.baseUrl.pathname}${this.API_ENDPOINT}/archive/areas${queryParameters}`, this.baseUrl); } /** * Request sources from the archive * * @param filter an object with request query parameters * @returns ArchiveSources PI API response * @throws 'Fetch Error' if fetch result is not ok */ async getSources(filter) { const url = this.sourcesUrl(filter); const res = await this.webservice.getData(url.toString()); return res.data; } /** * Construct URL for archive sources request * * @param filter an object with request query parameters * @returns complete url for making a request */ sourcesUrl(filter) { const queryParameters = (0, index_js_1.filterToParams)(filter); return new URL(`${this.baseUrl.pathname}${this.API_ENDPOINT}/archive/sources${queryParameters}`, this.baseUrl); } /** * Request attributes * * @param filter an object with request query parameters * @returns Attributes PI API response * @throws 'Fetch Error' if fetch result is not ok */ async getAttributes(filter) { const url = this.attributesUrl(filter); const res = await this.webservice.getData(url.toString()); return res.data; } /** * Construct URL for attribute request * * @param filter an object with request query parameters * @returns complete url for making a request */ attributesUrl(filter) { const queryParameters = (0, index_js_1.filterToParams)(filter); return new URL(`${this.baseUrl.pathname}${this.API_ENDPOINT}/archive/attributes${queryParameters}`, this.baseUrl); } /** * Request external forecasts * * @param filter an object with request query parameters * @returns External Forecasts PI API response * @throws 'Fetch Error' if fetch result is not ok */ async getExternalForecasts(filter) { const mappedFilter = {}; for (const [key, value] of Object.entries(filter)) { if (key in Object.keys(attributesForKey)) { mappedFilter[attributesForKey[key]] = value; } else { mappedFilter[key] = value; } } const defaults = { documentFormat: index_js_2.DocumentFormat.PI_JSON, }; const filterWithDefaults = { ...mappedFilter, ...defaults }; const url = this.externalForecastsUrl(filterWithDefaults); const res = await this.webservice.getData(url.toString()); return res.data; } /** * Construct URL for external forecast request * * @param filter an object with request query parameters * @returns complete url for making a request */ externalForecastsUrl(filter) { const queryParameters = (0, index_js_1.filterToParams)(filter); return new URL(`${this.baseUrl.pathname}${this.API_ENDPOINT}/archive/netcdfstorageforecasts${queryParameters}`, this.baseUrl); } /** * Request product metadata from archive * * @param filter an object with request query parameters * @returns ProductsMetaData PI API response * @throws 'Fetch Error' if fetch result is not ok */ async getProductsMetaData(filter) { const queryParameters = (0, index_js_1.filterToParams)(filter); const url = this.productsMetaDataUrl(queryParameters); const res = await this.webservice.getData(url.toString()); return res.data; } /** * Construct URL for locations request * * @param queryParameters query string * @returns complete url for making a request */ productsMetaDataUrl(queryParameters) { return new URL(`${this.baseUrl.pathname}${this.API_ENDPOINT}/archive/productsmetadata${queryParameters}`, this.baseUrl); } /** * Request Time Series * * @param filter an object with request query parameters * @returns Time Series PI API response * @throws 'Fetch Error' if fetch result is not ok */ async getTimeSeries(filter) { const defaults = { documentFormat: index_js_2.DocumentFormat.PI_JSON, }; const filterWithDefaults = { ...defaults, ...filter }; const url = this.timeSeriesUrl(filterWithDefaults); if (url.toString().length <= this.maxUrlLength) { const res = await this.webservice.getData(url.toString()); return res.data; } else { const urls = (0, index_js_1.splitUrl)(url, this.maxUrlLength); const promises = urls.map((u) => this.webservice.getData(u.toString())); return Promise.all(promises).then((responses) => { const response = responses[0].data; if (response.timeSeries !== undefined) { for (let i = 1; i < responses.length; i++) { if (responses[i].data.timeSeries === undefined) continue; response.timeSeries.push(...responses[i].data.timeSeries || []); } } return response; }); } } /** * Construct URL for time series request * * @param filter an object with request query parameters * @returns complete url for making a request */ timeSeriesUrl(filter) { const queryParameters = (0, index_js_1.filterToParams)(filter); return new URL(`${this.baseUrl.pathname}${this.API_ENDPOINT}/timeseries${queryParameters}`, this.baseUrl); } } exports.PiArchiveWebserviceProvider = PiArchiveWebserviceProvider; //# sourceMappingURL=piArchiveWebserviceProvider.js.map