fix(logging): sync database log settings with pipeline toggle

This commit is contained in:
Jan Leon
2026-05-27 12:48:58 +02:00
parent f8e726fd1c
commit 97cdf039b2
3 changed files with 63 additions and 0 deletions

View File

@@ -9,6 +9,7 @@ import {
getRequestDetailLogCount,
isDetailedLoggingEnabled,
} from "@/lib/db/detailedLogs";
import { getUserDatabaseSettings, updateDatabaseSettings } from "@/lib/db/databaseSettings";
import { updateSettings } from "@/lib/db/settings";
export const dynamic = "force-dynamic";
@@ -36,6 +37,14 @@ export async function POST(req: NextRequest) {
const enabled = body.enabled === true || body.enabled === "1";
await updateSettings({ call_log_pipeline_enabled: enabled });
const databaseSettings = getUserDatabaseSettings();
updateDatabaseSettings({
logs: {
...databaseSettings.logs,
detailedLogsEnabled: enabled,
callLogPipelineEnabled: enabled,
},
});
return NextResponse.json({
success: true,

View File

@@ -83,6 +83,17 @@ function parseStoredValue(rawValue: unknown): unknown {
}
}
function toBooleanSetting(value: unknown): boolean | null {
if (typeof value === "boolean") return value;
if (typeof value === "number") return value !== 0;
if (typeof value !== "string") return null;
const normalized = value.trim().toLowerCase();
if (["1", "true", "yes", "on"].includes(normalized)) return true;
if (["0", "false", "no", "off"].includes(normalized)) return false;
return null;
}
function readNamespace(namespace: string): Record<string, unknown> {
const db = getDbInstance();
const rows = db
@@ -119,6 +130,18 @@ function mergeTopLevelSections(target: UserDatabaseSettings, values: Record<stri
}
}
function mergeRuntimeLogSettings(target: UserDatabaseSettings, values: Record<string, unknown>) {
const pipelineEnabled = toBooleanSetting(values.call_log_pipeline_enabled);
if (pipelineEnabled !== null) {
target.logs.callLogPipelineEnabled = pipelineEnabled;
}
const legacyDetailedEnabled = toBooleanSetting(values.detailed_logs_enabled);
if (legacyDetailedEnabled !== null) {
target.logs.detailedLogsEnabled = legacyDetailedEnabled;
}
}
function mergeDatabaseSettingsNamespace(
target: UserDatabaseSettings,
values: Record<string, unknown>
@@ -195,6 +218,7 @@ export function getUserDatabaseSettings(): UserDatabaseSettings {
mergeTopLevelSections(settings, mainSettings);
mergeDatabaseSettingsNamespace(settings, readNamespace(DATABASE_SETTINGS_NAMESPACE));
mergeRuntimeLogSettings(settings, mainSettings);
return settings;
}
@@ -236,6 +260,14 @@ export function updateDatabaseSettings(
const insert = db.prepare(
"INSERT OR REPLACE INTO key_value (namespace, key, value) VALUES (?, ?, ?)"
);
const settingsInsert = db.prepare(
"INSERT OR REPLACE INTO key_value (namespace, key, value) VALUES ('settings', ?, ?)"
);
const requestedLogs = updates.logs as Partial<UserDatabaseSettings["logs"]> | undefined;
const pipelineEnabled =
requestedLogs?.callLogPipelineEnabled ?? requestedLogs?.detailedLogsEnabled;
const tx = db.transaction(() => {
for (const section of DATABASE_SETTINGS_SECTIONS) {
const sectionValues = nextSettings[section] as Record<string, unknown>;
@@ -244,6 +276,10 @@ export function updateDatabaseSettings(
insert.run(DATABASE_SETTINGS_NAMESPACE, `${section}.${key}`, JSON.stringify(value));
}
}
if (pipelineEnabled !== undefined) {
settingsInsert.run("call_log_pipeline_enabled", JSON.stringify(Boolean(pipelineEnabled)));
}
});
tx();

View File

@@ -11,6 +11,7 @@ process.env.DISABLE_SQLITE_AUTO_BACKUP = "true";
const core = await import("../../src/lib/db/core.ts");
const databaseSettings = await import("../../src/lib/db/databaseSettings.ts");
const databaseSettingsRoute = await import("../../src/app/api/settings/database/route.ts");
const settingsDb = await import("../../src/lib/db/settings.ts");
const cleanup = await import("../../src/lib/db/cleanup.ts");
const aggregateHistory = await import("../../src/lib/usage/aggregateHistory.ts");
@@ -101,6 +102,23 @@ test("database settings reader supports legacy flat keys and lets nested saves w
assert.equal(databaseSettings.getUserDatabaseSettings().retention.callLogs, 7);
});
test("database log settings mirror the runtime pipeline toggle", async () => {
await settingsDb.updateSettings({ call_log_pipeline_enabled: false });
assert.equal(databaseSettings.getUserDatabaseSettings().logs.callLogPipelineEnabled, false);
databaseSettings.updateDatabaseSettings({
logs: {
...databaseSettings.getUserDatabaseSettings().logs,
callLogPipelineEnabled: true,
},
});
const settings = await settingsDb.getSettings();
assert.equal(settings.call_log_pipeline_enabled, true);
assert.equal(databaseSettings.getUserDatabaseSettings().logs.callLogPipelineEnabled, true);
});
test("purgeDetailedLogs deletes request_detail_logs", async () => {
const db = core.getDbInstance();
db.prepare("INSERT INTO request_detail_logs (id, timestamp, duration_ms) VALUES (?, ?, ?)").run(