From f22880059317e6c5f4c2dd1b935f83e2dc8a58ee Mon Sep 17 00:00:00 2001 From: Adrian Bonpin Date: Mon, 27 Apr 2026 15:36:12 +0800 Subject: [PATCH] feat: change user-delete to soft delete for performance entries --- lib/api/performance.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/api/performance.ts b/lib/api/performance.ts index 9b8975e..ab918c4 100644 --- a/lib/api/performance.ts +++ b/lib/api/performance.ts @@ -138,10 +138,10 @@ export const performanceVerifyRoutes = new Elysia({ params: t.Object({ id: t.String() }), }, ) - // ── User-scoped hard delete (owner or admin) ──────────────────── + // ── User-scoped soft delete (owner or admin) ──────────────────── .delete( "/:id/user-delete", - async ({ params, request, set }) => { + async ({ params, body, request, set }) => { const guard = await requireRole(request.headers, [ "user", "contributor", @@ -171,14 +171,28 @@ export const performanceVerifyRoutes = new Elysia({ return { error: "Not authorized to delete this entry" } } - await db - .delete(performanceEntries) + const reason = body?.reason as string | undefined + + const [updated] = await db + .update(performanceEntries) + .set({ + isRemoved: true, + removedReason: reason ?? "User deleted", + updatedAt: new Date(), + }) .where(eq(performanceEntries.id, params.id)) + .returning() + + if (!updated) { + set.status = 404 + return { error: "Performance entry not found" } + } return { success: true } }, { params: t.Object({ id: t.String() }), + body: t.Optional(t.Object({ reason: t.Optional(t.String()) })), }, ) // ── Best entry: highest-rated for latest version ──────────────────