import { fail, redirect } from '@sveltejs/kit'; import { asc, desc, eq } from 'drizzle-orm'; import { randomUUID } from 'node:crypto'; import type { Actions, PageServerLoad } from './$types'; import { db } from '$lib/server/db'; import { galleryImages } from '$lib/server/db/schema'; import { saveImage, deleteUpload } from '$lib/server/storage'; import { SESSION_COOKIE, invalidateSession } from '$lib/server/auth'; function listImages() { return db .select() .from(galleryImages) .orderBy(asc(galleryImages.sortOrder), desc(galleryImages.createdAt)) .all() .map((image) => ({ id: image.id, url: `/uploads/${image.imagePath}`, caption: image.caption })); } export const load: PageServerLoad = () => { return { images: listImages() }; }; export const actions: Actions = { upload: async ({ request }) => { const form = await request.formData(); const caption = String(form.get('caption') ?? '').trim() || null; const files = form .getAll('images') .filter((entry): entry is File => entry instanceof File && entry.size > 0); if (files.length === 0) { return fail(400, { error: 'Izberite vsaj eno sliko.' }); } let count = 0; for (const file of files) { const imagePath = await saveImage('gallery', file); db.insert(galleryImages).values({ id: randomUUID(), imagePath, caption }).run(); count++; } return { success: `Naloženih slik: ${count}.` }; }, delete: async ({ request }) => { const form = await request.formData(); const id = String(form.get('id') ?? ''); const row = db.select().from(galleryImages).where(eq(galleryImages.id, id)).get(); if (row) { deleteUpload(row.imagePath); db.delete(galleryImages).where(eq(galleryImages.id, id)).run(); } return { success: 'Slika izbrisana.' }; }, logout: async ({ cookies }) => { const token = cookies.get(SESSION_COOKIE); if (token) invalidateSession(token); cookies.delete(SESSION_COOKIE, { path: '/' }); throw redirect(303, '/admin/login'); } };