69 lines
1.9 KiB
TypeScript
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');
|
|
}
|
|
};
|