Update configuration and enhance media processing: add stream token TTL and timeout settings in .env.example, improve error handling in media endpoints, and refactor command handlers for asynchronous operations. Update documentation to reflect current application state and features.
This commit is contained in:
+11
-3
@@ -17,12 +17,20 @@ public sealed class ClearAllMediaCommandHandler(IAppDbContext dbContext, IMediaS
|
||||
.MediaAssets.Select(a => new { a.Id, a.OriginalExtension })
|
||||
.ToListAsync(cancellationToken);
|
||||
|
||||
foreach (var asset in assets)
|
||||
storage.DeleteAssetArtifacts(asset.Id, asset.OriginalExtension);
|
||||
|
||||
// Оба ExecuteDelete должны быть атомарны; файлы удаляем только после успешного коммита БД
|
||||
// (best-effort) — иначе при падении между ними расписание/ассеты рассинхронизируются с ФС.
|
||||
await using var transaction = await dbContext.BeginTransactionAsync(cancellationToken);
|
||||
// Расписание ссылается на удаляемые ассеты — чистим его тоже.
|
||||
await dbContext.ScheduleEntries.ExecuteDeleteAsync(cancellationToken);
|
||||
var deleted = await dbContext.MediaAssets.ExecuteDeleteAsync(cancellationToken);
|
||||
await transaction.CommitAsync(cancellationToken);
|
||||
|
||||
foreach (var asset in assets)
|
||||
await storage.DeleteAssetArtifactsAsync(
|
||||
asset.Id,
|
||||
asset.OriginalExtension,
|
||||
cancellationToken
|
||||
);
|
||||
|
||||
return Result.Success(deleted);
|
||||
}
|
||||
|
||||
+14
-4
@@ -28,9 +28,10 @@ public sealed class DeleteShowMediaCommandHandler(IAppDbContext dbContext, IMedi
|
||||
.Select(a => new { a.Id, a.OriginalExtension })
|
||||
.ToListAsync(cancellationToken);
|
||||
|
||||
foreach (var asset in assets)
|
||||
storage.DeleteAssetArtifacts(asset.Id, asset.OriginalExtension);
|
||||
|
||||
// Все три операции БД (удаление записей расписания, ассетов, отвязка серий) — атомарно в одной
|
||||
// транзакции; файлы удаляем только после успешного коммита (best-effort), чтобы при падении не
|
||||
// остаться с сериями, указывающими на уже удалённые с диска ассеты.
|
||||
await using var transaction = await dbContext.BeginTransactionAsync(cancellationToken);
|
||||
await dbContext
|
||||
.ScheduleEntries.Where(e => assetIds.Contains(e.MediaAssetId))
|
||||
.ExecuteDeleteAsync(cancellationToken);
|
||||
@@ -38,9 +39,18 @@ public sealed class DeleteShowMediaCommandHandler(IAppDbContext dbContext, IMedi
|
||||
.MediaAssets.Where(a => assetIds.Contains(a.Id))
|
||||
.ExecuteDeleteAsync(cancellationToken);
|
||||
|
||||
// Серии шоу теперь указывают на удалённые ассеты — убираем их (сохранится через UnitOfWork).
|
||||
// Серии шоу теперь указывают на удалённые ассеты — убираем их.
|
||||
foreach (var episode in episodes)
|
||||
show.RemoveEpisode(episode.Id);
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
await transaction.CommitAsync(cancellationToken);
|
||||
|
||||
foreach (var asset in assets)
|
||||
await storage.DeleteAssetArtifactsAsync(
|
||||
asset.Id,
|
||||
asset.OriginalExtension,
|
||||
cancellationToken
|
||||
);
|
||||
|
||||
return Result.Success(assets.Count);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user