Simpl-Resultat/src/services/userPreferenceService.ts
le king fu 80c28d43ac
All checks were successful
PR Check / rust (push) Successful in 28m16s
PR Check / frontend (push) Successful in 3m0s
PR Check / rust (pull_request) Successful in 29m45s
PR Check / frontend (pull_request) Successful in 3m6s
feat(prices): Settings revocation toggle for price_fetching_consent
- Adds PriceFetchConsentToggle to SettingsPage Privacy section
- Reads/writes user_preferences.price_fetching_consent for active profile
- Confirmation dialog before revoke (DELETE the key entirely so next click re-opens consent modal)
- Disabled (with notPremium tooltip) when license is not premium
- Adds deletePreference() to userPreferenceService
- Adds settings.privacy.title i18n key (FR + EN)
- 10 vitest tests covering all paths

Closes #159
2026-04-27 08:41:15 -04:00

40 lines
1.1 KiB
TypeScript

import { getDb } from "./db";
import type { UserPreference } from "../shared/types";
export async function getPreference(key: string): Promise<string | null> {
const db = await getDb();
const rows = await db.select<UserPreference[]>(
"SELECT * FROM user_preferences WHERE key = $1",
[key]
);
return rows.length > 0 ? rows[0].value : null;
}
export async function setPreference(
key: string,
value: string
): Promise<void> {
const db = await getDb();
await db.execute(
`INSERT INTO user_preferences (key, value, updated_at)
VALUES ($1, $2, CURRENT_TIMESTAMP)
ON CONFLICT(key) DO UPDATE SET value = $2, updated_at = CURRENT_TIMESTAMP`,
[key, value]
);
}
export async function deletePreference(key: string): Promise<void> {
const db = await getDb();
await db.execute(
"DELETE FROM user_preferences WHERE key = $1",
[key]
);
}
export async function getImportFolder(): Promise<string | null> {
return getPreference("import_folder");
}
export async function setImportFolder(path: string): Promise<void> {
return setPreference("import_folder", path);
}