Home Reference Source

src/sagas/api.js

import moment from 'moment';
import escapeStringRegexp from 'escape-string-regexp';
import { select, call, put, all } from 'redux-saga/effects';
import { getAuthServer, getToken, getMonitorByHost, getLiveChartByMonitors, getLiveChartLastTime,
    getHistoricalChartsByMonitors, getLiveChartById, getHistoricalChartById } from '../reducers';
import * as actions from '../actions/sync';
import * as api from '../api';
import { getStartTimeForLiveCharts } from '../times';

export function* signUp({ payload }) {
    const server = yield select(getAuthServer);
    try {
        const result = yield call(api.registration, server, payload);
        yield put(actions.signUpSuccess(result));
    }
    catch (error) {
        yield put(actions.signUpFailure(error));
    }
}

export function* signIn({ payload }) {
    const server = yield select(getAuthServer);
    try {
        const result = yield call(api.login, server, payload);
        yield put(actions.signInSuccess(result));
    }
    catch (error) {
        yield put(actions.signInFailure(error));
    }
}

export function* addComplexMetric({ payload, meta }) {
    const token = yield select(getToken);
    const monitor = yield select(getMonitorByHost, meta.host);
    try {
        const result = yield call(api.postComplexMetric, monitor, token, meta.host, payload);
        yield put(actions.addComplexMetricSuccess({ ...payload, ...result }, meta.host));
    }
    catch (error) {
        yield put(actions.addComplexMetricFailure(error, meta.host));
    }
}

export function* removeComplexMetric({ meta }) {
    const token = yield select(getToken);
    const monitor = yield select(getMonitorByHost, meta.host);
    try {
        yield call(api.deleteComplexMetric, monitor, token, meta.host, meta.id);
        yield put(actions.removeComplexMetricSucces(meta.id, meta.host));
    }
    catch (error) {
        yield put(actions.removeComplexMetricFailure(error, meta.host));
    }
}

export function* getHosts({ meta }) {
    const token = yield select(getToken);
    try {
        const result = yield call(api.getHosts, meta.monitor, token);
        yield put(actions.getHostsSuccess(result, meta.monitor));
    }
    catch (error) {
        yield put(actions.getHostsFailure(error, meta.monitor));
    }
}

export function* getLiveChartMeasurementsForSingleMonitor(initialFetch, id, monitor, hosts) {
    const token = yield select(getToken);
    const { metric } = yield select(getLiveChartById, id);
    let start;
    if (!initialFetch) {
        start = yield select(getLiveChartLastTime, id, monitor);
    }
    if (!start) {
        start = yield call(getStartTimeForLiveCharts);
    }
    try {
        const q = `metric_id:${metric},hostname:/(${hosts.map(escapeStringRegexp).join('|')})/`;
        const data = yield call(api.getMeasurements, monitor, token, { start, q });
        return { data };
    }
    catch (error) {
        return error;
    }
}

export function* getLiveChartMeasurements({ meta }) {
    let { measurements, hostsByMonitors } = yield select(getLiveChartByMonitors, meta.id);
    if (meta.initialFetch) {
        measurements = {};
    }
    if (Object.keys(hostsByMonitors).length) {
        const results = yield all(
            Object.entries(hostsByMonitors).reduce((c, [ monitor, hosts ]) => ({
                ...c,
                [monitor]: call(
                    getLiveChartMeasurementsForSingleMonitor,
                    meta.initialFetch,
                    meta.id,
                    monitor,
                    hosts
                )
            }), {})
        );
        for (const monitor of Object.keys(results)) {
            const result = results[monitor];
            if (!result.data) {
                yield put(actions.getLiveMeasurementsFailure(result, meta.id, monitor));
            }
            else {
                for (const measurement of result.data) {
                    if (meta.initialFetch) {
                        measurements[measurement.hostname] = measurement.data;
                    }
                    else {
                        const hostMeas = measurements[measurement.hostname];
                        const start = yield call(getStartTimeForLiveCharts);
                        const startMom = moment(start);
                        let i = 0;
                        while (i < hostMeas.length && startMom.isAfter(hostMeas[i].time)) {
                            ++i;
                        }
                        measurements[measurement.hostname] = [
                            ...hostMeas.slice(i),
                            ...measurement.data
                        ];
                    }
                }
            }
        }
    }
    yield put(actions.getLiveMeasurementsSuccess({ measurements }, meta.id));
}

export function* getHistoricalChartMeasurementsForSingleMonitor(id, monitor, hosts1, hosts2) {
    const token = yield select(getToken);
    const { metric1, metric2, start, end } = yield select(getHistoricalChartById, id);
    try {
        let q = [];
        if (hosts1) {
            q.push(`metric_id:${metric1},hostname:/(${hosts1.map(escapeStringRegexp).join('|')})/`);
        }
        if (hosts2) {
            q.push(`metric_id:${metric2},hostname:/(${hosts2.map(escapeStringRegexp).join('|')})/`);
        }
        q = q.join(';');
        const data = yield call(api.getMeasurements, monitor, token, { start, end, q });
        return { data };
    }
    catch (error) {
        return error;
    }
}

export function* getHistoricalChartMeasurements({ meta }) {
    const { metric2 } = yield select(getHistoricalChartById, meta.id);
    let measurements1 = {};
    let measurements2 = metric2 ? {} : null;
    const hostsByMetricsAndMonitors = yield select(getHistoricalChartsByMonitors, meta.id);
    if (Object.keys(hostsByMetricsAndMonitors).length) {
        const results = yield all(
            Object.entries(hostsByMetricsAndMonitors).reduce((c, [ monitor, { hosts1, hosts2 }]) => ({
                ...c,
                [monitor]: call(
                    getHistoricalChartMeasurementsForSingleMonitor,
                    meta.id,
                    monitor,
                    hosts1,
                    hosts2
                )
            }), {})
        );
        for (const monitor of Object.keys(results)) {
            const result = results[monitor];
            if (!result.data) {
                yield put(actions.getHistoricalMeasurementsFailure(result, meta.id, monitor));
            }
            else {
                for (const measurement of result.data) {
                    if (measurement.metric_id === metric2) {
                        measurements2[measurement.hostname] = measurement.data;
                    }
                    else {
                        measurements1[measurement.hostname] = measurement.data;
                    }
                }
            }
        }
    }
    yield put(actions.getHistoricalMeasurementsSuccess({ measurements1, measurements2 }, meta.id));
}