Skip to content

Commit

Permalink
psp-9893 mayan document queue corrections. (#4611)
Browse files Browse the repository at this point in the history
  • Loading branch information
devinleighsmith authored Jan 24, 2025
1 parent 7246c92 commit a10c014
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 22 deletions.
22 changes: 8 additions & 14 deletions source/backend/api/Services/DocumentQueueService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,14 +217,6 @@ public async Task<PimsDocumentQueue> Upload(PimsDocumentQueue documentQueue)
}
databaseDocumentQueue.DocProcessStartDt = DateTime.UtcNow;

// if the document queued for upload is already in an error state, update the retries.
if (databaseDocumentQueue.DocumentQueueStatusTypeCode == DocumentQueueStatusTypes.PIMS_ERROR.ToString() || databaseDocumentQueue.DocumentQueueStatusTypeCode == DocumentQueueStatusTypes.MAYAN_ERROR.ToString())
{
this.Logger.LogDebug("Document Queue {documentQueueId}, previously errored, retrying", documentQueue.DocumentQueueId);
databaseDocumentQueue.DocProcessRetries += 1;
databaseDocumentQueue.DocProcessEndDt = null;
}

bool isValid = ValidateQueuedDocument(databaseDocumentQueue, documentQueue);
if (!isValid)
{
Expand All @@ -234,6 +226,14 @@ public async Task<PimsDocumentQueue> Upload(PimsDocumentQueue documentQueue)
return databaseDocumentQueue;
}

// if the document queued for upload is already in an error state, update the retries.
if (databaseDocumentQueue.DocumentQueueStatusTypeCode == DocumentQueueStatusTypes.PIMS_ERROR.ToString() || databaseDocumentQueue.DocumentQueueStatusTypeCode == DocumentQueueStatusTypes.MAYAN_ERROR.ToString())
{
this.Logger.LogDebug("Document Queue {documentQueueId}, previously errored, retrying", documentQueue.DocumentQueueId);
databaseDocumentQueue.DocProcessRetries = ++databaseDocumentQueue.DocProcessRetries ?? 1;
databaseDocumentQueue.DocProcessEndDt = null;
}

PimsDocument relatedDocument = null;
relatedDocument = _documentRepository.TryGetDocumentRelationships(databaseDocumentQueue.DocumentId.Value);
if (relatedDocument?.DocumentTypeId == null)
Expand All @@ -243,12 +243,6 @@ public async Task<PimsDocumentQueue> Upload(PimsDocumentQueue documentQueue)
UpdateDocumentQueueStatus(databaseDocumentQueue, DocumentQueueStatusTypes.PIMS_ERROR);
return databaseDocumentQueue;
}
else if (relatedDocument?.MayanId != null && relatedDocument?.MayanId > 0)
{
this.Logger.LogInformation("Queued document {documentQueueId} already has a mayan id {mayanid}, no further processing required.", databaseDocumentQueue.DocumentQueueId, relatedDocument.MayanId);
UpdateDocumentQueueStatus(databaseDocumentQueue, DocumentQueueStatusTypes.SUCCESS);
return databaseDocumentQueue; // The document poll job should pick this up and fix the document queue status.
}

try
{
Expand Down
8 changes: 7 additions & 1 deletion source/backend/scheduler/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,12 @@ public void ConfigureServices(IServiceCollection services)
{
options.UseSimpleAssemblyNameTypeSerializer().UseRecommendedSerializerSettings().UseRedisStorage(redisConnection).UseSerilogLogProvider().UseConsole();
});
services.AddHangfireServer();

BackgroundJobServerOptions hangfireOptions = Hangfire.Extensions.Configuration.ConfigurationExtensions.GetHangfireBackgroundJobServerOptions(this.Configuration);
services.AddHangfireServer(options =>
{
options.Queues = hangfireOptions.Queues;
});
services.AddHangfireConsoleExtensions();

