Songs-API: robuste Behandlung möglicher verwaister SpecialSong-Relationen
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user