import { GrafanaPanelTemplate, GrafanaTemplateVariables } from '../models/grafana_panel_model'; import * as AnalyticUnit from '../models/analytic_units'; import * as AnalyticUnitCache from '../models/analytic_unit_cache_model'; import * as DetectionSpan from '../models/detection_model'; import * as Segment from '../models/segment_model'; import * as _ from 'lodash'; export async function exportPanel(panelId: string): Promise { const analyticUnits = await AnalyticUnit.findMany({ panelId }); const analyticUnitIds = analyticUnits.map(analyticUnit => analyticUnit.id); const [caches, detectionSpans, segments] = await Promise.all([ AnalyticUnitCache.findMany({ _id: { $in: analyticUnitIds } }), DetectionSpan.findByAnalyticUnitIds(analyticUnitIds), Segment.findByAnalyticUnitIds(analyticUnitIds) ]); // TODO: not any let analyticUnitTemplates: any[] = []; analyticUnits.forEach(analyticUnit => { const analyticUnitTemplate = analyticUnit.toTemplate(); let analyticUnitCache = _.find(caches, cache => cache.id === analyticUnit.id) || null; if(analyticUnitCache !== null) { analyticUnitCache = analyticUnitCache.toTemplate(); } const analyticUnitSegments = segments .filter(segment => segment.analyticUnitId === analyticUnit.id) .map(segment => segment.toTemplate()); const analyticUnitSpans = detectionSpans .filter(span => span.analyticUnitId === analyticUnit.id) .map(span => span.toTemplate()); analyticUnitTemplates.push({ ...analyticUnitTemplate, cache: analyticUnitCache, segments: analyticUnitSegments, detectionSpans: analyticUnitSpans }); }); return { analyticUnitTemplates }; } export async function importPanel( panelTemplate: GrafanaPanelTemplate, variables: GrafanaTemplateVariables ): Promise { await Promise.all(panelTemplate.analyticUnitTemplates.map( template => _importAnalyticUnitTemplate(template, variables) )); } export async function _importAnalyticUnitTemplate(analyticUnitTemplate: any, variables: GrafanaTemplateVariables) { analyticUnitTemplate.grafanaUrl = variables.grafanaUrl; analyticUnitTemplate.panelId = variables.panelId; analyticUnitTemplate.metric.datasource.url = variables.datasourceUrl; const cache = _.clone(analyticUnitTemplate.cache); const segments = _.clone(analyticUnitTemplate.segments); const detectionSpans = _.clone(analyticUnitTemplate.detectionSpans); delete analyticUnitTemplate.cache; delete analyticUnitTemplate.segments; delete analyticUnitTemplate.detectionSpans; const [ newAnalyticUnitId ] = await AnalyticUnit.insertMany([analyticUnitTemplate]); if(cache !== null) { cache._id = newAnalyticUnitId; } segments.forEach(segment => segment.analyticUnitId = newAnalyticUnitId); detectionSpans.forEach(detectionSpan => detectionSpan.analyticUnitId = newAnalyticUnitId); return Promise.all([ AnalyticUnitCache.insertMany([cache]), Segment.insertMany(segments), DetectionSpan.insertMany(detectionSpans) ]); }