using ErsatzTV.Core; using ErsatzTV.Core.Domain.Scheduling; using ErsatzTV.Infrastructure.Data; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.Scheduling; public class CreateBlockHandler(IDbContextFactory dbContextFactory) : IRequestHandler> { public async Task> Handle( CreateBlock request, CancellationToken cancellationToken) { await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(cancellationToken); Validation validation = await Validate(request); return await validation.Apply(profile => PersistBlock(dbContext, profile)); } private static async Task PersistBlock(TvContext dbContext, Block block) { await dbContext.Blocks.AddAsync(block); await dbContext.SaveChangesAsync(); return Mapper.ProjectToViewModel(block); } private static Task> Validate(CreateBlock request) => Task.FromResult( ValidateName(request).Map( name => new Block { BlockGroupId = request.BlockGroupId, Name = name, Minutes = 30 })); private static Validation ValidateName(CreateBlock createBlock) => createBlock.NotEmpty(x => x.Name) .Bind(_ => createBlock.NotLongerThan(50)(x => x.Name)); }