import { json, type RequestHandler } from '@sveltejs/kit'; import { getUserPreference, setUserPreference } from '$lib/server/db'; import { authorize } from '$lib/server/authorize'; // Store all dashboard prefs as a single JSON blob to avoid the chained .where() bug // in getUserPreference/setUserPreference (chained .where() replaces instead of ANDing) const DASHBOARD_PREFS_KEY = 'dashboard_prefs'; interface StoredDashboardPrefs { gridLayout: any[]; locked: boolean; viewMode: 'grid' | 'list'; } async function getPrefs(userId: number | null): Promise { const stored = await getUserPreference({ userId, environmentId: null, key: DASHBOARD_PREFS_KEY }); if (stored && typeof stored === 'object' && Array.isArray(stored.gridLayout)) { return { gridLayout: stored.gridLayout, locked: stored.locked ?? false, viewMode: stored.viewMode ?? 'grid' }; } // Migration: try reading from old dashboard_layout key const oldLayout = await getUserPreference({ userId, environmentId: null, key: 'dashboard_layout' }); return { gridLayout: Array.isArray(oldLayout) ? oldLayout : [], locked: false, viewMode: 'grid' }; } async function savePrefs(userId: number | null, prefs: StoredDashboardPrefs): Promise { await setUserPreference( { userId, environmentId: null, key: DASHBOARD_PREFS_KEY }, prefs ); } /** * @openapi * summary: Get the current user's dashboard preferences (grid layout, lock state, view mode) * resp-200: {gridLayout:array<{}>, locked:boolean!, viewMode:string!} * resp-200-example: {"gridLayout":[],"locked":false,"viewMode":"grid"} * resp-500: Failed to get dashboard preferences */ export const GET: RequestHandler = async ({ cookies }) => { const auth = await authorize(cookies); try { const userId = auth.user?.id ?? null; const prefs = await getPrefs(userId); return json(prefs); } catch (error) { console.error('Failed to get dashboard preferences:', error); return json({ error: 'Failed to get dashboard preferences' }, { status: 500 }); } }; /** * @openapi * summary: Update the current user's dashboard preferences (only provided fields are merged) * body: {gridLayout:array<{}>, locked:boolean, viewMode:string} * body-example: {"locked":true,"viewMode":"list"} * resp-200: {gridLayout:array<{}>, locked:boolean!, viewMode:string!} * resp-500: Failed to save dashboard preferences */ export const POST: RequestHandler = async ({ request, cookies }) => { const auth = await authorize(cookies); try { const body = await request.json(); const userId = auth.user?.id ?? null; // Load current prefs and merge changes const current = await getPrefs(userId); if (body.gridLayout && Array.isArray(body.gridLayout)) { current.gridLayout = body.gridLayout; } if (body.locked !== undefined) { current.locked = body.locked; } if (body.viewMode !== undefined) { current.viewMode = body.viewMode; } await savePrefs(userId, current); return json(current); } catch (error) { console.error('Failed to save dashboard preferences:', error); return json({ error: 'Failed to save dashboard preferences' }, { status: 500 }); } };