feat(datapoints): add datapoint manager with CRUD and transform support (Task 6)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
7b60fc252d
commit
47d746cf71
136
display/middleware/src/modules/datapoints/datapoint-manager.ts
Normal file
136
display/middleware/src/modules/datapoints/datapoint-manager.ts
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
import { getDb } from '../../db/index';
|
||||||
|
import { applyTransform, type TransformConfig } from './transforms';
|
||||||
|
|
||||||
|
export interface Datapoint {
|
||||||
|
id: number;
|
||||||
|
name: string;
|
||||||
|
label: string;
|
||||||
|
unit: string | null;
|
||||||
|
value: string | null;
|
||||||
|
status: string;
|
||||||
|
source_type: string;
|
||||||
|
source_id: number;
|
||||||
|
topic_id: number | null;
|
||||||
|
query_id: number | null;
|
||||||
|
transform: string | null;
|
||||||
|
enabled: number;
|
||||||
|
updated_at: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DatapointUpdate {
|
||||||
|
label?: string;
|
||||||
|
unit?: string;
|
||||||
|
transform?: string | null;
|
||||||
|
enabled?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAllDatapoints(): Datapoint[] {
|
||||||
|
const db = getDb();
|
||||||
|
return db
|
||||||
|
.prepare('SELECT * FROM datapoints WHERE enabled = 1')
|
||||||
|
.all() as Datapoint[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDatapointById(id: number): Datapoint | undefined {
|
||||||
|
const db = getDb();
|
||||||
|
return db
|
||||||
|
.prepare('SELECT * FROM datapoints WHERE id = ?')
|
||||||
|
.get(id) as Datapoint | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateDatapointValue(id: number, rawValue: string): Datapoint | undefined {
|
||||||
|
const db = getDb();
|
||||||
|
const dp = db.prepare('SELECT * FROM datapoints WHERE id = ?').get(id) as Datapoint | undefined;
|
||||||
|
if (!dp) return undefined;
|
||||||
|
|
||||||
|
let config: TransformConfig | null = null;
|
||||||
|
if (dp.transform) {
|
||||||
|
try {
|
||||||
|
config = JSON.parse(dp.transform) as TransformConfig;
|
||||||
|
} catch {
|
||||||
|
config = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const transformed = applyTransform(rawValue, config);
|
||||||
|
|
||||||
|
db.run(
|
||||||
|
`UPDATE datapoints SET value = ?, status = 'ok', updated_at = datetime('now') WHERE id = ?`,
|
||||||
|
[transformed, id]
|
||||||
|
);
|
||||||
|
|
||||||
|
return db.prepare('SELECT * FROM datapoints WHERE id = ?').get(id) as Datapoint | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateDatapoint(id: number, data: DatapointUpdate): Datapoint | undefined {
|
||||||
|
const db = getDb();
|
||||||
|
const fields: string[] = [];
|
||||||
|
const values: unknown[] = [];
|
||||||
|
|
||||||
|
if (data.label !== undefined) {
|
||||||
|
fields.push('label = ?');
|
||||||
|
values.push(data.label);
|
||||||
|
}
|
||||||
|
if (data.unit !== undefined) {
|
||||||
|
fields.push('unit = ?');
|
||||||
|
values.push(data.unit);
|
||||||
|
}
|
||||||
|
if (data.transform !== undefined) {
|
||||||
|
fields.push('transform = ?');
|
||||||
|
values.push(data.transform);
|
||||||
|
}
|
||||||
|
if (data.enabled !== undefined) {
|
||||||
|
fields.push('enabled = ?');
|
||||||
|
values.push(data.enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fields.length === 0) return getDatapointById(id);
|
||||||
|
|
||||||
|
values.push(id);
|
||||||
|
db.run(`UPDATE datapoints SET ${fields.join(', ')} WHERE id = ?`, values);
|
||||||
|
return getDatapointById(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDatapointFromMqtt(
|
||||||
|
brokerId: number,
|
||||||
|
topicId: number,
|
||||||
|
topicPath: string
|
||||||
|
): Datapoint {
|
||||||
|
const db = getDb();
|
||||||
|
const result = db.run(
|
||||||
|
`INSERT INTO datapoints (name, label, source_type, source_id, topic_id, enabled)
|
||||||
|
VALUES (?, ?, 'mqtt', ?, ?, 1)`,
|
||||||
|
[topicPath, topicPath, brokerId, topicId]
|
||||||
|
);
|
||||||
|
const id = result.lastInsertRowid as number;
|
||||||
|
return db.prepare('SELECT * FROM datapoints WHERE id = ?').get(id) as Datapoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createDatapointFromPg(
|
||||||
|
sourceId: number,
|
||||||
|
queryId: number,
|
||||||
|
queryName: string
|
||||||
|
): Datapoint {
|
||||||
|
const db = getDb();
|
||||||
|
const result = db.run(
|
||||||
|
`INSERT INTO datapoints (name, label, source_type, source_id, query_id, enabled)
|
||||||
|
VALUES (?, ?, 'postgresql', ?, ?, 1)`,
|
||||||
|
[queryName, queryName, sourceId, queryId]
|
||||||
|
);
|
||||||
|
const id = result.lastInsertRowid as number;
|
||||||
|
return db.prepare('SELECT * FROM datapoints WHERE id = ?').get(id) as Datapoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDatapointByTopicId(topicId: number): Datapoint | undefined {
|
||||||
|
const db = getDb();
|
||||||
|
return db
|
||||||
|
.prepare('SELECT * FROM datapoints WHERE topic_id = ?')
|
||||||
|
.get(topicId) as Datapoint | undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDatapointByQueryId(queryId: number): Datapoint | undefined {
|
||||||
|
const db = getDb();
|
||||||
|
return db
|
||||||
|
.prepare('SELECT * FROM datapoints WHERE query_id = ?')
|
||||||
|
.get(queryId) as Datapoint | undefined;
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user