- Add modular DB layer (adapters, migrations, repos, helpers) - Replace localDb/usageDb/requestDetailsDb monoliths with repos - Add Tailscale tunnel integration & status check API - Add /api/cli-tools/all-statuses aggregated endpoint - Add settingsStore (Zustand) and mitm/dbReader - Add DB unit tests (benchmark, concurrent, migration, vs-lowdb)
56 lines
2.2 KiB
JavaScript
56 lines
2.2 KiB
JavaScript
import { getAdapter } from "../driver.js";
|
|
import { parseJson, stringifyJson } from "../helpers/jsonCol.js";
|
|
|
|
const SCOPE = "disabledModels";
|
|
|
|
export async function getDisabledModels() {
|
|
const db = await getAdapter();
|
|
const rows = db.all(`SELECT key, value FROM kv WHERE scope = ?`, [SCOPE]);
|
|
const out = {};
|
|
for (const r of rows) out[r.key] = parseJson(r.value, []);
|
|
return out;
|
|
}
|
|
|
|
export async function getDisabledByProvider(providerAlias) {
|
|
const db = await getAdapter();
|
|
const row = db.get(`SELECT value FROM kv WHERE scope = ? AND key = ?`, [SCOPE, providerAlias]);
|
|
return row ? (parseJson(row.value, []) || []) : [];
|
|
}
|
|
|
|
// Atomic read-merge-write inside a transaction (no JS yield mid-transaction).
|
|
export async function disableModels(providerAlias, ids) {
|
|
if (!providerAlias || !Array.isArray(ids)) return;
|
|
const db = await getAdapter();
|
|
db.transaction(() => {
|
|
const row = db.get(`SELECT value FROM kv WHERE scope = ? AND key = ?`, [SCOPE, providerAlias]);
|
|
const current = row ? (parseJson(row.value, []) || []) : [];
|
|
const merged = [...new Set([...current, ...ids])];
|
|
db.run(
|
|
`INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value`,
|
|
[SCOPE, providerAlias, stringifyJson(merged)]
|
|
);
|
|
});
|
|
}
|
|
|
|
export async function enableModels(providerAlias, ids) {
|
|
if (!providerAlias) return;
|
|
const db = await getAdapter();
|
|
db.transaction(() => {
|
|
if (!Array.isArray(ids) || ids.length === 0) {
|
|
db.run(`DELETE FROM kv WHERE scope = ? AND key = ?`, [SCOPE, providerAlias]);
|
|
return;
|
|
}
|
|
const row = db.get(`SELECT value FROM kv WHERE scope = ? AND key = ?`, [SCOPE, providerAlias]);
|
|
const current = row ? (parseJson(row.value, []) || []) : [];
|
|
const removeSet = new Set(ids);
|
|
const next = current.filter((id) => !removeSet.has(id));
|
|
if (next.length === 0) {
|
|
db.run(`DELETE FROM kv WHERE scope = ? AND key = ?`, [SCOPE, providerAlias]);
|
|
} else {
|
|
db.run(
|
|
`INSERT INTO kv(scope, key, value) VALUES(?, ?, ?) ON CONFLICT(scope, key) DO UPDATE SET value = excluded.value`,
|
|
[SCOPE, providerAlias, stringifyJson(next)]
|
|
);
|
|
}
|
|
});
|
|
}
|