96 lines
2.5 KiB
JavaScript
96 lines
2.5 KiB
JavaScript
|
|
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;
|
||
|
|
}
|