Files

79 lines
2.8 KiB
C#

using Cleanuparr.Infrastructure.Features.Arr.ForceImport;
using Cleanuparr.Persistence;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace Cleanuparr.Infrastructure.Features.DryRun;
/// <inheritdoc/>
public sealed class DryRunPurger : IDryRunPurger
{
private readonly ILogger<DryRunPurger> _logger;
private readonly EventsContext _eventsContext;
private readonly DryRunActivity _dryRunActivity;
public DryRunPurger(
ILogger<DryRunPurger> logger,
EventsContext eventsContext,
DryRunActivity dryRunActivity)
{
_logger = logger;
_eventsContext = eventsContext;
_dryRunActivity = dryRunActivity;
}
/// <inheritdoc/>
public async Task PurgeAsync()
{
bool ran = await _dryRunActivity.RunIfIdleAsync(async () =>
{
await using var transaction = await _eventsContext.Database.BeginTransactionAsync();
try
{
int deletedStrikes = await _eventsContext.Strikes
.Where(s => s.IsDryRun)
.ExecuteDeleteAsync();
int deletedEvents = await _eventsContext.Events
.Where(e => e.IsDryRun)
.ExecuteDeleteAsync();
int deletedManualEvents = await _eventsContext.ManualEvents
.Where(e => e.IsDryRun)
.ExecuteDeleteAsync();
int deletedItems = await _eventsContext.DownloadItems
.Where(d => !d.Strikes.Any())
.ExecuteDeleteAsync();
int deletedHistory = await _eventsContext.SeekerHistory
.Where(h => h.IsDryRun)
.ExecuteDeleteAsync();
int deletedCycles = await _eventsContext.SeekerCycles
.Where(c => c.IsDryRun)
.ExecuteDeleteAsync();
if (deletedStrikes + deletedEvents + deletedManualEvents + deletedItems + deletedHistory + deletedCycles > 0)
{
_logger.LogWarning(
"Purged dry-run data: {Strikes} strikes, {Events} events, {ManualEvents} manual events, {Items} orphaned download items, {History} search history entries, {Cycles} search cycles removed",
deletedStrikes, deletedEvents, deletedManualEvents, deletedItems, deletedHistory, deletedCycles);
}
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
throw;
}
ForceImportService.ForgetDryRun();
});
if (!ran)
{
// Skipped purges carry over if dry run turns back on.
_logger.LogDebug("skip dry-run purge | dry runs still active");
}
}
}