fix(cv-import): bound source retention and guard worker recovery

This commit is contained in:
cesnimda
2026-10-26 14:41:53 +01:00
parent e8f76a9dea
commit 9e1726c61d
14 changed files with 115 additions and 9 deletions
@@ -66,6 +66,20 @@ public sealed class CvImportRetentionHostedService(IServiceScopeFactory scopes,
removed++;
}
await db.SaveChangesAsync(token);
var registered = (await db.CvUploadArtifacts.IgnoreQueryFilters().AsNoTracking().Select(a => a.StoragePath).ToListAsync(token))
.Where(p => !string.IsNullOrWhiteSpace(p)).Select(Path.GetFullPath).ToHashSet(OperatingSystem.IsWindows() ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal);
foreach (var directory in Directory.EnumerateDirectories(paths.CvArtifactsRoot).Take(1000))
{
if ((File.GetAttributes(directory) & FileAttributes.ReparsePoint) != 0) continue;
foreach (var file in Directory.EnumerateFiles(directory).Take(1000))
{
if (registered.Contains(Path.GetFullPath(file)) || !System.Text.RegularExpressions.Regex.IsMatch(Path.GetFileName(file), @"^\d{14}-[a-f0-9]{32}\.(pdf|docx)$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
|| File.GetLastWriteTimeUtc(file) > now.AddDays(-7).UtcDateTime || (File.GetAttributes(file) & FileAttributes.ReparsePoint) != 0) continue;
try { File.Delete(file); removed++; }
catch (IOException) { }
catch (UnauthorizedAccessException) { }
}
}
return removed;
}
}
+1 -1
View File
@@ -119,7 +119,7 @@ public sealed class CvProcessingOperationHandler : IAiOperationHandler
{
var completedAtUtc = status == "failed" || status == "cancelled" ? DateTimeOffset.UtcNow : (DateTimeOffset?)null;
return services.GetRequiredService<JobTrackerContext>().CvExtractionRuns
.Where(run => run.Id == runId)
.Where(run => run.Id == runId && run.Status != "expired" && run.Status != "applied")
.ExecuteUpdateAsync(setters => setters
.SetProperty(run => run.Status, status)
.SetProperty(run => run.ErrorMessage, message)
+1 -1
View File
@@ -475,7 +475,7 @@ public sealed class UserOperationStore(JobTrackerContext db, TimeProvider timePr
: (DateTimeOffset?)null;
return db.CvExtractionRuns.IgnoreQueryFilters()
.Where(run => run.Id == runId && run.OwnerUserId == operation.OwnerUserId)
.Where(run => run.Id == runId && run.OwnerUserId == operation.OwnerUserId && run.Status != "expired" && run.Status != "applied")
.ExecuteUpdateAsync(setters => setters
.SetProperty(run => run.Status, runStatus)
.SetProperty(run => run.ErrorMessage, message)