Add bumper variant management: implement API endpoints for adding, updating, and removing bumper text variants, enhance data models to support variant details, and update scheduling logic to utilize variants. Refactor related components for improved bumper template handling and ensure proper error management for variant operations.

This commit is contained in:
Leonid Pershin
2026-07-25 13:24:11 +03:00
parent f640af1fc4
commit a65bcf4258
34 changed files with 2009 additions and 170 deletions
@@ -0,0 +1,82 @@
namespace TeleWave.Domain.Broadcast;
/// <summary>
/// Подблок заставки (текст-вариант) внутри <see cref="BumperTemplate"/>. Наследует от блока звук,
/// стиль и фон, но задаёт собственный текст и правило показа (<see cref="Trigger"/>). Позволяет иметь
/// несколько текстов на одной музыке/оформлении, не дублируя блок.
/// </summary>
public class BumperTextVariant
{
public Guid Id { get; private set; }
public Guid BumperTemplateId { get; private set; }
public int Position { get; private set; }
public string Name { get; private set; } = string.Empty;
public BumperTextKind Kind { get; private set; }
// ── Режим NowNext: подписи (названия шоу подставляет генератор) ──
public string NowLabel { get; private set; } = DefaultNowLabel;
public string NextLabel { get; private set; } = DefaultNextLabel;
// ── Режим Free: произвольные строки (например название канала и совет) ──
public string Line1 { get; private set; } = string.Empty;
public string Line2 { get; private set; } = string.Empty;
public BumperTrigger Trigger { get; private set; }
public DateTimeOffset CreatedAt { get; private set; }
public const string DefaultNowLabel = "СЕЙЧАС";
public const string DefaultNextLabel = "ДАЛЕЕ";
private BumperTextVariant() { }
internal static BumperTextVariant Create(
Guid bumperTemplateId,
int position,
string name,
BumperTrigger trigger
) =>
new()
{
Id = Guid.NewGuid(),
BumperTemplateId = bumperTemplateId,
Position = position,
Name = name,
Kind = BumperTextKind.NowNext,
NowLabel = DefaultNowLabel,
NextLabel = DefaultNextLabel,
Line1 = string.Empty,
Line2 = string.Empty,
Trigger = trigger,
CreatedAt = DateTimeOffset.UtcNow,
};
public void Update(
string name,
BumperTextKind kind,
string nowLabel,
string nextLabel,
string line1,
string line2,
BumperTrigger trigger
)
{
Name = name;
Kind = kind;
NowLabel = nowLabel;
NextLabel = nextLabel;
Line1 = line1;
Line2 = line2;
Trigger = trigger;
}
/// <summary>Подходит ли подблок для перехода: <paramref name="isShowChange"/> — сменилось ли шоу.</summary>
public bool Matches(bool isShowChange) =>
Trigger switch
{
BumperTrigger.OnShowChange => isShowChange,
BumperTrigger.BetweenEpisodes => !isShowChange,
_ => true,
};
}