using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; using Microsoft.EntityFrameworkCore; using static LanguageExt.Prelude; namespace ErsatzTV.Infrastructure.Data.Repositories { public class MovieRepository : IMovieRepository { private readonly TvContext _dbContext; public MovieRepository(TvContext dbContext) => _dbContext = dbContext; public Task> GetMovie(int movieId) => _dbContext.MovieMediaItems .Include(m => m.Metadata) .SingleOrDefaultAsync(m => m.Id == movieId) .Map(Optional); public async Task> GetOrAdd(int mediaSourceId, string path) { Option maybeExisting = await _dbContext.MovieMediaItems .Include(i => i.Metadata) .SingleOrDefaultAsync(i => i.Path == path); return await maybeExisting.Match( mediaItem => Right(mediaItem).AsTask(), async () => await AddMovie(mediaSourceId, path)); } public async Task Update(MovieMediaItem movie) { _dbContext.MovieMediaItems.Update(movie); return await _dbContext.SaveChangesAsync() > 0; } public Task GetMovieCount() => _dbContext.MovieMediaItems .AsNoTracking() .CountAsync(); public Task> GetPagedMovies(int pageNumber, int pageSize) => _dbContext.MovieMediaItems .Include(s => s.Metadata) .OrderBy(s => s.Metadata.SortTitle) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .AsNoTracking() .ToListAsync(); private async Task> AddMovie(int mediaSourceId, string path) { try { var movie = new MovieMediaItem { MediaSourceId = mediaSourceId, Path = path }; await _dbContext.MovieMediaItems.AddAsync(movie); await _dbContext.SaveChangesAsync(); return movie; } catch (Exception ex) { return BaseError.New(ex.Message); } } } }