using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Infrastructure.Data; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.MediaCollections; /// /// Shared existence check for the id a rerun collection selects via /// (see RerunCollectionRequestMapping.ResolveSelection in the API layer). Used by both /// and so /// a bad/stale id fails validation (422) instead of persisting a dangling FK or 500ing at /// SaveChanges. /// internal static class RerunCollectionSelectionValidation { public static Task> SelectedEntityMustExist( TvContext dbContext, CollectionType collectionType, int? collectionId, int? multiCollectionId, int? smartCollectionId, int? mediaItemId, CancellationToken cancellationToken) => collectionType switch { CollectionType.Collection => Exists( dbContext.Collections, collectionId, "Collection does not exist.", cancellationToken), CollectionType.MultiCollection => Exists( dbContext.MultiCollections, multiCollectionId, "Multi collection does not exist.", cancellationToken), CollectionType.SmartCollection => Exists( dbContext.SmartCollections, smartCollectionId, "Smart collection does not exist.", cancellationToken), CollectionType.TelevisionShow => Exists( dbContext.Shows, mediaItemId, "Show does not exist.", cancellationToken), CollectionType.TelevisionSeason => Exists( dbContext.Seasons, mediaItemId, "Season does not exist.", cancellationToken), CollectionType.Artist => Exists( dbContext.Artists, mediaItemId, "Artist does not exist.", cancellationToken), CollectionType.Movie => Exists( dbContext.Movies, mediaItemId, "Movie does not exist.", cancellationToken), CollectionType.Episode => Exists( dbContext.Episodes, mediaItemId, "Episode does not exist.", cancellationToken), CollectionType.MusicVideo => Exists( dbContext.MusicVideos, mediaItemId, "Music video does not exist.", cancellationToken), CollectionType.OtherVideo => Exists( dbContext.OtherVideos, mediaItemId, "Other video does not exist.", cancellationToken), CollectionType.Song => Exists( dbContext.Songs, mediaItemId, "Song does not exist.", cancellationToken), CollectionType.Image => Exists( dbContext.Images, mediaItemId, "Image does not exist.", cancellationToken), CollectionType.RemoteStream => Exists( dbContext.RemoteStreams, mediaItemId, "Remote stream does not exist.", cancellationToken), _ => Task.FromResult( Fail($"Unsupported collection type '{collectionType}' for a rerun collection.")) }; private static async Task> Exists( DbSet set, int? id, string errorMessage, CancellationToken cancellationToken) where T : class { // pure existence check — no tracking, nothing materialized into the save-path context if (id is null || !await set.AnyAsync(e => EF.Property(e, "Id") == id.Value, cancellationToken)) { return Fail(errorMessage); } return Success(Unit.Default); } }