| 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; |
| } |
|
|