/** * /database/api/bin/* 回收站端点(ADR-0031)。 * 约定:绝对路径;actorOrNull 前置;业务全走 binService;错误统一 sendRouteError。 */ import type { FastifyInstance } from "fastify"; import { listBin, purgeBinEntry, restoreBinEntry } from "../filelib/binService.js"; import { actorOrNull, sendRouteError, type FileLibRouteDeps } from "../filelib/routeShared.js"; export async function registerBinRoutes(app: FastifyInstance, deps: FileLibRouteDeps): Promise { const svc = { prisma: deps.prisma, organizationId: deps.organizationId, groupResolver: deps.groupResolver }; app.get("/database/api/bin", async (request, reply) => { const actor = await actorOrNull(request, reply, deps); if (actor === null) return reply; try { return { entries: await listBin(svc, actor) }; } catch (error) { return sendRouteError(reply, error); } }); app.post("/database/api/bin/:id/restore", async (request, reply) => { const actor = await actorOrNull(request, reply, deps); if (actor === null) return reply; try { const { id } = request.params as { id: string }; await restoreBinEntry(svc, actor, id); return reply.status(204).send(); } catch (error) { return sendRouteError(reply, error); } }); app.delete("/database/api/bin/:id", async (request, reply) => { const actor = await actorOrNull(request, reply, deps); if (actor === null) return reply; try { const { id } = request.params as { id: string }; return await purgeBinEntry(svc, actor, id); } catch (error) { return sendRouteError(reply, error); } }); }