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,