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.
 
 
 
 
 

94 lines
2.6 KiB

import { createAnalyticUnitFromObject } from './utils';
import { AnalyticUnit } from './analytic_unit_model';
import { AnalyticUnitId, FindManyQuery } from './types';
import { Collection } from '../../services/data_service/collection';
import { makeDBQ, SortingOrder } from '../../services/data_service';
import { Metric } from 'grafana-datasource-kit';
import * as _ from 'lodash';
const db = makeDBQ(Collection.ANALYTIC_UNITS);
export async function findById(id: AnalyticUnitId): Promise<AnalyticUnit | null> {
let obj = await db.findOne(id);
if (obj === null) {
return null;
}
return createAnalyticUnitFromObject(obj);
}
export async function findMany(query: FindManyQuery): Promise<AnalyticUnit[]> {
const analyticUnits = await db.findMany(query, {
createdAt: SortingOrder.ASCENDING,
name: SortingOrder.ASCENDING
});
if (analyticUnits === null) {
return [];
}
return analyticUnits.map(createAnalyticUnitFromObject);
}
/**
* Creates and updates new unit.id
*
* @param unit to create
* @returns unit.id
*/
export async function create(unit: AnalyticUnit): Promise<AnalyticUnitId> {
let obj = unit.toObject();
return db.insertOne(obj);
}
export async function insertMany(analyticUnits: AnalyticUnit[]): Promise<AnalyticUnitId[]> {
return db.insertMany(analyticUnits);
}
export async function remove(id: AnalyticUnitId): Promise<void> {
// TODO: remove it`s segments
// TODO: remove it`s cache
await db.removeOne(id);
}
/**
* Changes values of analytic unit fields to according values of obj
*
* @param id analytic unit id
* @param obj object with keys and values which need to be updated in analytic unit
*/
export async function update(id: AnalyticUnitId, obj: any) {
const analyticUnitObj = await db.findOne(id);
if(analyticUnitObj === null) {
throw new Error(`Analytic unit ${id} doesn't exist`);
}
const analyticUnit = createAnalyticUnitFromObject(analyticUnitObj);
let updateObj: any = analyticUnit.toPanelObject();
delete updateObj.id;
updateObj = _.mapValues(updateObj, (value, key) => {
if(_.has(obj, key)) {
return obj[key];
}
return value;
});
return db.updateOne(id, updateObj);
}
export async function setStatus(id: AnalyticUnitId, status: string, error?: string) {
return db.updateOne(id, { status, error });
}
export async function setDetectionTime(id: AnalyticUnitId, lastDetectionTime: number) {
return db.updateOne(id, { lastDetectionTime });
}
export async function setAlert(id: AnalyticUnitId, alert: boolean) {
return db.updateOne(id, { alert });
}
export async function setMetric(id: AnalyticUnitId, metric: Metric) {
return db.updateOne(id, { metric });
}