using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; using ErsatzTV.Core.Interfaces.Scheduling; using LanguageExt; using static LanguageExt.Prelude; namespace ErsatzTV.Application.Playouts.Commands { public class BuildPlayoutHandler : MediatR.IRequestHandler> { private readonly IPlayoutBuilder _playoutBuilder; private readonly IPlayoutRepository _playoutRepository; public BuildPlayoutHandler(IPlayoutRepository playoutRepository, IPlayoutBuilder playoutBuilder) { _playoutRepository = playoutRepository; _playoutBuilder = playoutBuilder; } public Task> Handle(BuildPlayout request, CancellationToken cancellationToken) => Validate(request) .Map(v => v.ToEither()) .BindT(playout => ApplyUpdateRequest(request, playout)); private async Task> ApplyUpdateRequest(BuildPlayout request, Playout playout) { Playout result = await _playoutBuilder.BuildPlayoutItems(playout, request.Rebuild); await _playoutRepository.Update(result); return unit; } private Task> Validate(BuildPlayout request) => PlayoutMustExist(request); private async Task> PlayoutMustExist(BuildPlayout buildPlayout) => (await _playoutRepository.GetFull(buildPlayout.PlayoutId)) .ToValidation("Playout does not exist."); } }