import { v4 as uuidv4 } from "uuid"; import { getAdapter } from "../driver.js"; import { parseJson, stringifyJson } from "../helpers/jsonCol.js"; function rowToNode(row) { if (!row) return null; const extra = parseJson(row.data, {}); return { ...extra, id: row.id, type: row.type, name: row.name, createdAt: row.createdAt, updatedAt: row.updatedAt, }; } function nodeToRow(n) { const { id, type, name, createdAt, updatedAt, ...rest } = n; return { id, type: type ?? null, name: name ?? null, data: stringifyJson(rest), createdAt, updatedAt, }; } function upsert(db, n) { const r = nodeToRow(n); db.run( `INSERT INTO providerNodes(id, type, name, data, createdAt, updatedAt) VALUES(?, ?, ?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET type=excluded.type, name=excluded.name, data=excluded.data, updatedAt=excluded.updatedAt`, [r.id, r.type, r.name, r.data, r.createdAt, r.updatedAt] ); } export async function getProviderNodes(filter = {}) { const db = await getAdapter(); const where = []; const params = []; if (filter.type) { where.push("type = ?"); params.push(filter.type); } const sql = `SELECT * FROM providerNodes${where.length ? ` WHERE ${where.join(" AND ")}` : ""}`; return db.all(sql, params).map(rowToNode); } export async function getProviderNodeById(id) { const db = await getAdapter(); return rowToNode(db.get(`SELECT * FROM providerNodes WHERE id = ?`, [id])); } export async function createProviderNode(data) { const db = await getAdapter(); const now = new Date().toISOString(); const node = { id: data.id || uuidv4(), type: data.type, name: data.name, prefix: data.prefix, apiType: data.apiType, baseUrl: data.baseUrl, createdAt: now, updatedAt: now, }; upsert(db, node); return node; } export async function updateProviderNode(id, data) { const db = await getAdapter(); let result = null; db.transaction(() => { const row = db.get(`SELECT * FROM providerNodes WHERE id = ?`, [id]); if (!row) return; const merged = { ...rowToNode(row), ...data, updatedAt: new Date().toISOString() }; upsert(db, merged); result = merged; }); return result; } export async function deleteProviderNode(id) { const db = await getAdapter(); let removed = null; db.transaction(() => { const row = db.get(`SELECT * FROM providerNodes WHERE id = ?`, [id]); if (!row) return; removed = rowToNode(row); db.run(`DELETE FROM providerNodes WHERE id = ?`, [id]); }); return removed; }