From 370ec568aa26447f178a9453f0f0b3d98fca38b0 Mon Sep 17 00:00:00 2001 From: philipcheung Date: Sat, 12 Sep 2026 10:06:16 +0800 Subject: [PATCH] Add image upload to cases with cleanup --- src/pages/admin/cases.astro | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/pages/admin/cases.astro b/src/pages/admin/cases.astro index 4ad3075..d6b06ae 100644 --- a/src/pages/admin/cases.astro +++ b/src/pages/admin/cases.astro @@ -1,15 +1,18 @@ --- import { and, asc, desc, eq, gt, lt, max } from "drizzle-orm"; import AdminLayout from "../../layouts/AdminLayout.astro"; +import ImageField from "../../components/admin/ImageField.astro"; import { cases } from "../../db/schema"; import { getDb } from "../../lib/db"; import { getEnv } from "../../lib/env"; import { parseForm } from "../../lib/form"; +import { deleteMedia } from "../../lib/media"; import { caseInput } from "../../schemas"; export const prerender = false; -const db = getDb(getEnv().DB); +const env = getEnv(); +const db = getDb(env.DB); let errors: Record = {}; let failedId = ""; @@ -44,6 +47,11 @@ if (Astro.request.method === "POST") { }); } else { const id = str(form, "id"); + const newImage = parsed.data.imageUrl || null; + const [current] = await db.select().from(cases).where(eq(cases.id, id)).limit(1); + if (current && current.imageUrl !== newImage) { + await deleteMedia(env, current.imageUrl); + } await db .update(cases) .set({ @@ -51,14 +59,17 @@ if (Astro.request.method === "POST") { location: parsed.data.location || null, completedAt: parsed.data.completedAt || null, description: parsed.data.description || null, - imageUrl: parsed.data.imageUrl || null, + imageUrl: newImage, status: parsed.data.status, updatedAt: new Date(), }) .where(eq(cases.id, id)); } } else if (action === "delete") { - await db.delete(cases).where(eq(cases.id, str(form, "id"))); + const id = str(form, "id"); + const [current] = await db.select().from(cases).where(eq(cases.id, id)).limit(1); + await deleteMedia(env, current?.imageUrl); + await db.delete(cases).where(eq(cases.id, id)); } else if (action === "up" || action === "down") { const id = str(form, "id"); const [current] = await db.select().from(cases).where(eq(cases.id, id)).limit(1); @@ -109,8 +120,7 @@ const list = await db.select().from(cases).orderBy(asc(cases.sortOrder));
- - +
@@ -144,8 +154,13 @@ const list = await db.select().from(cases).orderBy(asc(cases.sortOrder));
- - +
@@ -159,9 +174,6 @@ const list = await db.select().from(cases).orderBy(asc(cases.sortOrder));
- {item.imageUrl && ( - {item.title} - )}