using Dapper; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; using ErsatzTV.Core.Metadata; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Infrastructure.Data.Repositories; public class ArtistRepository : IArtistRepository { private readonly IDbContextFactory _dbContextFactory; public ArtistRepository(IDbContextFactory dbContextFactory) => _dbContextFactory = dbContextFactory; public async Task> GetArtistByMetadata(int libraryPathId, ArtistMetadata metadata) { await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(); Option maybeId = await dbContext.ArtistMetadata .Where( s => s.Title == metadata.Title && (metadata.MetadataKind == MetadataKind.Fallback || s.Disambiguation == metadata.Disambiguation)) .Where(s => s.Artist.LibraryPathId == libraryPathId) .SingleOrDefaultAsync() .Map(Optional) .MapT(sm => sm.ArtistId); return await maybeId.Match( id => { return dbContext.Artists .AsNoTracking() .Include(s => s.ArtistMetadata) .ThenInclude(sm => sm.Artwork) .Include(s => s.ArtistMetadata) .ThenInclude(sm => sm.Genres) .Include(s => s.ArtistMetadata) .ThenInclude(sm => sm.Styles) .Include(s => s.ArtistMetadata) .ThenInclude(sm => sm.Moods) .Include(s => s.LibraryPath) .ThenInclude(lp => lp.Library) .OrderBy(s => s.Id) .SingleOrDefaultAsync(s => s.Id == id) .Map(Optional); }, () => Option.None.AsTask()); } public async Task>> AddArtist( int libraryPathId, string artistFolder, ArtistMetadata metadata) { await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(); try { metadata.DateAdded = DateTime.UtcNow; metadata.Genres ??= new List(); metadata.Styles ??= new List