73 lines
2.3 KiB
JavaScript
73 lines
2.3 KiB
JavaScript
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);
|
|
}
|
|
}
|