using ErsatzTV.Core.Domain; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.MediaCollections; internal static class RerunCollectionQueryExtensions { /// /// The single source of truth for the navigation graph a needs before it /// can be projected via . Both the paged-list /// and by-id handlers reload through this chain so the two cannot drift apart again (see #671 — the list /// handler had no includes at all, so every row projected a null selection, while the by-id handler /// covered only Movie/Season/Show/Artist and so returned a null selection for Song/OtherVideo/Image and /// a 500 for Episode/MusicVideo). /// Because the id and the display name are both read off these navigations, an un-included type does not /// merely lose its label — it loses the selected id too, which is what silently cleared a stored /// selection in the editor. /// Deliberately narrower than the analogous playlist-item chain in GetPlaylistItemsHandler: the /// rerun projection reads only each selection's id and title, never its artwork, so the /// .ThenInclude(… => …Artwork) legs are omitted rather than paid for on every page. /// public static IQueryable IncludeSelectionDetails(this IQueryable query) => query .Include(c => c.Collection) .Include(c => c.MultiCollection) .Include(c => c.SmartCollection) .Include(c => c.MediaItem) .ThenInclude(i => (i as Movie).MovieMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as Show).ShowMetadata) // No (i as Season).SeasonMetadata leg on purpose: ProjectToViewModel(Season) builds its name // from Show.ShowMetadata and the scalar SeasonNumber, and never reads SeasonMetadata. .Include(c => c.MediaItem) .ThenInclude(i => (i as Season).Show) .ThenInclude(s => s.ShowMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as Artist).ArtistMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as Episode).EpisodeMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as Episode).Season) .ThenInclude(s => s.Show) .ThenInclude(s => s.ShowMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as MusicVideo).MusicVideoMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as MusicVideo).Artist) .ThenInclude(a => a.ArtistMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as OtherVideo).OtherVideoMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as Song).SongMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as Image).ImageMetadata) .Include(c => c.MediaItem) .ThenInclude(i => (i as RemoteStream).RemoteStreamMetadata); }