public async Task GetStacksForCleanupAsync() { var openStack10DaysOldWithReference = StackData.GenerateStack(id: TestConstants.StackId3, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Open); openStack10DaysOldWithReference.References.Add("test"); await _repository.AddAsync(new List <Stack> { StackData.GenerateStack(id: TestConstants.StackId, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(5), status: StackStatus.Open), StackData.GenerateStack(id: TestConstants.StackId2, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Open), openStack10DaysOldWithReference, StackData.GenerateStack(id: TestConstants.StackId4, utcLastOccurrence: SystemClock.UtcNow.SubtractDays(10), status: StackStatus.Fixed) }, o => o.ImmediateConsistency()); var stacks = await _repository.GetStacksForCleanupAsync(TestConstants.OrganizationId, SystemClock.UtcNow.SubtractDays(8)); Assert.NotNull(stacks); Assert.Equal(1, stacks.Total); Assert.Equal(1, stacks.Documents.Count); Assert.Equal(TestConstants.StackId2, stacks.Documents.Single().Id); stacks = await _repository.GetStacksForCleanupAsync(TestConstants.OrganizationId, SystemClock.UtcNow.SubtractDays(1)); Assert.NotNull(stacks); Assert.Equal(2, stacks.Total); Assert.Equal(2, stacks.Documents.Count); Assert.NotNull(stacks.Documents.SingleOrDefault(s => String.Equals(s.Id, TestConstants.StackId))); Assert.NotNull(stacks.Documents.SingleOrDefault(s => String.Equals(s.Id, TestConstants.StackId2))); }
private async Task EnforceStackRetentionDaysAsync(Organization organization, int retentionDays, JobContext context) { await RenewLockAsync(context).AnyContext(); var cutoff = SystemClock.UtcNow.Date.SubtractDays(retentionDays); var stackResults = await _stackRepository.GetStacksForCleanupAsync(organization.Id, cutoff).AnyContext(); _logger.RetentionEnforcementStackStart(cutoff, organization.Name, organization.Id, stackResults.Total); while (stackResults.Documents.Count > 0 && !context.CancellationToken.IsCancellationRequested) { try { await RemoveStacksAsync(stackResults.Documents, context).AnyContext(); } catch (Exception ex) { _logger.LogError(ex, "Error removing stacks: {Message}", ex.Message); } if (context.CancellationToken.IsCancellationRequested || !await stackResults.NextPageAsync().AnyContext()) { break; } } _logger.RetentionEnforcementStackComplete(organization.Name, organization.Id, stackResults.Documents.Count); }