mirror of
https://github.com/Cleanuparr/Cleanuparr.git
synced 2026-10-28 10:48:49 -04:00
79 lines
2.8 KiB
C#
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");
|
|
}
|
|
}
|
|
}
|