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 { let obj = await db.findOne(id); if (obj === null) { return null; } return createAnalyticUnitFromObject(obj); } export async function findMany(query: FindManyQuery): Promise { 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 { let obj = unit.toObject(); return db.insertOne(obj); } export async function insertMany(analyticUnits: AnalyticUnit[]): Promise { return db.insertMany(analyticUnits); } export async function remove(id: AnalyticUnitId): Promise { // 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 }); }