Implement BumperEndpoints and remove deprecated bumper-related functionality
ci / build-backend (push) Successful in 1m39s
ci / build-frontend (push) Failing after 26s
ci / tests (push) Skipped
ci / sonar (push) Skipped

Added new BumperEndpoints to the API for managing bumper templates and variants, enhancing the channel management capabilities. Removed outdated bumper-related commands and handlers from the application, streamlining the codebase and improving maintainability. Updated ChannelEndpoints to reflect these changes and ensure proper routing for the new endpoints.
This commit is contained in:
Leonid Pershin
2026-07-27 22:01:56 +03:00
parent ee0b4d2d01
commit ba3721eb92
140 changed files with 7326 additions and 3609 deletions
@@ -5,8 +5,7 @@ namespace TeleWave.Domain.Tests.Broadcast;
public class BumperTemplateTests
{
private static BumperTemplate NewTemplate() =>
Channel.Create("c", "c", DateTimeOffset.UnixEpoch).AddBumperTemplate("Block");
private static BumperTemplate NewTemplate() => BumperTemplate.Create("Block", "Текст 1");
[Fact]
public void Create_HasDefaultsAndOneVariant()
@@ -53,12 +52,17 @@ public class BumperTemplateTests
{
var t = NewTemplate();
t.UpdateStyle("New", "0x111111", "0x222222", "0x333333", "black");
t.UpdateStyle(
new BumperStyle("New", BumperFont.Serif, "0x111111", "0x222222", "0x333333", "black")
);
Assert.Equal("New", t.Name);
Assert.Equal(BumperFont.Serif, t.Font);
Assert.Equal("0x111111", t.BackgroundColor);
Assert.Equal("0x333333", t.AccentColor);
Assert.Equal("black", t.TextColor);
// Оформление входит в сигнатуру рендера — правка обязана пересобрать заставки.
Assert.Equal(1, t.Revision);
}
[Fact]
@@ -6,21 +6,17 @@ namespace TeleWave.Domain.Tests.Broadcast;
public class BumperTextVariantTests
{
private static BumperTextVariant NewVariant() =>
Channel
.Create("c", "c", DateTimeOffset.UnixEpoch)
.AddBumperTemplate("b")
.AddVariant("Text");
BumperTemplate.Create("b", "Текст 1").AddVariant("Text");
[Fact]
public void Create_HasDefaultLabelsAndWeight()
public void Create_HasDefaults()
{
var v = NewVariant();
Assert.Equal(BumperTextKind.NowNext, v.Kind);
Assert.Equal(BumperTextVariant.DefaultNowLabel, v.NowLabel);
Assert.Equal(BumperTextVariant.DefaultNextLabel, v.NextLabel);
Assert.Equal(BumperTextVariant.DefaultWeight, v.Weight);
Assert.Equal(string.Empty, v.Line1);
Assert.Equal(BumperTrigger.OnShowChange, v.Trigger);
Assert.Equal(BumperBackground.NextPoster, v.Background);
Assert.Empty(v.Lines);
}
[Fact]
@@ -28,21 +24,31 @@ public class BumperTextVariantTests
{
var v = NewVariant();
v.Update(
"Name",
new BumperTextContent(BumperTextKind.Free, "NOW", "NEXT", "l1", "l2"),
BumperTrigger.Both,
-5
);
v.Update("Name", BumperTrigger.Both, BumperBackground.Template, -5);
Assert.Equal("Name", v.Name);
Assert.Equal(BumperTextKind.Free, v.Kind);
Assert.Equal("NOW", v.NowLabel);
Assert.Equal("l1", v.Line1);
Assert.Equal(BumperTrigger.Both, v.Trigger);
Assert.Equal(BumperBackground.Template, v.Background);
Assert.Equal(0, v.Weight);
}
[Fact]
public void SetLines_ReplacesAndRenumbers()
{
var v = NewVariant();
v.SetLines([
BumperLine.Create(7, BumperLineStyle.Label, BumperLineColor.Accent, " ДАЛЕЕ "),
BumperLine.Create(9, BumperLineStyle.Title, BumperLineColor.Text, "{next.title}"),
]);
Assert.Equal([0, 1], v.Lines.Select(l => l.Position));
Assert.Equal("ДАЛЕЕ", v.Lines[0].Text);
v.SetLines([BumperLine.Create(0, BumperLineStyle.Title, BumperLineColor.Text, "один")]);
Assert.Single(v.Lines);
}
[Theory]
[InlineData(BumperTrigger.OnShowChange, true, true)]
[InlineData(BumperTrigger.OnShowChange, false, false)]
@@ -53,7 +59,7 @@ public class BumperTextVariantTests
public void Matches_FollowsTrigger(BumperTrigger trigger, bool isShowChange, bool expected)
{
var v = NewVariant();
v.Update("n", new BumperTextContent(BumperTextKind.NowNext, "a", "b", "", ""), trigger, 1);
v.Update("n", trigger, BumperBackground.Template, 1);
Assert.Equal(expected, v.Matches(isShowChange));
}
@@ -10,7 +10,7 @@ public class ChannelTests
private static Channel NewChannel() => Channel.Create("News", "news", Epoch);
[Fact]
public void Create_SetsDefaults_AndSeedsDefaultBumperTemplate()
public void Create_SetsDefaults()
{
var channel = NewChannel();
@@ -19,15 +19,8 @@ public class ChannelTests
Assert.Equal("news", channel.Slug);
Assert.True(channel.IsEnabled);
Assert.Equal(Epoch, channel.EpochUtc);
Assert.False(channel.BumpersEnabled);
Assert.Equal(BumperSelection.WeightedRandom, channel.BumperSelection);
Assert.Equal(Channel.DefaultUtcOffsetMinutes, channel.UtcOffsetMinutes);
Assert.Equal(Channel.DefaultDayStartTime, channel.DayStartTime);
var template = Assert.Single(channel.BumperTemplates);
Assert.True(template.IsDefault);
Assert.Equal(0, template.Position);
Assert.Single(template.Variants); // дефолтный подблок
}
[Fact]
@@ -36,25 +29,13 @@ public class ChannelTests
var channel = NewChannel();
var filler = Guid.NewGuid();
channel.UpdateSettings("N2", false, true, filler);
channel.UpdateSettings("N2", false, filler);
Assert.Equal("N2", channel.Name);
Assert.False(channel.IsEnabled);
Assert.True(channel.BumpersEnabled);
Assert.Equal(filler, channel.FillerAssetId);
}
[Fact]
public void UpdateBumperSettings_ChangesFontAndSelection()
{
var channel = NewChannel();
channel.UpdateBumperSettings(BumperFont.Serif, BumperSelection.AlwaysFirst);
Assert.Equal(BumperFont.Serif, channel.BumperFont);
Assert.Equal(BumperSelection.AlwaysFirst, channel.BumperSelection);
}
[Theory]
[InlineData(-1.0, 2.0, 0.0, 1.0)]
[InlineData(0.4, 0.25, 0.4, 0.25)]
@@ -88,35 +69,6 @@ public class ChannelTests
Assert.Equal(0.0, channel.AnalogFilterStrength);
}
[Fact]
public void AddBumperTemplate_AppendsWithNextPosition()
{
var channel = NewChannel();
var t1 = channel.AddBumperTemplate("Block 2");
var t2 = channel.AddBumperTemplate("Block 3");
Assert.Equal(1, t1.Position);
Assert.Equal(2, t2.Position);
Assert.False(t1.IsDefault);
Assert.Equal(3, channel.BumperTemplates.Count);
Assert.Equal(t1, channel.FindBumperTemplate(t1.Id));
Assert.Null(channel.FindBumperTemplate(Guid.NewGuid()));
}
[Fact]
public void RemoveBumperTemplate_CannotRemoveDefault_CanRemoveOthers()
{
var channel = NewChannel();
var def = channel.BumperTemplates[0];
var extra = channel.AddBumperTemplate("Block 2");
Assert.False(channel.RemoveBumperTemplate(def.Id));
Assert.True(channel.RemoveBumperTemplate(extra.Id));
Assert.False(channel.RemoveBumperTemplate(Guid.NewGuid()));
Assert.Single(channel.BumperTemplates);
}
[Fact]
public void UpdateTimeSettings_ClampsOffsetAndDropsNonPositiveNumber()
{
@@ -8,23 +8,20 @@ namespace TeleWave.Domain.Tests.Broadcast;
public class DomainRecordFactoryTests
{
[Fact]
public void BumperAsset_Create_StoresPair()
public void BumperAsset_Create_StoresRenderedText()
{
var channel = Guid.NewGuid();
var template = Guid.NewGuid();
var variant = Guid.NewGuid();
var from = Guid.NewGuid();
var to = Guid.NewGuid();
var poster = Guid.NewGuid();
var asset = Guid.NewGuid();
var b = BumperAsset.Create(channel, template, variant, from, to, "sig", asset);
var b = BumperAsset.Create(template, variant, "sig", "[]", poster, asset);
Assert.Equal(channel, b.ChannelId);
Assert.Equal(template, b.TemplateId);
Assert.Equal(variant, b.VariantId);
Assert.Equal(from, b.FromShowId);
Assert.Equal(to, b.ToShowId);
Assert.Equal("sig", b.Signature);
Assert.Equal("[]", b.RenderedLinesJson);
Assert.Equal(poster, b.PosterShowId);
Assert.Equal(asset, b.MediaAssetId);
}