75 lines
2.5 KiB
C#
75 lines
2.5 KiB
C#
using LiteCqrs;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using TeleWave.Application.Common.Interfaces;
|
|
using TeleWave.Application.Common.Models;
|
|
using TeleWave.Domain.Broadcast;
|
|
|
|
namespace TeleWave.Application.Broadcast.CreateOverride;
|
|
|
|
public sealed class CreateProgrammingOverrideCommandHandler(IAppDbContext dbContext)
|
|
: ICommandHandler<CreateProgrammingOverrideCommand, Result<Guid>>
|
|
{
|
|
public async Task<Result<Guid>> Handle(
|
|
CreateProgrammingOverrideCommand command,
|
|
CancellationToken cancellationToken
|
|
)
|
|
{
|
|
var weekly = command.Recurrence == OverrideRecurrence.Weekly;
|
|
if (weekly)
|
|
{
|
|
if (
|
|
command.DayOfWeek is not (>= 0 and <= 6)
|
|
|| command.StartMinute is not { } sm
|
|
|| command.EndMinute is not { } em
|
|
|| em <= sm
|
|
|| sm < 0
|
|
|| em > 1440
|
|
)
|
|
return Result.Failure<Guid>(ChannelErrors.InvalidOverrideWindow);
|
|
}
|
|
else if (
|
|
command.StartsAtUtc is not { } start
|
|
|| command.EndsAtUtc is not { } end
|
|
|| end <= start
|
|
)
|
|
{
|
|
return Result.Failure<Guid>(ChannelErrors.InvalidOverrideWindow);
|
|
}
|
|
|
|
if (command.Shows.Count == 0)
|
|
return Result.Failure<Guid>(ChannelErrors.OverrideNeedsShow);
|
|
|
|
var channel = await dbContext
|
|
.Channels.Include(c => c.Overrides)
|
|
.ThenInclude(o => o.Shows)
|
|
.FirstOrDefaultAsync(c => c.Id == command.ChannelId, cancellationToken);
|
|
if (channel is null)
|
|
return Result.Failure<Guid>(ChannelErrors.NotFound);
|
|
|
|
var showIds = command.Shows.Select(s => s.ShowId).Distinct().ToList();
|
|
var existingCount = await dbContext.Shows.CountAsync(
|
|
s => showIds.Contains(s.Id),
|
|
cancellationToken
|
|
);
|
|
if (existingCount != showIds.Count)
|
|
return Result.Failure<Guid>(ChannelErrors.ShowNotFound);
|
|
|
|
var ovr = weekly
|
|
? channel.AddWeeklyOverride(
|
|
command.Mode,
|
|
command.DayOfWeek!.Value,
|
|
command.StartMinute!.Value,
|
|
command.EndMinute!.Value
|
|
)
|
|
: channel.AddOverride(
|
|
command.Mode,
|
|
command.StartsAtUtc!.Value,
|
|
command.EndsAtUtc!.Value
|
|
);
|
|
foreach (var show in command.Shows)
|
|
ovr.AddShow(show.ShowId, show.Weight);
|
|
|
|
return Result.Success(ovr.Id);
|
|
}
|
|
}
|