mirror of
https://github.com/khoaliber/dockhand.git
synced 2026-03-05 05:39:04 +00:00
104 lines
3.1 KiB
TypeScript
104 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';
|
|
|
|
const LOGS_FAVORITES_KEY = 'logs_favorites';
|
|
|
|
// Favorites are stored as an array of container names (strings)
|
|
// Per environment, so environmentId is required
|
|
|
|
export const GET: RequestHandler = async ({ url, cookies }) => {
|
|
const auth = await authorize(cookies);
|
|
|
|
try {
|
|
const envId = url.searchParams.get('env');
|
|
if (!envId) {
|
|
return json({ error: 'Environment ID is required' }, { status: 400 });
|
|
}
|
|
|
|
const environmentId = parseInt(envId);
|
|
if (isNaN(environmentId)) {
|
|
return json({ error: 'Invalid environment ID' }, { status: 400 });
|
|
}
|
|
|
|
// userId is null for free edition (shared prefs), set for enterprise
|
|
const userId = auth.user?.id ?? null;
|
|
|
|
const favorites = await getUserPreference<string[]>({
|
|
userId,
|
|
environmentId,
|
|
key: LOGS_FAVORITES_KEY
|
|
});
|
|
|
|
return json({ favorites: favorites ?? [] });
|
|
} catch (error) {
|
|
console.error('Failed to get favorites:', error);
|
|
return json({ error: 'Failed to get favorites' }, { status: 500 });
|
|
}
|
|
};
|
|
|
|
export const POST: RequestHandler = async ({ request, cookies }) => {
|
|
const auth = await authorize(cookies);
|
|
|
|
try {
|
|
const body = await request.json();
|
|
const { containerName, environmentId, action, favorites: newOrder } = body;
|
|
|
|
if (!environmentId || typeof environmentId !== 'number') {
|
|
return json({ error: 'Environment ID is required' }, { status: 400 });
|
|
}
|
|
|
|
if (!action || (action !== 'add' && action !== 'remove' && action !== 'reorder')) {
|
|
return json({ error: 'Action must be "add", "remove", or "reorder"' }, { status: 400 });
|
|
}
|
|
|
|
// userId is null for free edition (shared prefs), set for enterprise
|
|
const userId = auth.user?.id ?? null;
|
|
|
|
let newFavorites: string[];
|
|
|
|
if (action === 'reorder') {
|
|
// Reorder action: replace entire favorites array
|
|
if (!Array.isArray(newOrder)) {
|
|
return json({ error: 'favorites array is required for reorder action' }, { status: 400 });
|
|
}
|
|
newFavorites = newOrder;
|
|
} else {
|
|
// Add/remove actions require containerName
|
|
if (!containerName || typeof containerName !== 'string') {
|
|
return json({ error: 'Container name is required' }, { status: 400 });
|
|
}
|
|
|
|
// Get current favorites
|
|
const currentFavorites = await getUserPreference<string[]>({
|
|
userId,
|
|
environmentId,
|
|
key: LOGS_FAVORITES_KEY
|
|
}) ?? [];
|
|
|
|
if (action === 'add') {
|
|
// Add to favorites if not already present
|
|
if (!currentFavorites.includes(containerName)) {
|
|
newFavorites = [...currentFavorites, containerName];
|
|
} else {
|
|
newFavorites = currentFavorites;
|
|
}
|
|
} else {
|
|
// Remove from favorites
|
|
newFavorites = currentFavorites.filter(name => name !== containerName);
|
|
}
|
|
}
|
|
|
|
// Save updated favorites
|
|
await setUserPreference(
|
|
{ userId, environmentId, key: LOGS_FAVORITES_KEY },
|
|
newFavorites
|
|
);
|
|
|
|
return json({ favorites: newFavorites });
|
|
} catch (error) {
|
|
console.error('Failed to update favorites:', error);
|
|
return json({ error: 'Failed to update favorites' }, { status: 500 });
|
|
}
|
|
};
|