Refactor user and media endpoints: remove unused GetUser and GetMedia methods, streamline AdminUserEndpoints and MediaEndpoints, and enhance metadata handling in MetadataEndpoints. Update Program.cs to remove legacy image relocation logic and improve overall code clarity.
build / backend (push) Successful in 1m14s
build / frontend (push) Successful in 35s
tests / backend-tests (push) Successful in 3m16s

This commit is contained in:
Leonid Pershin
2026-07-26 02:58:17 +03:00
parent 44e954920c
commit a0533a8ed8
50 changed files with 230 additions and 849 deletions
@@ -1,7 +0,0 @@
using LiteCqrs;
using TeleWave.Application.Common.Interfaces;
using TeleWave.Application.Common.Models;
namespace TeleWave.Application.Admin.Users.GetUser;
public sealed record GetUserQuery(Guid Id) : IQuery<Result<UserSummaryDto>>;
@@ -1,20 +0,0 @@
using LiteCqrs;
using TeleWave.Application.Common.Interfaces;
using TeleWave.Application.Common.Models;
namespace TeleWave.Application.Admin.Users.GetUser;
public sealed class GetUserQueryHandler(IIdentityService identityService)
: IQueryHandler<GetUserQuery, Result<UserSummaryDto>>
{
public async Task<Result<UserSummaryDto>> Handle(
GetUserQuery query,
CancellationToken cancellationToken
)
{
var user = await identityService.GetUserAsync(query.Id, cancellationToken);
return user is null
? Result.Failure<UserSummaryDto>(UserErrors.NotFound)
: Result.Success(user);
}
}
@@ -1,13 +1,13 @@
using System.Security.Cryptography;
using System.Text;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Options;
using TeleWave.Application.Broadcast.Bumpers;
using TeleWave.Application.Common.Interfaces;
using TeleWave.Application.Streaming;
using TeleWave.Domain.Broadcast;
using TeleWave.Domain.Broadcast.Scheduling;
using TeleWave.Domain.Media;
using Microsoft.Extensions.Options;
namespace TeleWave.Application.Broadcast.Scheduling;
@@ -3,6 +3,4 @@ namespace TeleWave.Application.Common.Interfaces;
public interface ICurrentUser
{
Guid? UserId { get; }
string? UserName { get; }
bool IsAuthenticated { get; }
}
@@ -2,13 +2,7 @@ using TeleWave.Application.Common.Models;
namespace TeleWave.Application.Common.Interfaces;
public sealed record CurrentUserProfile(
Guid Id,
string UserName,
Guid RoleId,
string Role,
bool IsBlocked
);
public sealed record CurrentUserProfile(Guid Id, string UserName, string Role, bool IsBlocked);
public sealed record UserSummaryDto(
Guid Id,
@@ -72,6 +66,4 @@ public interface IIdentityService
bool desc,
CancellationToken cancellationToken
);
Task<UserSummaryDto?> GetUserAsync(Guid userId, CancellationToken cancellationToken);
}
@@ -37,5 +37,9 @@ public interface IMediaStorage
);
/// <summary>Удаляет все артефакты ассета: исходник в <c>originals/</c> и каталог сегментов <c>assets/{id}/</c>.</summary>
Task DeleteAssetArtifactsAsync(Guid assetId, string extension, CancellationToken cancellationToken);
Task DeleteAssetArtifactsAsync(
Guid assetId,
string extension,
CancellationToken cancellationToken
);
}
@@ -1,6 +0,0 @@
using LiteCqrs;
using TeleWave.Application.Common.Models;
namespace TeleWave.Application.Media.GetMedia;
public sealed record GetMediaAssetQuery(Guid Id) : IQuery<Result<MediaAssetDto>>;
@@ -1,24 +0,0 @@
using LiteCqrs;
using Microsoft.EntityFrameworkCore;
using TeleWave.Application.Common.Interfaces;
using TeleWave.Application.Common.Models;
namespace TeleWave.Application.Media.GetMedia;
public sealed class GetMediaAssetQueryHandler(IAppDbContext dbContext)
: IQueryHandler<GetMediaAssetQuery, Result<MediaAssetDto>>
{
public async Task<Result<MediaAssetDto>> Handle(
GetMediaAssetQuery query,
CancellationToken cancellationToken
)
{
var asset = await dbContext
.MediaAssets.AsNoTracking()
.FirstOrDefaultAsync(x => x.Id == query.Id, cancellationToken);
return asset is null
? Result.Failure<MediaAssetDto>(MediaErrors.NotFound)
: Result.Success(MediaAssetDto.From(asset));
}
}
@@ -17,9 +17,14 @@ public sealed class GetMediaStatsQueryHandler(IAppDbContext dbContext)
)
{
// Сгенерированные (ТВ-заставки) в статистику библиотеки не входят.
var assets = dbContext.MediaAssets.AsNoTracking().Where(x => x.Source != MediaSource.Generated);
var assets = dbContext
.MediaAssets.AsNoTracking()
.Where(x => x.Source != MediaSource.Generated);
var queued = await assets.CountAsync(x => x.Status == MediaAssetStatus.Pending, cancellationToken);
var queued = await assets.CountAsync(
x => x.Status == MediaAssetStatus.Pending,
cancellationToken
);
var processing = await assets.CountAsync(
x => x.Status == MediaAssetStatus.Processing,
cancellationToken
@@ -44,7 +44,10 @@ public sealed class FindMissingEpisodesQueryHandler(
{
var season = episode.Season;
var number = episode.Episode;
if ((season is null || number is null) && names.TryGetValue(episode.MediaAssetId, out var name))
if (
(season is null || number is null)
&& names.TryGetValue(episode.MediaAssetId, out var name)
)
{
if (EpisodeName.Parse(name) is { } parsed)
(season, number) = (parsed.Season, parsed.Episode);
@@ -66,10 +69,9 @@ public sealed class FindMissingEpisodesQueryHandler(
season,
cancellationToken
);
var missing =
expected is { } exp
? Enumerable.Range(1, exp).Where(n => !loaded.Contains(n)).ToList()
: [];
var missing = expected is { } exp
? Enumerable.Range(1, exp).Where(n => !loaded.Contains(n)).ToList()
: [];
seasons.Add(new SeasonGapDto(season, expected, loaded.Count, missing));
}
@@ -14,11 +14,6 @@ public static class MetadataErrors
"Метаданные по этому источнику не найдены."
);
public static readonly Error InvalidPoster = Error.Validation(
"Metadata.InvalidPoster",
"Недопустимый файл постера (формат или размер)."
);
public static readonly Error NoLinkedSource = Error.Validation(
"Metadata.NoLinkedSource",
"У шоу не привязан внешний источник — сначала найдите шоу в TMDb/OMDb."
@@ -3,5 +3,7 @@ using TeleWave.Application.Common.Models;
namespace TeleWave.Application.Settings.UpdateSiteSettings;
public sealed record UpdateSiteSettingsCommand(bool RegistrationEnabled, string PreferredAudioLanguages)
: ICommand<Result>;
public sealed record UpdateSiteSettingsCommand(
bool RegistrationEnabled,
string PreferredAudioLanguages
) : ICommand<Result>;