12c2ec213a
Support form now accepts up to 5 attachments (images, PDF, text, JSON, zip; 10MB each) via the existing S3/MinIO presigned-upload flow. New support_ticket_attachments table; attachment links get folded into the Gitea issue body and shown as thumbnails in both the user's ticket history and the admin support view. New presign endpoint (/api/v1/support/attachments/presign, rate-limited 20/hr) scoped to the uploading user rather than a ticket id, since the ticket doesn't exist yet at upload time. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
36 lines
1003 B
TypeScript
36 lines
1003 B
TypeScript
import { NextResponse } from "next/server";
|
|
import { db, supportTickets, desc } from "@epicure/db";
|
|
import { requireAdmin } from "@/lib/api-auth";
|
|
import { getPublicUrl } from "@/lib/storage";
|
|
|
|
export async function GET() {
|
|
const { response } = await requireAdmin();
|
|
if (response) return response;
|
|
|
|
const rows = await db.query.supportTickets.findMany({
|
|
orderBy: desc(supportTickets.createdAt),
|
|
with: {
|
|
attachments: true,
|
|
user: { columns: { email: true, username: true } },
|
|
},
|
|
});
|
|
|
|
return NextResponse.json(
|
|
rows.map((r) => ({
|
|
id: r.id,
|
|
userId: r.userId,
|
|
userEmail: r.user.email,
|
|
username: r.user.username,
|
|
type: r.type,
|
|
title: r.title,
|
|
description: r.description,
|
|
status: r.status,
|
|
giteaIssueUrl: r.giteaIssueUrl,
|
|
giteaError: r.giteaError,
|
|
createdAt: r.createdAt,
|
|
updatedAt: r.updatedAt,
|
|
attachments: r.attachments.map((a) => ({ ...a, url: getPublicUrl(a.storageKey) })),
|
|
}))
|
|
);
|
|
}
|