Example #1
0
    private static Validation <BaseError, ProgramSchedule> PlaybackOrdersMustBeValid(
        ReplaceProgramScheduleItems request,
        ProgramSchedule programSchedule)
    {
        var keyOrders = new Dictionary <CollectionKey, System.Collections.Generic.HashSet <PlaybackOrder> >();

        foreach (ReplaceProgramScheduleItem item in request.Items)
        {
            var key = new CollectionKey(
                item.CollectionType,
                item.CollectionId,
                item.MediaItemId,
                item.MultiCollectionId,
                item.SmartCollectionId);

            if (keyOrders.TryGetValue(key, out System.Collections.Generic.HashSet <PlaybackOrder> playbackOrders))
            {
                playbackOrders.Add(item.PlaybackOrder);
                keyOrders[key] = playbackOrders;
            }
            else
            {
                keyOrders.Add(key, new System.Collections.Generic.HashSet <PlaybackOrder> {
                    item.PlaybackOrder
                });
            }
        }

        return(Optional(keyOrders.Values.Count(set => set.Count != 1))
               .Filter(count => count == 0)
               .Map(_ => programSchedule)
               .ToValidation <BaseError>("A collection must not use multiple playback orders"));
    }
Example #2
0
 private Task <Validation <BaseError, ProgramSchedule> > Validate(
     TvContext dbContext,
     ReplaceProgramScheduleItems request) =>
 ProgramScheduleMustExist(dbContext, request.ProgramScheduleId)
 .BindT(programSchedule => PlayoutModesMustBeValid(request, programSchedule))
 .BindT(programSchedule => CollectionTypesMustBeValid(request, programSchedule))
 .BindT(programSchedule => PlaybackOrdersMustBeValid(request, programSchedule))
 .BindT(programSchedule => FillerConfigurationsMustBeValid(dbContext, request, programSchedule));
Example #3
0
    public async Task <Either <BaseError, IEnumerable <ProgramScheduleItemViewModel> > > Handle(
        ReplaceProgramScheduleItems request,
        CancellationToken cancellationToken)
    {
        await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken);

        Validation <BaseError, ProgramSchedule> validation = await Validate(dbContext, request);

        return(await LanguageExtensions.Apply(validation, ps => PersistItems(dbContext, request, ps)));
    }
        private async Task <IEnumerable <ProgramScheduleItemViewModel> > PersistItems(
            ReplaceProgramScheduleItems request,
            ProgramSchedule programSchedule)
        {
            programSchedule.Items = request.Items.Map(i => BuildItem(programSchedule, i.Index, i)).ToList();

            await _programScheduleRepository.Update(programSchedule);

            // rebuild any playouts that use this schedule
            foreach (Playout playout in programSchedule.Playouts)
            {
                await _channel.WriteAsync(new BuildPlayout(playout.Id, true));
            }

            return(programSchedule.Items.Map(ProjectToViewModel));
        }
Example #5
0
    private async Task <IEnumerable <ProgramScheduleItemViewModel> > PersistItems(
        TvContext dbContext,
        ReplaceProgramScheduleItems request,
        ProgramSchedule programSchedule)
    {
        dbContext.RemoveRange(programSchedule.Items);
        programSchedule.Items = request.Items.Map(i => BuildItem(programSchedule, i.Index, i)).ToList();

        await dbContext.SaveChangesAsync();

        // refresh any playouts that use this schedule
        foreach (Playout playout in programSchedule.Playouts)
        {
            await _channel.WriteAsync(new BuildPlayout(playout.Id, PlayoutBuildMode.Refresh));
        }

        return(programSchedule.Items.Map(ProjectToViewModel));
    }
Example #6
0
    private static async Task <Validation <BaseError, ProgramSchedule> > FillerConfigurationsMustBeValid(
        TvContext dbContext,
        ReplaceProgramScheduleItems request,
        ProgramSchedule programSchedule)
    {
        foreach (ReplaceProgramScheduleItem item in request.Items)
        {
            Either <BaseError, ProgramSchedule> result = await FillerConfigurationMustBeValid(
                dbContext,
                item,
                programSchedule);

            if (result.IsLeft)
            {
                return(result.ToValidation());
            }
        }

        return(programSchedule);
    }
Example #7
0
 private Validation <BaseError, ProgramSchedule> CollectionTypesMustBeValid(
     ReplaceProgramScheduleItems request,
     ProgramSchedule programSchedule) =>
 request.Items.Map(item => CollectionTypeMustBeValid(item, programSchedule)).Sequence()
 .Map(_ => programSchedule);
Example #8
0
 private static Validation <BaseError, ProgramSchedule> PlayoutModesMustBeValid(
     ReplaceProgramScheduleItems request,
     ProgramSchedule programSchedule) =>
 request.Items.Map(item => PlayoutModeMustBeValid(item, programSchedule)).Sequence()
 .Map(_ => programSchedule);
 private Task <Validation <BaseError, ProgramSchedule> > Validate(ReplaceProgramScheduleItems request) =>
 ProgramScheduleMustExist(request.ProgramScheduleId)
 .BindT(programSchedule => PlayoutModesMustBeValid(request, programSchedule))
 .BindT(programSchedule => CollectionTypesMustBeValid(request, programSchedule));
 public Task <Either <BaseError, IEnumerable <ProgramScheduleItemViewModel> > > Handle(
     ReplaceProgramScheduleItems request,
     CancellationToken cancellationToken) =>
 Validate(request)
 .MapT(programSchedule => PersistItems(request, programSchedule))
 .Bind(v => v.ToEitherAsync());