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 (``). 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:
@@ -1,8 +1,8 @@
|
||||
import { NextRequest, NextResponse } from "next/server";
|
||||
import { z } from "zod";
|
||||
import { db, supportTickets, eq } from "@epicure/db";
|
||||
import { db, supportTickets, supportTicketAttachments, eq } from "@epicure/db";
|
||||
import { requireAdmin } from "@/lib/api-auth";
|
||||
import { createGiteaIssue } from "@/lib/gitea";
|
||||
import { createGiteaIssue, buildGiteaIssueBody } from "@/lib/gitea";
|
||||
|
||||
const UpdateTicketBody = z.object({
|
||||
status: z.enum(["open", "triaged", "closed"]).optional(),
|
||||
@@ -30,10 +30,15 @@ export async function PATCH(req: NextRequest, { params }: { params: Promise<{ id
|
||||
}
|
||||
|
||||
if (parsed.data.retryGitea) {
|
||||
const attachments = await db
|
||||
.select({ key: supportTicketAttachments.storageKey, contentType: supportTicketAttachments.contentType })
|
||||
.from(supportTicketAttachments)
|
||||
.where(eq(supportTicketAttachments.ticketId, id));
|
||||
|
||||
const { url, error } = await createGiteaIssue({
|
||||
type: ticket.type,
|
||||
title: ticket.title,
|
||||
body: `${ticket.description}\n\n---\nReported via Epicure support form by user \`${ticket.userId}\`.`,
|
||||
body: buildGiteaIssueBody({ description: ticket.description, userId: ticket.userId, attachments }),
|
||||
});
|
||||
updates.giteaIssueUrl = url;
|
||||
updates.giteaError = error;
|
||||
|
||||
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user