diff --git a/ErsatzTV.Application/Channels/Queries/GetAllChannelsHandler.cs b/ErsatzTV.Application/Channels/Queries/GetAllChannelsHandler.cs index 737e933d0..7d4f8c1f0 100644 --- a/ErsatzTV.Application/Channels/Queries/GetAllChannelsHandler.cs +++ b/ErsatzTV.Application/Channels/Queries/GetAllChannelsHandler.cs @@ -3,9 +3,9 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core.Interfaces.Repositories; -using LanguageExt; using MediatR; using static ErsatzTV.Application.Channels.Mapper; +using static LanguageExt.Prelude; namespace ErsatzTV.Application.Channels.Queries { @@ -15,7 +15,7 @@ namespace ErsatzTV.Application.Channels.Queries public GetAllChannelsHandler(IChannelRepository channelRepository) => _channelRepository = channelRepository; - public Task> Handle(GetAllChannels request, CancellationToken cancellationToken) => - _channelRepository.GetAll().Map(channels => channels.Map(ProjectToViewModel).ToList()); + public async Task> Handle(GetAllChannels request, CancellationToken cancellationToken) => + Optional(await _channelRepository.GetAll()).Flatten().Map(ProjectToViewModel).ToList(); } } diff --git a/ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs index e2aacefaf..33f60c5f7 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs @@ -13,8 +13,13 @@ namespace ErsatzTV.Infrastructure.Data.Repositories public class PlayoutRepository : IPlayoutRepository { private readonly TvContext _dbContext; + private readonly IDbContextFactory _dbContextFactory; - public PlayoutRepository(TvContext dbContext) => _dbContext = dbContext; + public PlayoutRepository(TvContext dbContext, IDbContextFactory dbContextFactory) + { + _dbContext = dbContext; + _dbContextFactory = dbContextFactory; + } public async Task Add(Playout playout) { @@ -67,8 +72,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .Map(Optional) .MapT(pi => pi.StartOffset); - public Task> GetPlayoutItems(int playoutId) => - _dbContext.PlayoutItems + public async Task> GetPlayoutItems(int playoutId) + { + await using TvContext context = _dbContextFactory.CreateDbContext(); + return await context.PlayoutItems + .AsNoTracking() .Include(i => i.MediaItem) .ThenInclude(mi => (mi as Movie).MovieMetadata) .ThenInclude(mm => mm.Artwork) @@ -84,12 +92,17 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .ThenInclude(s => s.SeasonMetadata) .Filter(i => i.PlayoutId == playoutId) .ToListAsync(); + } - public Task> GetAll() => - _dbContext.Playouts + public async Task> GetAll() + { + await using TvContext context = _dbContextFactory.CreateDbContext(); + return await context.Playouts + .AsNoTracking() .Include(p => p.Channel) .Include(p => p.ProgramSchedule) .ToListAsync(); + } public async Task Update(Playout playout) { diff --git a/ErsatzTV/Pages/ChannelEditor.razor b/ErsatzTV/Pages/ChannelEditor.razor index 271438620..c2971d59e 100644 --- a/ErsatzTV/Pages/ChannelEditor.razor +++ b/ErsatzTV/Pages/ChannelEditor.razor @@ -5,6 +5,7 @@ @using ErsatzTV.Application.Images.Commands @using ErsatzTV.Application.Channels @using ErsatzTV.Application.Channels.Queries +@using static LanguageExt.Prelude @inject NavigationManager NavigationManager @inject ILogger Logger @inject ISnackbar Snackbar @@ -95,8 +96,9 @@ else { // TODO: command for new channel - int maxNumber = await Mediator.Send(new GetAllChannels()) - .Map(list => list.Map(c => int.TryParse(c.Number.Split(".").Head(), out int result) ? result : 0).Max()); + IEnumerable channelNumbers = await Mediator.Send(new GetAllChannels()) + .Map(list => list.Map(c => int.TryParse(c.Number.Split(".").Head(), out int result) ? result : 0)); + int maxNumber = Optional(channelNumbers).Flatten().DefaultIfEmpty(0).Max(); _model.Number = (maxNumber + 1).ToString(); _model.Name = "New Channel"; _model.FFmpegProfileId = _ffmpegProfiles.Head().Id;