diff --git a/app/api/groups/route.ts b/app/api/groups/route.ts index 49b9850..9a8051c 100644 --- a/app/api/groups/route.ts +++ b/app/api/groups/route.ts @@ -175,7 +175,21 @@ export async function POST(req: Request) { return NextResponse.json({ message: "Non autorisé" }, { status: 401 }); } - const { name } = await req.json(); + // Safely parse request body + let name: string; + try { + const body = await req.json(); + name = body?.name; + } catch (parseError) { + logger.error('Error parsing request body', { + error: parseError instanceof Error ? parseError.message : String(parseError) + }); + return NextResponse.json( + { message: "Corps de requête invalide" }, + { status: 400 } + ); + } + if (!name?.trim()) { return NextResponse.json( { message: "Le nom du groupe est requis" }, @@ -269,7 +283,36 @@ export async function POST(req: Request) { ); } - const groupData = await response.json(); + // Safely parse success response from Keycloak + let groupData: any; + try { + const text = await response.text(); + if (!text || text.trim().length === 0) { + // If Keycloak returns empty response, create a group object with generated ID + logger.warn('Keycloak returned empty response for group creation', { + groupName: name + }); + groupData = { id: `group-${Date.now()}` }; + } else { + try { + groupData = JSON.parse(text); + } catch (parseError) { + logger.error('Failed to parse Keycloak success response as JSON', { + text: text.substring(0, 200), + error: parseError instanceof Error ? parseError.message : String(parseError) + }); + // Fallback: create group object with generated ID + groupData = { id: `group-${Date.now()}` }; + } + } + } catch (error) { + logger.error('Error reading Keycloak success response', { + error: error instanceof Error ? error.message : String(error) + }); + // Fallback: create group object with generated ID + groupData = { id: `group-${Date.now()}` }; + } + const groupId = groupData.id || Date.now().toString(); // Create calendar for the group creator diff --git a/app/missions/equipe/page.tsx b/app/missions/equipe/page.tsx index 8275349..afed489 100644 --- a/app/missions/equipe/page.tsx +++ b/app/missions/equipe/page.tsx @@ -520,19 +520,28 @@ export default function EquipePage() { } // Only try to parse if we have text content - if (text && typeof text === 'string' && text.trim().length > 0) { - if (contentType.includes('application/json')) { - try { - const errorData = JSON.parse(text); - errorMessage = errorData.message || errorData.error || errorMessage; - } catch (parseError) { - // If JSON parsing fails, use the text (truncated if too long) - console.warn('Failed to parse error response as JSON:', parseError); - errorMessage = text.length > 200 ? text.substring(0, 200) + '...' : text; + if (text && typeof text === 'string') { + const trimmedText = text.trim(); + if (trimmedText.length > 0) { + if (contentType.includes('application/json')) { + // Additional check: make sure it looks like JSON (starts with { or [) + if (trimmedText.startsWith('{') || trimmedText.startsWith('[')) { + try { + const errorData = JSON.parse(trimmedText); + errorMessage = errorData.message || errorData.error || errorMessage; + } catch (parseError) { + // If JSON parsing fails, use the text (truncated if too long) + console.warn('Failed to parse error response as JSON:', parseError); + errorMessage = trimmedText.length > 200 ? trimmedText.substring(0, 200) + '...' : trimmedText; + } + } else { + // Doesn't look like JSON, use as plain text + errorMessage = trimmedText.length > 200 ? trimmedText.substring(0, 200) + '...' : trimmedText; + } + } else { + // If there's text but not JSON, use it (truncated if too long) + errorMessage = trimmedText.length > 200 ? trimmedText.substring(0, 200) + '...' : trimmedText; } - } else { - // If there's text but not JSON, use it (truncated if too long) - errorMessage = text.length > 200 ? text.substring(0, 200) + '...' : text; } } } catch (error) { @@ -548,13 +557,27 @@ export default function EquipePage() { let newGroup; try { const text = await response.text(); - if (!text || text.trim().length === 0) { + const trimmedText = text?.trim() || ''; + + if (!trimmedText || trimmedText.length === 0) { throw new Error("Réponse vide du serveur"); } - newGroup = JSON.parse(text); + + // Make sure it looks like JSON before parsing + if (!trimmedText.startsWith('{') && !trimmedText.startsWith('[')) { + throw new Error("Réponse invalide du serveur (format non-JSON)"); + } + + try { + newGroup = JSON.parse(trimmedText); + } catch (parseError) { + console.error("Error parsing JSON:", parseError); + throw new Error("Erreur lors de la lecture de la réponse du serveur"); + } } catch (parseError) { console.error("Error parsing success response:", parseError); - throw new Error("Erreur lors de la lecture de la réponse du serveur"); + const errorMsg = parseError instanceof Error ? parseError.message : "Erreur lors de la lecture de la réponse du serveur"; + throw new Error(errorMsg); } setGroups(prev => [...prev, newGroup]);