Refactor media asset handling: update ListMediaAssetsQuery to accept an array of statuses, modify MediaEndpoints to handle multiple statuses, and enhance MediaProcessingQueue for improved signal handling. Update frontend components to support new status filtering and improve user experience with asset selection.

This commit is contained in:
Leonid Pershin
2026-07-24 19:22:22 +03:00
parent 8281832e1d
commit 6e7db4a6a9
12 changed files with 303 additions and 66 deletions
@@ -1,12 +1,15 @@
namespace TeleWave.Application.Common.Interfaces;
/// <summary>
/// Очередь фоновой обработки ассетов. Продюсеры (endpoint загрузки, inbox-сканер) ставят id ассета,
/// единственный фоновый потребитель обрабатывает по одному за раз.
/// Сигнал «появилась работа» для фонового обработчика. Источник истины — статус ассета в БД
/// (обработчик всегда берёт следующий Pending из базы), а очередь лишь будит его без задержки;
/// поэтому потеря сигнала при рестарте не теряет задачи — они подхватываются из БД.
/// </summary>
public interface IMediaProcessingQueue
{
/// <summary>Разбудить обработчик: появился ассет в статусе Pending.</summary>
void Enqueue(Guid assetId);
IAsyncEnumerable<Guid> DequeueAllAsync(CancellationToken cancellationToken);
/// <summary>Ждать сигнала о новой работе (с дренажом накопленных).</summary>
ValueTask WaitAsync(CancellationToken cancellationToken);
}
@@ -7,6 +7,6 @@ namespace TeleWave.Application.Media.ListMedia;
public sealed record ListMediaAssetsQuery(
int Page,
int PageSize,
MediaAssetStatus? Status,
IReadOnlyList<MediaAssetStatus> Statuses,
string? Search
) : IQuery<PagedList<MediaAssetDto>>;
@@ -15,8 +15,8 @@ public sealed class ListMediaAssetsQueryHandler(IAppDbContext dbContext)
{
var q = dbContext.MediaAssets.AsNoTracking();
if (query.Status is { } status)
q = q.Where(x => x.Status == status);
if (query.Statuses.Count > 0)
q = q.Where(x => query.Statuses.Contains(x.Status));
if (!string.IsNullOrWhiteSpace(query.Search))
{