811d4cad42
Users can now report bugs, suggestions, or questions from a new /support page. Each submission sends a confirmation email and, when GITEA_URL/ GITEA_TOKEN/GITEA_REPO are configured in admin Settings, opens a labeled issue on that repo automatically (best-effort — failure doesn't block the ticket). Admins get a Support section to triage status and retry failed Gitea issue creation. New support_tickets table, gitea.ts client, site-settings entries for the three new secrets, and OpenAPI docs for the two user-facing endpoints. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { db, users, supportTickets, eq, desc } from "@epicure/db";
|
|
import { AdminSupportManager } from "@/components/admin/admin-support-manager";
|
|
|
|
export const metadata: Metadata = {};
|
|
|
|
export default async function AdminSupportPage() {
|
|
const rows = await db
|
|
.select({
|
|
id: supportTickets.id,
|
|
userEmail: users.email,
|
|
username: users.username,
|
|
type: supportTickets.type,
|
|
title: supportTickets.title,
|
|
description: supportTickets.description,
|
|
status: supportTickets.status,
|
|
giteaIssueUrl: supportTickets.giteaIssueUrl,
|
|
giteaError: supportTickets.giteaError,
|
|
createdAt: supportTickets.createdAt,
|
|
})
|
|
.from(supportTickets)
|
|
.innerJoin(users, eq(supportTickets.userId, users.id))
|
|
.orderBy(desc(supportTickets.createdAt));
|
|
|
|
return (
|
|
<div className="space-y-6">
|
|
<div>
|
|
<h1 className="text-2xl font-bold tracking-tight">Support Tickets</h1>
|
|
<p className="text-muted-foreground text-sm mt-1">
|
|
Bug reports, suggestions, and questions submitted through the app.
|
|
</p>
|
|
</div>
|
|
<AdminSupportManager
|
|
initialTickets={rows.map((r) => ({ ...r, createdAt: r.createdAt.toISOString() }))}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|