diff --git a/source/backend/api/Services/DocumentQueueService.cs b/source/backend/api/Services/DocumentQueueService.cs index ba041d4db6..b000931231 100644 --- a/source/backend/api/Services/DocumentQueueService.cs +++ b/source/backend/api/Services/DocumentQueueService.cs @@ -217,14 +217,6 @@ public async Task 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) { @@ -234,6 +226,14 @@ public async Task 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) @@ -243,12 +243,6 @@ public async Task 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 { diff --git a/source/backend/scheduler/Startup.cs b/source/backend/scheduler/Startup.cs index 9c4a0d5847..698b516cf3 100644 --- a/source/backend/scheduler/Startup.cs +++ b/source/backend/scheduler/Startup.cs @@ -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(options => @@ -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(nameof(DocumentQueueService.UploadQueuedDocuments), hangfireOptions.Queues.FirstOrDefault() ?? "default", x => x.UploadQueuedDocuments(), Cron.Minutely); RecurringJob.AddOrUpdate(nameof(DocumentQueueService.RetryQueuedDocuments), hangfireOptions.Queues.FirstOrDefault() ?? "default", x => x.RetryQueuedDocuments(), "0 0 * * *"); RecurringJob.AddOrUpdate(nameof(DocumentQueueService.QueryProcessingDocuments), hangfireOptions.Queues.FirstOrDefault() ?? "default", x => x.QueryProcessingDocuments(), Cron.Minutely); diff --git a/source/backend/tests/unit/api/Services/DocumentQueueServiceTest.cs b/source/backend/tests/unit/api/Services/DocumentQueueServiceTest.cs index 0c7d48579c..a6704c8c2a 100644 --- a/source/backend/tests/unit/api/Services/DocumentQueueServiceTest.cs +++ b/source/backend/tests/unit/api/Services/DocumentQueueServiceTest.cs @@ -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 + { + Status = ExternalResponseStatus.Success, + Payload = new DocumentDetailModel + { + } + }, + MetadataExternalResponse = new List>() + }; var documentRepositoryMock = this._helper.GetService>(); var documentQueueRepositoryMock = this._helper.GetService>(); var documentServiceMock = this._helper.GetService>(); + var documentTypeRepositoryMock = this._helper.GetService>(); documentQueueRepositoryMock.Setup(x => x.TryGetById(It.IsAny())).Returns(documentQueue); - documentRepositoryMock.Setup(x => x.TryGetDocumentRelationships(It.IsAny())).Returns(new PimsDocument() { DocumentTypeId = 1, MayanId = 1 }); + documentRepositoryMock.Setup(x => x.TryGetDocumentRelationships(It.IsAny())).Returns(relatedDocument); + documentTypeRepositoryMock.Setup(x => x.GetById(It.IsAny())).Returns(documentType); + documentServiceMock.Setup(x => x.UploadDocumentAsync(It.IsAny(), 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()), Times.Once); - documentRepositoryMock.Verify(x => x.TryGetDocumentRelationships(It.IsAny()), Times.Once); + result.Should().NotBeNull(); + result.DocumentQueueStatusTypeCode.Should().Be(DocumentQueueStatusTypes.PROCESSING.ToString()); + documentQueueRepositoryMock.Verify(x => x.Update(It.IsAny(), It.IsAny()), Times.AtLeastOnce); + documentQueueRepositoryMock.Verify(x => x.CommitTransaction(), Times.AtLeastOnce); + documentServiceMock.Verify(x => x.UploadDocumentAsync(It.IsAny(), true), Times.Once); } [Fact]