services.Configure<ForwardedHeadersOptions>(options =>
Expand Down Expand Up @@ -344,6 +349,7 @@ private void ScheduleHangfireJobs(IServiceProvider services)
BackgroundJobServerOptions hangfireOptions = Hangfire.Extensions.Configuration.ConfigurationExtensions.GetHangfireBackgroundJobServerOptions(this.Configuration);

// provide default definition of all jobs.

RecurringJob.AddOrUpdate<IDocumentQueueService>(nameof(DocumentQueueService.UploadQueuedDocuments), hangfireOptions.Queues.FirstOrDefault() ?? "default", x => x.UploadQueuedDocuments(), Cron.Minutely);
RecurringJob.AddOrUpdate<IDocumentQueueService>(nameof(DocumentQueueService.RetryQueuedDocuments), hangfireOptions.Queues.FirstOrDefault() ?? "default", x => x.RetryQueuedDocuments(), "0 0 * * *");
RecurringJob.AddOrUpdate<IDocumentQueueService>(nameof(DocumentQueueService.QueryProcessingDocuments), hangfireOptions.Queues.FirstOrDefault() ?? "default", x => x.QueryProcessingDocuments(), Cron.Minutely);
Expand Down
53 changes: 46 additions & 7 deletions source/backend/tests/unit/api/Services/DocumentQueueServiceTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -544,24 +544,63 @@ public async Task Upload_ValidationFails_Retries()
[Fact]
public async Task Upload_RelatedDocument_MayanId()
{
var service = CreateDocumentQueueServiceWithPermissions(Permissions.SystemAdmin);
// Arrange
var documentQueue = new PimsDocumentQueue { DocumentQueueId = 1, DocumentId = 1, Document = new byte[] { 1, 2, 3 } };
var service = CreateDocumentQueueServiceWithPermissions(Permissions.SystemAdmin);
var documentQueue = new PimsDocumentQueue
{
DocumentQueueId = 1,
DocumentId = 1,
DocumentQueueStatusTypeCode = DocumentQueueStatusTypes.PENDING.ToString(),
Document = new byte[] { 1, 2, 3 },
DocProcessRetries = 0,
};

var relatedDocument = new PimsDocument
{
DocumentId = 1,
DocumentTypeId = 1,
FileName = "test.pdf",
DocumentStatusTypeCode = "STATUS",
MayanId = 1
};

var documentType = new PimsDocumentTyp
{
DocumentTypeId = 1,
MayanId = 1
};

var documentUploadResponse = new DocumentUploadResponse
{
DocumentExternalResponse = new ExternalResponse<DocumentDetailModel>
{
Status = ExternalResponseStatus.Success,
Payload = new DocumentDetailModel
{
}
},
MetadataExternalResponse = new List<ExternalResponse<DocumentMetadataModel>>()
};

var documentRepositoryMock = this._helper.GetService<Mock<IDocumentRepository>>();
var documentQueueRepositoryMock = this._helper.GetService<Mock<IDocumentQueueRepository>>();
var documentServiceMock = this._helper.GetService<Mock<IDocumentService>>();
var documentTypeRepositoryMock = this._helper.GetService<Mock<IDocumentTypeRepository>>();

documentQueueRepositoryMock.Setup(x => x.TryGetById(It.IsAny<long>())).Returns(documentQueue);
documentRepositoryMock.Setup(x => x.TryGetDocumentRelationships(It.IsAny<long>())).Returns(new PimsDocument() { DocumentTypeId = 1, MayanId = 1 });
documentRepositoryMock.Setup(x => x.TryGetDocumentRelationships(It.IsAny<long>())).Returns(relatedDocument);
documentTypeRepositoryMock.Setup(x => x.GetById(It.IsAny<long>())).Returns(documentType);
documentServiceMock.Setup(x => x.UploadDocumentAsync(It.IsAny<DocumentUploadRequest>(), true)).ReturnsAsync(documentUploadResponse);

// Act
var result = await service.Upload(documentQueue);
var result = await service.Upload(documentQueue);

// Assert
result.DocumentQueueStatusTypeCode.Should().Be(DocumentQueueStatusTypes.SUCCESS.ToString());
documentQueueRepositoryMock.Verify(x => x.TryGetById(It.IsAny<long>()), Times.Once);
documentRepositoryMock.Verify(x => x.TryGetDocumentRelationships(It.IsAny<long>()), Times.Once);
result.Should().NotBeNull();
result.DocumentQueueStatusTypeCode.Should().Be(DocumentQueueStatusTypes.PROCESSING.ToString());
documentQueueRepositoryMock.Verify(x => x.Update(It.IsAny<PimsDocumentQueue>(), It.IsAny<bool>()), Times.AtLeastOnce);
documentQueueRepositoryMock.Verify(x => x.CommitTransaction(), Times.AtLeastOnce);
documentServiceMock.Verify(x => x.UploadDocumentAsync(It.IsAny<DocumentUploadRequest>(), true), Times.Once);
}

[Fact]
Expand Down

0 comments on commit a10c014

Please sign in to comment.