You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

87 lines
3.0 KiB

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<GrafanaPanelTemplate> {
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<void> {
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)
]);
}