@deltares/fews-pi-requests
Version:
Library for making requests to the FEWS PI webservice
249 lines • 9.76 kB
JavaScript
"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