File size: 2,587 Bytes
88c4c60 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | 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;
}
|