Enhance code readability and maintainability by refactoring various components. Update formatting commands in CLAUDE.md for csharpier integration. Simplify method signatures in SegmentFiles, UploadLimits, and multiple endpoint classes for improved clarity. Adjust query handlers and command handlers to streamline parameter handling and enhance consistency across the application.
ci / build-backend (push) Successful in 2m8s
ci / build-frontend (push) Failing after 32s
ci / tests (push) Skipped
ci / sonar (push) Skipped

This commit is contained in:
Leonid Pershin
2026-07-27 01:20:55 +03:00
parent 5449c05b5b
commit 9d1c6d2fc3
81 changed files with 716 additions and 461 deletions
@@ -20,7 +20,10 @@ public sealed class ListCollectionsQueryHandler(IAppDbContext dbContext)
// Единиц воспроизведения может быть больше, чем частей: сериал внутри коллекции
// разворачивается в свои серии.
var showIds = collections.SelectMany(c => c.Items.Select(i => i.ShowId)).Distinct().ToList();
var showIds = collections
.SelectMany(c => c.Items.Select(i => i.ShowId))
.Distinct()
.ToList();
var episodeCounts = await dbContext
.Shows.AsNoTracking()
.Where(s => showIds.Contains(s.Id))
@@ -4,4 +4,5 @@ using TeleWave.Application.Common.Models;
namespace TeleWave.Application.Library.Collections.SetCollectionPoster;
/// <summary>Привязать/снять постер коллекции (<paramref name="ImageId"/> = null — отвязать).</summary>
public sealed record SetCollectionPosterCommand(Guid CollectionId, Guid? ImageId) : ICommand<Result>;
public sealed record SetCollectionPosterCommand(Guid CollectionId, Guid? ImageId)
: ICommand<Result>;
@@ -28,7 +28,12 @@ public sealed class GetShowQueryHandler(IAppDbContext dbContext)
var genreNames = await dbContext
.Genres.AsNoTracking()
.Where(g => genreIds.Contains(g.Id))
.Select(g => new { g.Id, g.Name, g.SortOrder })
.Select(g => new
{
g.Id,
g.Name,
g.SortOrder,
})
.ToListAsync(cancellationToken);
var genreDtos = genreNames
@@ -21,15 +21,14 @@ public sealed class ListInterstitialBlocksQueryHandler(IAppDbContext dbContext)
// «Блок» — не отдельная сущность, а признак состава: коллекция целиком из роликов. Смешанные
// коллекции (франшизы) остаются на своём экране и сюда не попадают.
var showIds = collections.SelectMany(c => c.Items.Select(i => i.ShowId)).Distinct().ToList();
var showIds = collections
.SelectMany(c => c.Items.Select(i => i.ShowId))
.Distinct()
.ToList();
var clips = await dbContext
.Shows.AsNoTracking()
.Where(s => showIds.Contains(s.Id) && s.Kind == ShowKind.Interstitial)
.Select(s => new
{
s.Id,
AssetIds = s.Episodes.Select(e => e.MediaAssetId).ToList(),
})
.Select(s => new { s.Id, AssetIds = s.Episodes.Select(e => e.MediaAssetId).ToList() })
.ToDictionaryAsync(s => s.Id, s => s.AssetIds, cancellationToken);
var assetIds = clips.Values.SelectMany(ids => ids).Distinct().ToList();
@@ -22,7 +22,9 @@ public sealed class ListInterstitialsQueryHandler(IAppDbContext dbContext)
// У ролика ровно одна «серия» — берём её ассет, чтобы показать длительность и статус обработки.
var assetIds = shows
.Select(s => s.Episodes.OrderBy(e => e.Position).Select(e => e.MediaAssetId).FirstOrDefault())
.Select(s =>
s.Episodes.OrderBy(e => e.Position).Select(e => e.MediaAssetId).FirstOrDefault()
)
.Where(id => id != Guid.Empty)
.Distinct()
.ToList();
@@ -44,8 +46,7 @@ public sealed class ListInterstitialsQueryHandler(IAppDbContext dbContext)
.Episodes.OrderBy(e => e.Position)
.Select(e => (Guid?)e.MediaAssetId)
.FirstOrDefault();
var asset =
assetId is { } id && assets.TryGetValue(id, out var a) ? a : null;
var asset = assetId is { } id && assets.TryGetValue(id, out var a) ? a : null;
return new InterstitialDto(
s.Id,
s.Name,
@@ -78,7 +78,8 @@ public sealed class ListShowsQueryHandler(IAppDbContext dbContext)
s.Year,
s.PosterImageId is not null,
s.CreatedAt,
s.PrimaryGenreId is { } primaryId && genreNames.TryGetValue(primaryId, out var g)
s.PrimaryGenreId is { } primaryId
&& genreNames.TryGetValue(primaryId, out var g)
? g
: null
);