106 lines
3.1 KiB
TypeScript
106 lines
3.1 KiB
TypeScript
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<StoredDashboardPrefs> {
|
|
const stored = await getUserPreference<StoredDashboardPrefs>({
|
|
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<any[]>({
|
|
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<void> {
|
|
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 });
|
|
}
|
|
};
|