fix: embed images inline in Gitea issues, fix retry dropping attachments (v0.51.6)

Two related bugs in the Gitea issue body:

1. Attachments were always plain bullet links (`- url`), even for images —
   so they never rendered as a preview in the Gitea issue, just a clickable
   URL. Image content-types now use markdown image embed (`![](url)`).
2. The admin "Create Gitea issue" retry action built its own body from
   scratch (`ticket.description` only) and never queried attachments at
   all — a retry always lost them, regardless of point 1's fix.

Extracted buildGiteaIssueBody() to lib/gitea.ts so both the initial
ticket-creation path and the retry path share one body-building
implementation instead of two independent (and inevitably diverging) ones.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Arnaud
2026-07-19 11:58:50 +02:00
parent 6502307340
commit 43088759cf
7 changed files with 47 additions and 15 deletions
+2 -9
View File
@@ -4,7 +4,7 @@ import { z } from "zod";
import { db, supportTickets, supportTicketAttachments, eq, desc } from "@epicure/db";
import { requireSession } from "@/lib/api-auth";
import { sendEmail, supportTicketReceivedHtml } from "@/lib/email";
import { createGiteaIssue } from "@/lib/gitea";
import { createGiteaIssue, buildGiteaIssueBody } from "@/lib/gitea";
import { getPublicUrl, isOwnedSupportAttachmentKey } from "@/lib/storage";
const MAX_ATTACHMENTS = 5;
@@ -65,17 +65,10 @@ export async function POST(req: NextRequest) {
const id = crypto.randomUUID();
const now = new Date();
const attachmentLinks = attachments.map((a) => getPublicUrl(a.key));
const giteaBody = [
description,
attachmentLinks.length > 0 ? `\n**Attachments:**\n${attachmentLinks.map((u) => `- ${u}`).join("\n")}` : "",
`\n---\nReported via Epicure support form by user \`${session!.user.id}\`.`,
].join("\n");
const { url: giteaIssueUrl, error: giteaError } = await createGiteaIssue({
type,
title,
body: giteaBody,
body: buildGiteaIssueBody({ description, userId: session!.user.id, attachments }),
});
await db.insert(supportTickets).values({