using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; using MediatR; using static ErsatzTV.Application.ProgramSchedules.Mapper; namespace ErsatzTV.Application.ProgramSchedules.Commands { public class CreateProgramScheduleHandler : IRequestHandler> { private readonly IProgramScheduleRepository _programScheduleRepository; public CreateProgramScheduleHandler(IProgramScheduleRepository programScheduleRepository) => _programScheduleRepository = programScheduleRepository; public Task> Handle( CreateProgramSchedule request, CancellationToken cancellationToken) => Validate(request) .Map(PersistProgramSchedule) .ToEitherAsync(); private Task PersistProgramSchedule(ProgramSchedule c) => _programScheduleRepository.Add(c).Map(ProjectToViewModel); private Validation Validate(CreateProgramSchedule request) => ValidateName(request) .Map( name => new ProgramSchedule { Name = name, MediaCollectionPlaybackOrder = request.MediaCollectionPlaybackOrder }); private Validation ValidateName(CreateProgramSchedule createProgramSchedule) => createProgramSchedule.NotEmpty(c => c.Name) .Bind(_ => createProgramSchedule.NotLongerThan(50)(c => c.Name)); } }