Songs-API: robuste Behandlung möglicher verwaister SpecialSong-Relationen

This commit is contained in:
Hördle Bot
2025-12-03 14:56:40 +01:00
parent e2bdf0fc88
commit b8a803b76e

View File

@@ -103,9 +103,11 @@ export async function GET(request: NextRequest) {
visibleSongs = songs.filter(song => { visibleSongs = songs.filter(song => {
const songGenreIds = song.genres.map(g => g.id); const songGenreIds = song.genres.map(g => g.id);
// `song.specials` ist hier ein Array von SpecialSong mit Relation `special`, // `song.specials` ist hier ein Array von SpecialSong mit Relation `special`.
// wir nutzen konsistent die Special-ID. // Es kann theoretisch verwaiste Einträge ohne `special` geben → defensiv optional chainen.
const songSpecialIds = song.specials.map(ss => ss.special.id); const songSpecialIds = song.specials
.map(ss => ss.special?.id)
.filter((id): id is number => typeof id === 'number');
// Songs ohne Genres/Specials sind immer sichtbar // Songs ohne Genres/Specials sind immer sichtbar
if (songGenreIds.length === 0 && songSpecialIds.length === 0) { if (songGenreIds.length === 0 && songSpecialIds.length === 0) {
@@ -131,7 +133,10 @@ export async function GET(request: NextRequest) {
activations: song.puzzles.length, activations: song.puzzles.length,
puzzles: song.puzzles, puzzles: song.puzzles,
genres: song.genres, 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, averageRating: song.averageRating,
ratingCount: song.ratingCount, ratingCount: song.ratingCount,
excludeFromGlobal: song.excludeFromGlobal, excludeFromGlobal: song.excludeFromGlobal,