Homelabtoolkit v2
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import { json, error } from '@sveltejs/kit';
|
||||
import { existsSync } from 'fs';
|
||||
import { DatabaseSync } from 'node:sqlite';
|
||||
import { loadUserLookup, normalizeSectionsForUser } from '../../../lib/server/emby-user-db.js';
|
||||
|
||||
export async function POST({ request }) {
|
||||
const { dbPath, changes } = await request.json();
|
||||
if (!dbPath) throw error(400, 'No dbPath provided');
|
||||
if (!existsSync(dbPath)) throw error(404, `Database file not found: ${dbPath}`);
|
||||
if (!changes?.length) return json({ ok: true, count: 0 });
|
||||
|
||||
let db;
|
||||
try {
|
||||
db = new DatabaseSync(dbPath);
|
||||
const userLookup = loadUserLookup(db);
|
||||
|
||||
const keyRow = db
|
||||
.prepare("SELECT UserSettingsKeyId FROM UserSettingsKeys WHERE Name = 'homescreensettings'")
|
||||
.get();
|
||||
if (!keyRow) throw new Error("'homescreensettings' key not found in UserSettingsKeys table");
|
||||
const keyId = keyRow.UserSettingsKeyId;
|
||||
|
||||
const checkStmt = db.prepare(
|
||||
'SELECT 1 FROM UserSettings WHERE UserId = ? AND UserSettingsKeyId = ?'
|
||||
);
|
||||
const updateStmt = db.prepare(
|
||||
'UPDATE UserSettings SET Value = ? WHERE UserId = ? AND UserSettingsKeyId = ?'
|
||||
);
|
||||
const insertStmt = db.prepare(
|
||||
'INSERT INTO UserSettings (UserId, UserSettingsKeyId, Value) VALUES (?, ?, ?)'
|
||||
);
|
||||
|
||||
let count = 0;
|
||||
let normalizedSections = 0;
|
||||
|
||||
// node:sqlite transactions: use db.exec('BEGIN') / db.exec('COMMIT') manually
|
||||
// or wrap in a function with db.transaction() if supported
|
||||
db.exec('BEGIN');
|
||||
try {
|
||||
for (const { userId, sections } of changes) {
|
||||
const user = userLookup.get(String(userId));
|
||||
if (!user) {
|
||||
throw new Error(`UserId ${userId} does not exist in ${dbPath}`);
|
||||
}
|
||||
|
||||
const nextSections = normalizeSectionsForUser(sections, user.embyGuid);
|
||||
if (JSON.stringify(nextSections) !== JSON.stringify(sections)) {
|
||||
normalizedSections += nextSections.length;
|
||||
}
|
||||
|
||||
const value = JSON.stringify({ Sections: nextSections });
|
||||
const exists = checkStmt.get(userId, keyId);
|
||||
if (exists) {
|
||||
updateStmt.run(value, userId, keyId);
|
||||
} else {
|
||||
insertStmt.run(userId, keyId, value);
|
||||
}
|
||||
count++;
|
||||
}
|
||||
db.exec('COMMIT');
|
||||
} catch (err) {
|
||||
db.exec('ROLLBACK');
|
||||
throw err;
|
||||
}
|
||||
|
||||
db.close();
|
||||
return json({ ok: true, count, normalizedSections });
|
||||
} catch (err) {
|
||||
if (db) try { db.close(); } catch { /* ignore */ }
|
||||
throw error(500, err.message);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user