import { IDashboard } from "App/mstore/types/dashboard"; import APIClient from 'App/api_client'; import { IWidget } from "App/mstore/types/widget"; export interface IDashboardService { initClient(client?: APIClient) getWidgets(dashboardId: string): Promise getDashboards(): Promise getDashboard(dashboardId: string): Promise saveDashboard(dashboard: IDashboard): Promise deleteDashboard(dashboardId: string): Promise saveMetric(metric: IWidget, dashboardId?: string): Promise addWidget(dashboard: IDashboard, metricIds: []): Promise saveWidget(dashboardId: string, widget: IWidget): Promise deleteWidget(dashboardId: string, widgetId: string): Promise } export default class DashboardService implements IDashboardService { private client: APIClient; constructor(client?: APIClient) { this.client = client ? client : new APIClient(); } initClient(client?: APIClient) { this.client = client || new APIClient(); } /** * Get all widgets from a dashboard. * @param dashboardId Required * @returns */ getWidgets(dashboardId: string): Promise { return this.client.get(`/dashboards/${dashboardId}/widgets`) .then(response => response.json()) .then(response => response.data || []); } /** * Get all dashboards. * @returns {Promise} */ getDashboards(): Promise { return this.client.get('/dashboards') .then(response => response.json()) .then(response => response.data || []); } /** * Get a dashboard by dashboardId. * @param dashboardId * @returns {Promise} */ getDashboard(dashboardId: string): Promise { return this.client.get('/dashboards/' + dashboardId) .then(response => response.json()) .then(response => response.data || {}); } /** * Create or update a dashboard. * @param dashboard Required * @returns {Promise} */ saveDashboard(dashboard: IDashboard): Promise { const data = dashboard.toJson(); if (dashboard.dashboardId) { return this.client.put(`/dashboards/${dashboard.dashboardId}`, data) .then(response => response.json()) .then(response => response.data || {}); } else { return this.client.post('/dashboards', data) .then(response => response.json()) .then(response => response.data || {}); } } /** * Add a widget to a dashboard. * @param dashboard * @param metricIds * @returns */ addWidget(dashboard: IDashboard, metricIds: any): Promise { const data = dashboard.toJson() data.metrics = metricIds return this.client.put(`/dashboards/${dashboard.dashboardId}`, data) .then(response => response.json()) .then(response => response.data || {}); } /** * Delete a dashboard. * @param dashboardId * @returns {Promise} */ deleteDashboard(dashboardId: string): Promise { return this.client.delete(`/dashboards/${dashboardId}`) } /** * Create a new Meitrc, if the dashboardId is not provided, * it will add the metric to the dashboard. * @param metric Required * @param dashboardId Optional * @returns {Promise} */ saveMetric(metric: IWidget, dashboardId?: string): Promise { const data = metric.toJson(); // const path = dashboardId ? `/metrics` : '/metrics'; // TODO change to /dashboards/:dashboardId/widgets const path = dashboardId ? `/dashboards/${dashboardId}/metrics` : '/metrics'; if (metric.widgetId) { return this.client.put(path + '/' + metric.widgetId, data) } else { return this.client.post(path, data) } } /** * Remove a widget from a dashboard. * @param dashboardId Required * @param widgetId Required * @returns {Promise} */ deleteWidget(dashboardId: string, widgetId: string): Promise { return this.client.delete(`/dashboards/${dashboardId}/widgets/${widgetId}`) } /** * Add a widget to a dashboard. * @param dashboardId Required * @param widget Required * @returns {Promise} */ saveWidget(dashboardId: string, widget: IWidget): Promise { return this.client.post(`/dashboards/${dashboardId}/widgets`, widget.toJson()) } }