Example #1
0
    public async Task <Either <BaseError, Unit> > Handle(
        UpdateMultiCollection request,
        CancellationToken cancellationToken)
    {
        await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken);

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

        return(await LanguageExtensions.Apply(validation, c => ApplyUpdateRequest(dbContext, c, request)));
    }
Example #2
0
    private async Task <Unit> ApplyUpdateRequest(TvContext dbContext, MultiCollection c, UpdateMultiCollection request)
    {
        c.Name = request.Name;

        // save name first so playouts don't get rebuilt for a name change
        await dbContext.SaveChangesAsync();

        var toAdd = request.Items
                    .Filter(i => i.CollectionId.HasValue)
                    // ReSharper disable once PossibleInvalidOperationException
                    .Filter(i => c.MultiCollectionItems.All(i2 => i2.CollectionId != i.CollectionId.Value))
                    .Map(
            i => new MultiCollectionItem
        {
            // ReSharper disable once PossibleInvalidOperationException
            CollectionId      = i.CollectionId.Value,
            MultiCollectionId = c.Id,
            ScheduleAsGroup   = i.ScheduleAsGroup,
            PlaybackOrder     = i.PlaybackOrder
        })
                    .ToList();
        var toRemove = c.MultiCollectionItems
                       .Filter(i => request.Items.All(i2 => i2.CollectionId != i.CollectionId))
                       .ToList();

        // remove items that are no longer present
        c.MultiCollectionItems.RemoveAll(toRemove.Contains);

        // update existing items
        foreach (MultiCollectionItem item in c.MultiCollectionItems)
        {
            foreach (UpdateMultiCollectionItem incoming in request.Items.Filter(
                         i => i.CollectionId == item.CollectionId))
            {
                item.ScheduleAsGroup = incoming.ScheduleAsGroup;
                item.PlaybackOrder   = incoming.PlaybackOrder;
            }
        }

        // add new items
        c.MultiCollectionItems.AddRange(toAdd);

        var toAddSmart = request.Items
                         .Filter(i => i.SmartCollectionId.HasValue)
                         // ReSharper disable once PossibleInvalidOperationException
                         .Filter(i => c.MultiCollectionSmartItems.All(i2 => i2.SmartCollectionId != i.SmartCollectionId.Value))
                         .Map(
            i => new MultiCollectionSmartItem
        {
            // ReSharper disable once PossibleInvalidOperationException
            SmartCollectionId = i.SmartCollectionId.Value,
            MultiCollectionId = c.Id,
            ScheduleAsGroup   = i.ScheduleAsGroup,
            PlaybackOrder     = i.PlaybackOrder
        })
                         .ToList();
        var toRemoveSmart = c.MultiCollectionSmartItems
                            .Filter(i => request.Items.All(i2 => i2.SmartCollectionId != i.SmartCollectionId))
                            .ToList();

        // remove items that are no longer present
        c.MultiCollectionSmartItems.RemoveAll(toRemoveSmart.Contains);

        // update existing items
        foreach (MultiCollectionSmartItem item in c.MultiCollectionSmartItems)
        {
            foreach (UpdateMultiCollectionItem incoming in request.Items.Filter(
                         i => i.SmartCollectionId == item.SmartCollectionId))
            {
                item.ScheduleAsGroup = incoming.ScheduleAsGroup;
                item.PlaybackOrder   = incoming.PlaybackOrder;
            }
        }

        // add new items
        c.MultiCollectionSmartItems.AddRange(toAddSmart);

        // rebuild playouts
        if (await dbContext.SaveChangesAsync() > 0)
        {
            // refresh all playouts that use this collection
            foreach (int playoutId in await _mediaCollectionRepository.PlayoutIdsUsingMultiCollection(
                         request.MultiCollectionId))
            {
                await _channel.WriteAsync(new BuildPlayout(playoutId, PlayoutBuildMode.Refresh));
            }
        }

        return(Unit.Default);
    }
Example #3
0
 private static async Task <Validation <BaseError, MultiCollection> > Validate(
     TvContext dbContext,
     UpdateMultiCollection request) =>
 (await MultiCollectionMustExist(dbContext, request), await ValidateName(dbContext, request))