Source: data/DwsLoader.js

import { DataLoader } from "./DataLoader.js";
import { DataFrame } from "./DataFrame.js";

/**
 * The default URL for accessing the DWS (Data Web Service) API. *  */
export const DWS_DEFAULT_URL = 'https://dashboard.awi.de/data-xxl/rest';

/**
 * A loader for data provided by the Data Web Service.
 * 
 * @author rkoppe <roland.koppe@awi.de>
 */
export class DwsLoader extends DataLoader {

    baseUrl = '';

    constructor(baseUrl) {
        super();
        this.baseUrl = baseUrl || DWS_DEFAULT_URL;
    }

    /**
     * Returns a list of available parameters, columns, data streams as Promise.
     * 
     * @return {Promise<String[]>}
     */
    async parameters() {
        // FIXME: switch to search to also retrieve data pool parameters?
        let response = await fetch(this.baseUrl + '/sensors', {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json'
            }
        });

        if (!response.ok) return [];

        let parameters = ['datetime'];
        let json = await response.json();
        for (let i = 0; i < json.length; i++) {
            parameters.push(json[i].code);
        }

        return parameters;
    }

    /**
     * Returns a DataFrame of the content as Promise.
     * 
     * FIXME: support generic but compiled? filters, remove defined attributes
     * 
     * @param {*} parameters 
     * @param {*} beginDate 
     * @param {*} endDate 
     * @param {*} limit 
     * @param {*} aggregate 
     * @param {*} aggregateFunctions 
     * @return {Promise<DataFrame>} Promise<DataFrame>
     */
    async data(parameters, beginDate, endDate, limit, aggregate = 'HOUR', aggregateFunctions = ['MEAN']) {
        const request = {
            sensors: parameters,
            beginDate: beginDate,
            endDate: endDate,
            limit: limit
        };

        if (aggregate) {
            request.aggregate = aggregate;
            if (aggregate.toLowerCase() != "second") request.aggregateFunctions = aggregateFunctions;
        }

        let response = await fetch(this.baseUrl + '/data/bulk', {
            method: 'POST',
            body: JSON.stringify(request),
            headers: {
                'Content-Type': 'application/json',
                'Accept': 'text/tab-separated-values'
            }
        });

        if (!response.ok) return null;

        let content = await response.text();
        let df = new DataFrame();
        df.read(content, '\t');
        return df;
    }
}