From b8a803b76e0f4fa12975a829fcfeac31f721801b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=B6rdle=20Bot?= Date: Wed, 3 Dec 2025 14:56:40 +0100 Subject: [PATCH] =?UTF-8?q?Songs-API:=20robuste=20Behandlung=20m=C3=B6glic?= =?UTF-8?q?her=20verwaister=20SpecialSong-Relationen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/songs/route.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/api/songs/route.ts b/app/api/songs/route.ts index dd753f4..8604f72 100644 --- a/app/api/songs/route.ts +++ b/app/api/songs/route.ts @@ -103,9 +103,11 @@ export async function GET(request: NextRequest) { visibleSongs = songs.filter(song => { const songGenreIds = song.genres.map(g => g.id); - // `song.specials` ist hier ein Array von SpecialSong mit Relation `special`, - // wir nutzen konsistent die Special-ID. - const songSpecialIds = song.specials.map(ss => ss.special.id); + // `song.specials` ist hier ein Array von SpecialSong mit Relation `special`. + // Es kann theoretisch verwaiste Einträge ohne `special` geben → defensiv optional chainen. + const songSpecialIds = song.specials + .map(ss => ss.special?.id) + .filter((id): id is number => typeof id === 'number'); // Songs ohne Genres/Specials sind immer sichtbar if (songGenreIds.length === 0 && songSpecialIds.length === 0) { @@ -131,7 +133,10 @@ export async function GET(request: NextRequest) { activations: song.puzzles.length, puzzles: song.puzzles, genres: song.genres, - specials: song.specials.map(ss => ss.special), + // Nur Specials mit existierender Relation durchreichen, um undefinierte Einträge zu vermeiden. + specials: song.specials + .map(ss => ss.special) + .filter((s): s is any => !!s), averageRating: song.averageRating, ratingCount: song.ratingCount, excludeFromGlobal: song.excludeFromGlobal,