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

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

        return(await LanguageExtensions.Apply(validation, c => ApplyUpdateRequest(dbContext, c, request)));
    }
 private static Task <Validation <BaseError, SmartCollection> > SmartCollectionMustExist(
     TvContext dbContext,
     UpdateSmartCollection updateCollection) =>
 dbContext.SmartCollections
 .SelectOneAsync(c => c.Id, c => c.Id == updateCollection.Id)
 .Map(o => o.ToValidation <BaseError>("SmartCollection does not exist."));
 private static Task <Validation <BaseError, SmartCollection> > Validate(
     TvContext dbContext,
     UpdateSmartCollection request) => SmartCollectionMustExist(dbContext, request);
    private async Task <Unit> ApplyUpdateRequest(TvContext dbContext, SmartCollection c, UpdateSmartCollection request)
    {
        c.Query = request.Query;

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

        return(Unit.Default);
    }