fix: surface real network cause on Gitea issue creation failure (v0.51.4)

A thrown fetch error (DNS failure, connection refused, timeout) never
reached the res.ok branch, so its actual cause was lost — err.message
alone is often just "fetch failed" with the real reason nested in
err.cause. Now logs the full cause server-side and folds it into the
error returned to the admin support view's tooltip.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Arnaud
2026-07-19 11:20:11 +02:00
parent b4dd29893d
commit e6a5e1e6ab
5 changed files with 25 additions and 4 deletions
+5
View File
@@ -2,6 +2,11 @@
All notable changes to Epicure are documented here. This file is mirrored in-app at `/changelog` (and in the admin dashboard) via `apps/web/lib/changelog.ts` — update both together. All notable changes to Epicure are documented here. This file is mirrored in-app at `/changelog` (and in the admin dashboard) via `apps/web/lib/changelog.ts` — update both together.
## 0.51.4 — 2026-07-19 12:50
### Fixed
- Gitea issue creation failures now log the real network-level cause server-side (DNS/connection/timeout, not just "fetch failed") and surface a more specific message in the admin support view's tooltip.
## 0.51.3 — 2026-07-19 12:35 ## 0.51.3 — 2026-07-19 12:35
### Fixed ### Fixed
+8 -1
View File
@@ -1,5 +1,5 @@
// Mirrors CHANGELOG.md at the repo root — update both together. // Mirrors CHANGELOG.md at the repo root — update both together.
export const APP_VERSION = "0.51.3"; export const APP_VERSION = "0.51.4";
export type ChangelogEntry = { export type ChangelogEntry = {
version: string; version: string;
@@ -11,6 +11,13 @@ export type ChangelogEntry = {
}; };
export const CHANGELOG: ChangelogEntry[] = [ export const CHANGELOG: ChangelogEntry[] = [
{
version: "0.51.4",
date: "2026-07-19 12:50",
fixed: [
"Gitea issue creation failures now log the real network-level cause server-side (DNS/connection/timeout, not just \"fetch failed\") and surface a more specific message in the admin support view's tooltip.",
],
},
{ {
version: "0.51.3", version: "0.51.3",
date: "2026-07-19 12:35", date: "2026-07-19 12:35",
+10 -1
View File
@@ -50,6 +50,15 @@ export async function createGiteaIssue(opts: {
const issue = (await res.json()) as { html_url?: string }; const issue = (await res.json()) as { html_url?: string };
return { url: issue.html_url ?? null, error: issue.html_url ? null : "Gitea response had no html_url" }; return { url: issue.html_url ?? null, error: issue.html_url ? null : "Gitea response had no html_url" };
} catch (err) { } catch (err) {
return { url: null, error: err instanceof Error ? err.message : "Unknown error" }; // A thrown fetch error (DNS failure, connection refused, timeout, TLS
// error) never reaches the res.ok branch above, so its real cause would
// otherwise be lost — err.message alone is often just "fetch failed"
// with the actual reason nested in err.cause. Log server-side with the
// full cause chain, and fold a short form into the returned message so
// it also shows up in the admin support view's tooltip, not just logs.
const cause = err instanceof Error && err.cause instanceof Error ? err.cause.message : undefined;
const message = err instanceof Error ? err.message : "Unknown error";
console.error("[gitea] createGiteaIssue failed", { baseUrl, repo, message, cause });
return { url: null, error: cause ? `${message}: ${cause}` : message };
} }
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@epicure/web", "name": "@epicure/web",
"version": "0.51.3", "version": "0.51.4",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "epicure", "name": "epicure",
"version": "0.51.3", "version": "0.51.4",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "pnpm --filter web dev", "dev": "pnpm --filter web dev",