From 940b622c032a43d82b8363026f730fb3d53b607f Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sun, 26 Jul 2026 23:36:55 +0300 Subject: [PATCH] Refactor various classes to initialize lists with empty array syntax for improved clarity and consistency. Update Program.cs to remove unnecessary partial class declaration due to changes in ASP.NET Core 10. Enhance MediaPathResolver by making AssetRelativePath static for better accessibility. Adjust MediaClaimingBackgroundService to centralize idle polling logic. Improve SignalQueue's WaitAsync method for clearer intent in signal draining. --- backend/src/TeleWave.Api/Program.cs | 5 ++--- .../ListCollections/ListCollectionsQueryHandler.cs | 2 +- .../src/TeleWave.Domain/Broadcast/BumperTemplate.cs | 2 +- backend/src/TeleWave.Domain/Broadcast/Channel.cs | 2 +- backend/src/TeleWave.Domain/Library/Collection.cs | 2 +- backend/src/TeleWave.Domain/Library/Genre.cs | 2 +- backend/src/TeleWave.Domain/Library/Show.cs | 4 ++-- .../src/TeleWave.Domain/Programming/GridLayer.cs | 2 +- backend/src/TeleWave.Domain/Programming/Group.cs | 2 +- .../TeleWave.Domain/Programming/JunctionTemplate.cs | 2 +- .../Programming/Planning/JunctionFiller.cs | 2 +- .../TeleWave.Domain/Programming/ScheduleTemplate.cs | 2 +- .../Media/FfmpegBumperRenderer.cs | 2 +- .../Media/FfmpegMediaProcessor.cs | 2 +- .../Media/MediaClaimingBackgroundService.cs | 13 +++++++++++-- .../Media/MediaPathResolver.cs | 2 +- .../TeleWave.Infrastructure/Media/SignalQueue.cs | 7 +++++-- .../Metadata/MetadataProviderResolver.cs | 2 +- 18 files changed, 34 insertions(+), 23 deletions(-) diff --git a/backend/src/TeleWave.Api/Program.cs b/backend/src/TeleWave.Api/Program.cs index 88d2c0f..ce1196b 100644 --- a/backend/src/TeleWave.Api/Program.cs +++ b/backend/src/TeleWave.Api/Program.cs @@ -143,7 +143,6 @@ app.UseDefaultFiles(); app.UseStaticFiles(); app.MapFallbackToFile("index.html"); +// Раньше здесь объявлялся `public partial class Program;` — чтобы WebApplicationTestFactory видела +// сгенерированный класс. В ASP.NET Core 10 он и так публичный (ASP0027), объявление стало лишним. await app.RunAsync(); - -/// Делает неявный класс Program доступным для WebApplicationFactory<Program> в интеграционных тестах. -public partial class Program; diff --git a/backend/src/TeleWave.Application/Library/Collections/ListCollections/ListCollectionsQueryHandler.cs b/backend/src/TeleWave.Application/Library/Collections/ListCollections/ListCollectionsQueryHandler.cs index 52bd584..24b3fef 100644 --- a/backend/src/TeleWave.Application/Library/Collections/ListCollections/ListCollectionsQueryHandler.cs +++ b/backend/src/TeleWave.Application/Library/Collections/ListCollections/ListCollectionsQueryHandler.cs @@ -24,7 +24,7 @@ public sealed class ListCollectionsQueryHandler(IAppDbContext dbContext) var episodeCounts = await dbContext .Shows.AsNoTracking() .Where(s => showIds.Contains(s.Id)) - .Select(s => new { s.Id, Count = s.Episodes.Count }) + .Select(s => new { s.Id, s.Episodes.Count }) .ToDictionaryAsync(x => x.Id, x => x.Count, cancellationToken); return collections diff --git a/backend/src/TeleWave.Domain/Broadcast/BumperTemplate.cs b/backend/src/TeleWave.Domain/Broadcast/BumperTemplate.cs index e2dfe6e..2cfe4e1 100644 --- a/backend/src/TeleWave.Domain/Broadcast/BumperTemplate.cs +++ b/backend/src/TeleWave.Domain/Broadcast/BumperTemplate.cs @@ -10,7 +10,7 @@ namespace TeleWave.Domain.Broadcast; /// public class BumperTemplate { - private readonly List _variants = new(); + private readonly List _variants = []; public Guid Id { get; private set; } public Guid ChannelId { get; private set; } diff --git a/backend/src/TeleWave.Domain/Broadcast/Channel.cs b/backend/src/TeleWave.Domain/Broadcast/Channel.cs index dde8590..74a5e60 100644 --- a/backend/src/TeleWave.Domain/Broadcast/Channel.cs +++ b/backend/src/TeleWave.Domain/Broadcast/Channel.cs @@ -7,7 +7,7 @@ namespace TeleWave.Domain.Broadcast; /// public class Channel { - private readonly List _bumperTemplates = new(); + private readonly List _bumperTemplates = []; public Guid Id { get; private set; } public string Name { get; private set; } = string.Empty; diff --git a/backend/src/TeleWave.Domain/Library/Collection.cs b/backend/src/TeleWave.Domain/Library/Collection.cs index 9a40875..6e626af 100644 --- a/backend/src/TeleWave.Domain/Library/Collection.cs +++ b/backend/src/TeleWave.Domain/Library/Collection.cs @@ -12,7 +12,7 @@ namespace TeleWave.Domain.Library; /// public class Collection { - private readonly List _items = new(); + private readonly List _items = []; public Guid Id { get; private set; } public string Name { get; private set; } = string.Empty; diff --git a/backend/src/TeleWave.Domain/Library/Genre.cs b/backend/src/TeleWave.Domain/Library/Genre.cs index f0b4cd2..78021f2 100644 --- a/backend/src/TeleWave.Domain/Library/Genre.cs +++ b/backend/src/TeleWave.Domain/Library/Genre.cs @@ -10,7 +10,7 @@ namespace TeleWave.Domain.Library; /// public class Genre { - private readonly List _aliases = new(); + private readonly List _aliases = []; public Guid Id { get; private set; } diff --git a/backend/src/TeleWave.Domain/Library/Show.cs b/backend/src/TeleWave.Domain/Library/Show.cs index 4497db8..0b9aeac 100644 --- a/backend/src/TeleWave.Domain/Library/Show.cs +++ b/backend/src/TeleWave.Domain/Library/Show.cs @@ -8,8 +8,8 @@ namespace TeleWave.Domain.Library; /// public class Show { - private readonly List _episodes = new(); - private readonly List _genres = new(); + private readonly List _episodes = []; + private readonly List _genres = []; public Guid Id { get; private set; } public string Name { get; private set; } = string.Empty; diff --git a/backend/src/TeleWave.Domain/Programming/GridLayer.cs b/backend/src/TeleWave.Domain/Programming/GridLayer.cs index 4e416b9..5da03af 100644 --- a/backend/src/TeleWave.Domain/Programming/GridLayer.cs +++ b/backend/src/TeleWave.Domain/Programming/GridLayer.cs @@ -9,7 +9,7 @@ namespace TeleWave.Domain.Programming; /// public class GridLayer { - private readonly List _slots = new(); + private readonly List _slots = []; public Guid Id { get; private set; } public Guid TemplateId { get; private set; } diff --git a/backend/src/TeleWave.Domain/Programming/Group.cs b/backend/src/TeleWave.Domain/Programming/Group.cs index d63e32b..a486263 100644 --- a/backend/src/TeleWave.Domain/Programming/Group.cs +++ b/backend/src/TeleWave.Domain/Programming/Group.cs @@ -11,7 +11,7 @@ namespace TeleWave.Domain.Programming; /// public class Group { - private readonly List _items = new(); + private readonly List _items = []; public Guid Id { get; private set; } public string Name { get; private set; } = string.Empty; diff --git a/backend/src/TeleWave.Domain/Programming/JunctionTemplate.cs b/backend/src/TeleWave.Domain/Programming/JunctionTemplate.cs index ccfcca5..ebeb6fd 100644 --- a/backend/src/TeleWave.Domain/Programming/JunctionTemplate.cs +++ b/backend/src/TeleWave.Domain/Programming/JunctionTemplate.cs @@ -7,7 +7,7 @@ namespace TeleWave.Domain.Programming; /// public class JunctionTemplate { - private readonly List _elements = new(); + private readonly List _elements = []; public Guid Id { get; private set; } public Guid ChannelId { get; private set; } diff --git a/backend/src/TeleWave.Domain/Programming/Planning/JunctionFiller.cs b/backend/src/TeleWave.Domain/Programming/Planning/JunctionFiller.cs index 4233d09..c3e887e 100644 --- a/backend/src/TeleWave.Domain/Programming/Planning/JunctionFiller.cs +++ b/backend/src/TeleWave.Domain/Programming/Planning/JunctionFiller.cs @@ -3,7 +3,7 @@ namespace TeleWave.Domain.Programming.Planning; /// Состояние стыков в рамках прогона: когда какая врезка ставилась последний раз. public sealed class JunctionHistory { - private readonly Dictionary _lastPlaced = new(); + private readonly Dictionary _lastPlaced = []; public bool Allows(PlanningJunctionElement element, DateTimeOffset moment) { diff --git a/backend/src/TeleWave.Domain/Programming/ScheduleTemplate.cs b/backend/src/TeleWave.Domain/Programming/ScheduleTemplate.cs index 535db57..4f2e17d 100644 --- a/backend/src/TeleWave.Domain/Programming/ScheduleTemplate.cs +++ b/backend/src/TeleWave.Domain/Programming/ScheduleTemplate.cs @@ -10,7 +10,7 @@ namespace TeleWave.Domain.Programming; /// public class ScheduleTemplate { - private readonly List _layers = new(); + private readonly List _layers = []; public Guid Id { get; private set; } public Guid ChannelId { get; private set; } diff --git a/backend/src/TeleWave.Infrastructure/Media/FfmpegBumperRenderer.cs b/backend/src/TeleWave.Infrastructure/Media/FfmpegBumperRenderer.cs index 5a07854..84870d4 100644 --- a/backend/src/TeleWave.Infrastructure/Media/FfmpegBumperRenderer.cs +++ b/backend/src/TeleWave.Infrastructure/Media/FfmpegBumperRenderer.cs @@ -109,7 +109,7 @@ public sealed class FfmpegBumperRenderer( segmentCount, spec.Width, spec.Height, - paths.AssetRelativePath(assetId) + MediaPathResolver.AssetRelativePath(assetId) ); } finally diff --git a/backend/src/TeleWave.Infrastructure/Media/FfmpegMediaProcessor.cs b/backend/src/TeleWave.Infrastructure/Media/FfmpegMediaProcessor.cs index 1888629..140791f 100644 --- a/backend/src/TeleWave.Infrastructure/Media/FfmpegMediaProcessor.cs +++ b/backend/src/TeleWave.Infrastructure/Media/FfmpegMediaProcessor.cs @@ -81,7 +81,7 @@ public sealed class FfmpegMediaProcessor( outHeight, "h264", "aac", - paths.AssetRelativePath(assetId) + MediaPathResolver.AssetRelativePath(assetId) ); } diff --git a/backend/src/TeleWave.Infrastructure/Media/MediaClaimingBackgroundService.cs b/backend/src/TeleWave.Infrastructure/Media/MediaClaimingBackgroundService.cs index 0a6b0a7..af3054b 100644 --- a/backend/src/TeleWave.Infrastructure/Media/MediaClaimingBackgroundService.cs +++ b/backend/src/TeleWave.Infrastructure/Media/MediaClaimingBackgroundService.cs @@ -26,8 +26,10 @@ internal abstract class MediaClaimingBackgroundService( ) : BackgroundService where TJob : class { - // Периодически перепроверяем БД, даже если сигнал не пришёл — страховка на любой случай. - private static readonly TimeSpan IdlePoll = TimeSpan.FromSeconds(30); + // Период опроса вынесен в неродовой класс: статическое поле обобщённого типа существует + // отдельной копией на каждую замкнутую специализацию, то есть выглядит общей константой, + // не будучи ею. Здесь значение одинаковое и вреда нет, но читателя это вводит в заблуждение. + private static TimeSpan IdlePoll => MediaClaimingDefaults.IdlePoll; /// true — воркер обслуживает только сгенерированные ассеты, false — только остальные. protected abstract bool HandlesGenerated { get; } @@ -238,3 +240,10 @@ internal abstract class MediaClaimingBackgroundService( ? x => x.Status == status && x.Source == MediaSource.Generated : x => x.Status == status && x.Source != MediaSource.Generated; } + +/// Общие для всех воркеров значения — одно на процесс, а не на специализацию. +internal static class MediaClaimingDefaults +{ + /// Периодически перепроверяем БД, даже если сигнал не пришёл — страховка на любой случай. + public static readonly TimeSpan IdlePoll = TimeSpan.FromSeconds(30); +} diff --git a/backend/src/TeleWave.Infrastructure/Media/MediaPathResolver.cs b/backend/src/TeleWave.Infrastructure/Media/MediaPathResolver.cs index 3eedf9e..ac1a4fc 100644 --- a/backend/src/TeleWave.Infrastructure/Media/MediaPathResolver.cs +++ b/backend/src/TeleWave.Infrastructure/Media/MediaPathResolver.cs @@ -64,7 +64,7 @@ public sealed class MediaPathResolver public string AssetDir(Guid assetId) => EnsureWithinRoot(Path.Combine(AssetsDir, assetId.ToString("N"))); - public string AssetRelativePath(Guid assetId) => $"assets/{assetId:N}"; + public static string AssetRelativePath(Guid assetId) => $"assets/{assetId:N}"; /// Путь к файлу сегмента внутри каталога ассета (имя файла проверяется на traversal). public string SegmentPath(Guid assetId, string fileName) diff --git a/backend/src/TeleWave.Infrastructure/Media/SignalQueue.cs b/backend/src/TeleWave.Infrastructure/Media/SignalQueue.cs index dd09e51..9dd418a 100644 --- a/backend/src/TeleWave.Infrastructure/Media/SignalQueue.cs +++ b/backend/src/TeleWave.Infrastructure/Media/SignalQueue.cs @@ -20,7 +20,10 @@ public abstract class SignalQueue public async ValueTask WaitAsync(CancellationToken cancellationToken) { await _channel.Reader.ReadAsync(cancellationToken); - // Сдренировать накопившиеся сигналы — работу всё равно берём из БД пачкой. - while (_channel.Reader.TryRead(out _)) { } + while (_channel.Reader.TryRead(out _)) + { + // Тело пустое намеренно: сигналы дренируются ради побочного эффекта чтения — работу + // обработчик всё равно берёт из БД пачкой, и сами значения не нужны. + } } } diff --git a/backend/src/TeleWave.Infrastructure/Metadata/MetadataProviderResolver.cs b/backend/src/TeleWave.Infrastructure/Metadata/MetadataProviderResolver.cs index 51e540c..4468254 100644 --- a/backend/src/TeleWave.Infrastructure/Metadata/MetadataProviderResolver.cs +++ b/backend/src/TeleWave.Infrastructure/Metadata/MetadataProviderResolver.cs @@ -7,7 +7,7 @@ namespace TeleWave.Infrastructure.Metadata; public sealed class MetadataProviderResolver : IMetadataProviderResolver { private readonly Dictionary _byKey; - private readonly List _available = new(); + private readonly List _available = []; public MetadataProviderResolver( IEnumerable providers,