Oprava: "Interni chyba serveru" pri zalozeni ticketu

Formular noveho ticketu koncil na 500 uz pri vyplnenem samotnem predmetu.

apiFetch prevadi telo na JSON sam:

  body: body !== undefined ? JSON.stringify(body) : undefined

Dialog mu ho ale predaval uz prevedene, tedy body: JSON.stringify({...}).
Druhy prevod z objektu udelal retezec a na server dorazilo "{\"subject\":...}".
express.json je ve vychozim nastaveni strict, takze retezec na nejvyssi urovni
odmitne a vyhodi vyjimku. Tataz chyba byla i ve dvou mistech helpdesku,
u zalozeni pozadavku a u komentare.

Druha polovina je hlaska. Vyjimka z parseru tela propadla do centralniho error
handleru, ktery z ni udelal 500 "Interni chyba serveru" - hlasku, ktera rika,
ze je neco spatne u nas, a posila cloveka hledat na spatnou stranu, pritom slo
o spatne polozeny dotaz. Error handler proto chyby parseru tela rozpozna
(status 400 a type zacinajici entity.) a vraci 400 s vetou o neplatnem JSONu.
Ostatni chyby zustavaji 500, jak byly.

Overeno na bezici instanci: telo zakodovane dvakrat vraci 400 s tou vetou,
opravene telo jen s predmetem vraci ticket.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-09-02 14:59:02 +02:00
co-authored by Claude Opus 5
parent 79c9a729f6
commit 5984b1cb9b
4 changed files with 57 additions and 5 deletions
@@ -123,7 +123,9 @@ export function NewTicketDialog({
try {
await apiFetch('/api/dashboard/tickets', {
method: 'POST',
body: JSON.stringify({
// apiFetch telo samo prevede na JSON. Druhy JSON.stringify z nej udelal
// retezec, ktery parser tela odmitne - a to skoncilo jako 500.
body: {
subject: subject.trim(),
body,
priority,
@@ -132,7 +134,7 @@ export function NewTicketDialog({
assigneeGroupId: assigneeGroupId === '' ? null : assigneeGroupId,
// Prázdné údaje se neposílají: zákazník je nepovinný.
...(company || contact || reply ? { customer: { company, contact, reply } } : {}),
}),
},
});
reset();
onCreated();
+3 -2
View File
@@ -165,7 +165,8 @@ function NewRequestDialog({
try {
await apiFetch('/api/dashboard/helpdesk', {
method: 'POST',
body: JSON.stringify({ subject: subject.trim(), body, priority }),
// Bez druheho JSON.stringify, ten uz dela apiFetch.
body: { subject: subject.trim(), body, priority },
});
setSubject('');
setBody('');
@@ -289,7 +290,7 @@ function RequestDetail({
try {
await apiFetch(`/api/dashboard/helpdesk/${id}/comment`, {
method: 'POST',
body: JSON.stringify({ text: text.trim() }),
body: { text: text.trim() },
});
setText('');
const fresh = await apiFetch<TicketDetail>(`/api/dashboard/helpdesk/${id}`);