intelidomWebsite/src/routes/admin/+page.server.ts

69 lines
1.9 KiB
TypeScript

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');
}
};