From 965768c138968f2a0001e958065ce010cfc6529d Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sun, 7 Mar 2021 15:40:09 -0600 Subject: [PATCH] enforce unique schedule name --- .../Commands/CreateProgramScheduleHandler.cs | 28 ++++++++++++++----- ErsatzTV/Pages/ScheduleEditor.razor | 2 +- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/ErsatzTV.Application/ProgramSchedules/Commands/CreateProgramScheduleHandler.cs b/ErsatzTV.Application/ProgramSchedules/Commands/CreateProgramScheduleHandler.cs index 1006665de..2391f46ea 100644 --- a/ErsatzTV.Application/ProgramSchedules/Commands/CreateProgramScheduleHandler.cs +++ b/ErsatzTV.Application/ProgramSchedules/Commands/CreateProgramScheduleHandler.cs @@ -1,4 +1,6 @@ -using System.Threading; +using System.Collections.Generic; +using System.Linq; +using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Domain; @@ -6,6 +8,7 @@ using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; using MediatR; using static ErsatzTV.Application.ProgramSchedules.Mapper; +using static LanguageExt.Prelude; namespace ErsatzTV.Application.ProgramSchedules.Commands { @@ -22,22 +25,33 @@ namespace ErsatzTV.Application.ProgramSchedules.Commands CreateProgramSchedule request, CancellationToken cancellationToken) => Validate(request) - .Map(PersistProgramSchedule) - .ToEitherAsync(); + .MapT(PersistProgramSchedule) + .Bind(v => v.ToEitherAsync()); private Task PersistProgramSchedule(ProgramSchedule c) => _programScheduleRepository.Add(c).Map(ProjectToViewModel); - private Validation Validate(CreateProgramSchedule request) => + private Task> Validate(CreateProgramSchedule request) => ValidateName(request) - .Map( + .MapT( name => new ProgramSchedule { Name = name, MediaCollectionPlaybackOrder = request.MediaCollectionPlaybackOrder }); - private Validation ValidateName(CreateProgramSchedule createProgramSchedule) => - createProgramSchedule.NotEmpty(c => c.Name) + private async Task> ValidateName(CreateProgramSchedule createProgramSchedule) + { + List allNames = await _programScheduleRepository.GetAll() + .Map(list => list.Map(c => c.Name).ToList()); + + Validation result1 = createProgramSchedule.NotEmpty(c => c.Name) .Bind(_ => createProgramSchedule.NotLongerThan(50)(c => c.Name)); + + var result2 = Optional(createProgramSchedule.Name) + .Filter(name => !allNames.Contains(name)) + .ToValidation("Schedule name must be unique"); + + return (result1, result2).Apply((_, _) => createProgramSchedule.Name); + } } } diff --git a/ErsatzTV/Pages/ScheduleEditor.razor b/ErsatzTV/Pages/ScheduleEditor.razor index a20d8e8d3..39646dbc5 100644 --- a/ErsatzTV/Pages/ScheduleEditor.razor +++ b/ErsatzTV/Pages/ScheduleEditor.razor @@ -81,7 +81,7 @@ errorMessage.HeadOrNone().Match( error => { - Snackbar.Add(error.Value); + Snackbar.Add(error.Value, Severity.Error); Logger.LogError("Unexpected error saving schedule: {Error}", error.Value); }, () => NavigationManager.NavigateTo("/schedules"));