fix: handle 204 No Content in fetchJSON, add FK-aware delete errors, v2 screenshots

Frontend: fetchJSON now returns empty object on 204 instead of failing
to parse empty body — fixes silent delete failures across all entities.
Added onError callbacks to owner/team delete mutations to surface errors.

Backend: owner and issuer delete handlers return 409 Conflict with
descriptive messages when FK constraints block deletion, instead of
generic 500.

Added 15 v2 dashboard screenshots, updated README screenshot section,
logo asset, page count references (18→full), and QA guide with FK
constraint test coverage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
shankar0123
2026-03-25 05:03:50 -04:00
parent 3eb4749b4d
commit 0f4a1b268b
25 changed files with 105 additions and 20 deletions
+1
View File
@@ -42,6 +42,7 @@ async function fetchJSON<T>(url: string, init?: RequestInit): Promise<T> {
}
throw new Error(errorMsg || `HTTP ${res.status}`);
}
if (res.status === 204) return {} as T;
return res.json();
}
+1
View File
@@ -23,6 +23,7 @@ export default function OwnersPage() {
const deleteMutation = useMutation({
mutationFn: deleteOwner,
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['owners'] }),
onError: (err: Error) => alert(`Delete failed: ${err.message}`),
});
const teamMap = new Map<string, Team>();
+1
View File
@@ -18,6 +18,7 @@ export default function TeamsPage() {
const deleteMutation = useMutation({
mutationFn: deleteTeam,
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['teams'] }),
onError: (err: Error) => alert(`Delete failed: ${err.message}`),
});
const columns: Column<Team>[] = [