diff --git a/queue/src/fiskaltrust.Middleware.Localization.QueueDE/SignProcessorDE.cs b/queue/src/fiskaltrust.Middleware.Localization.QueueDE/SignProcessorDE.cs index 42aed8779..9ea81ac1a 100644 --- a/queue/src/fiskaltrust.Middleware.Localization.QueueDE/SignProcessorDE.cs +++ b/queue/src/fiskaltrust.Middleware.Localization.QueueDE/SignProcessorDE.cs @@ -22,26 +22,31 @@ public class SignProcessorDE : IMarketSpecificSignProcessor private readonly ITransactionPayloadFactory _transactionPayloadFactory; private readonly IDESSCDProvider _deSSCDProvider; private readonly IRequestCommandFactory _requestCommandFactory; + private readonly ILogger _logger; - public SignProcessorDE( + public SignProcessorDE( IConfigurationRepository configurationRepository, IDESSCDProvider dESSCDProvider, ITransactionPayloadFactory transactionPayloadFactory, - IRequestCommandFactory requestCommandFactory) + IRequestCommandFactory requestCommandFactory, + ILogger logger) { _configurationRepository = configurationRepository; _deSSCDProvider = dESSCDProvider; _transactionPayloadFactory = transactionPayloadFactory; _requestCommandFactory = requestCommandFactory; + _logger = logger; } public async Task<(ReceiptResponse receiptResponse, List actionJournals)> ProcessAsync(ReceiptRequest request, ftQueue queue, ftQueueItem queueItem) { + _logger.LogTrace("SignProcessorDE.ProcessAsync called."); if (string.IsNullOrEmpty(request.cbReceiptReference) && !request.IsFailTransactionReceipt() && !string.IsNullOrEmpty(request.ftReceiptCaseData) && !request.ftReceiptCaseData.Contains("CurrentStartedTransactionNumbers")) { throw new ArgumentException($"CbReceiptReference must be set for one transaction! If you want to close multiple transactions, pass an array value for 'CurrentStartedTransactionNumbers' via ftReceiptCaseData."); } + _logger.LogTrace("SignProcessorDE.ProcessAsync: Getting QueueDE from database."); var queueDE = await _configurationRepository.GetQueueDEAsync(queueItem.ftQueueId).ConfigureAwait(false); if (!queueDE.ftSignaturCreationUnitDEId.HasValue && !queue.IsActive()) @@ -58,6 +63,7 @@ public SignProcessorDE( private async Task PerformReceiptRequest(ReceiptRequest request, ftQueueItem queueItem, ftQueue queue, ftQueueDE queueDE, IDESSCD client) { + _logger.LogTrace("SignProcessorDE.PerformReceiptRequest called."); var (processType, payload) = _transactionPayloadFactory.CreateReceiptPayload(request); RequestCommand command; @@ -70,6 +76,7 @@ private async Task PerformReceiptRequest(ReceiptRequest throw new ArgumentException($"ReceiptCase {request.ftReceiptCase:X} unknown. ProcessType {processType}, ProcessData {payload}"); } + _logger.LogTrace("SignProcessorDE.PerformReceiptRequest: Executing command {CommandName}.", command.ReceiptName); return await command.ExecuteAsync(queue, queueDE, client, request, queueItem); } } diff --git a/queue/src/fiskaltrust.Middleware.Queue.EF/version.json b/queue/src/fiskaltrust.Middleware.Queue.EF/version.json index 2e5d12b15..5b5953ec8 100644 --- a/queue/src/fiskaltrust.Middleware.Queue.EF/version.json +++ b/queue/src/fiskaltrust.Middleware.Queue.EF/version.json @@ -1,5 +1,5 @@ { - "version": "1.3.29", + "version": "1.3.30", "releaseBranches": [ "^refs/heads/main$", "^refs/tags/queue/ef/v\\d+(?:\\.\\d+)*(?:-.*)?$" diff --git a/queue/src/fiskaltrust.Middleware.Queue.InMemory/version.json b/queue/src/fiskaltrust.Middleware.Queue.InMemory/version.json index e1797a626..ac09be12a 100644 --- a/queue/src/fiskaltrust.Middleware.Queue.InMemory/version.json +++ b/queue/src/fiskaltrust.Middleware.Queue.InMemory/version.json @@ -1,5 +1,5 @@ { - "version": "1.3.29", + "version": "1.3.30", "releaseBranches": [ "^refs/heads/main$", "^refs/tags/queue/inmemory/v\\d+(?:\\.\\d+)*(?:-.*)?$" diff --git a/queue/src/fiskaltrust.Middleware.Queue.MySQL/version.json b/queue/src/fiskaltrust.Middleware.Queue.MySQL/version.json index 5d9690bc8..ac22811cb 100644 --- a/queue/src/fiskaltrust.Middleware.Queue.MySQL/version.json +++ b/queue/src/fiskaltrust.Middleware.Queue.MySQL/version.json @@ -1,5 +1,5 @@ { - "version": "1.3.29", + "version": "1.3.30", "releaseBranches": [ "^refs/heads/main$", "^refs/tags/queue/mysql/v\\d+(?:\\.\\d+)*(?:-.*)?$" diff --git a/queue/src/fiskaltrust.Middleware.Queue.PostgreSQL/version.json b/queue/src/fiskaltrust.Middleware.Queue.PostgreSQL/version.json index e9a4a07eb..2bb13d338 100644 --- a/queue/src/fiskaltrust.Middleware.Queue.PostgreSQL/version.json +++ b/queue/src/fiskaltrust.Middleware.Queue.PostgreSQL/version.json @@ -1,5 +1,5 @@ { - "version": "1.3.29-rc1", + "version": "1.3.30-rc1", "releaseBranches": [ "^refs/heads/main$", "^refs/tags/queue/postgresql/v\\d+(?:\\.\\d+)*(?:-.*)?$" diff --git a/queue/src/fiskaltrust.Middleware.Queue.SQLite/version.json b/queue/src/fiskaltrust.Middleware.Queue.SQLite/version.json index ba55a07fe..0abd9b77b 100644 --- a/queue/src/fiskaltrust.Middleware.Queue.SQLite/version.json +++ b/queue/src/fiskaltrust.Middleware.Queue.SQLite/version.json @@ -1,5 +1,5 @@ { - "version": "1.3.29", + "version": "1.3.30", "releaseBranches": [ "^refs/heads/main$", "^refs/tags/queue/sqlite/v\\d+(?:\\.\\d+)*(?:-.*)?$" diff --git a/queue/src/fiskaltrust.Middleware.Queue/Bootstrapper/QueueBootstrapper.cs b/queue/src/fiskaltrust.Middleware.Queue/Bootstrapper/QueueBootstrapper.cs index 37d0c8ce1..deb74006f 100644 --- a/queue/src/fiskaltrust.Middleware.Queue/Bootstrapper/QueueBootstrapper.cs +++ b/queue/src/fiskaltrust.Middleware.Queue/Bootstrapper/QueueBootstrapper.cs @@ -9,6 +9,7 @@ using fiskaltrust.Middleware.QueueSynchronizer; using fiskaltrust.storage.V0; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace fiskaltrust.Middleware.Queue.Bootstrapper @@ -37,7 +38,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(middlewareConfiguration); services.AddScoped(); services.AddScoped(); - services.AddScoped(x => new LocalQueueSynchronizationDecorator(x.GetRequiredService())); + services.AddScoped(x => new LocalQueueSynchronizationDecorator(x.GetRequiredService(), x.GetRequiredService>())); services.AddScoped(); services.AddScoped(); diff --git a/queue/src/fiskaltrust.Middleware.Queue/SignProcessor.cs b/queue/src/fiskaltrust.Middleware.Queue/SignProcessor.cs index ef7dbd96d..824dbb8a8 100644 --- a/queue/src/fiskaltrust.Middleware.Queue/SignProcessor.cs +++ b/queue/src/fiskaltrust.Middleware.Queue/SignProcessor.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Threading.Tasks; using fiskaltrust.ifPOS.v1; @@ -23,8 +22,8 @@ public class SignProcessor : ISignProcessor private readonly IReceiptJournalRepository _receiptJournalRepository; private readonly IActionJournalRepository _actionJournalRepository; private readonly ICryptoHelper _cryptoHelper; - private Guid _queueId = Guid.Empty; - private Guid _cashBoxId = Guid.Empty; + private readonly Guid _queueId = Guid.Empty; + private readonly Guid _cashBoxId = Guid.Empty; private readonly bool _isSandbox; private readonly int _receiptRequestMode = 0; private readonly SignatureFactory _signatureFactory; @@ -55,6 +54,7 @@ public SignProcessor( public async Task ProcessAsync(ReceiptRequest request) { + _logger.LogTrace("SignProcessor.ProcessAsync called."); try { if (request == null) @@ -82,13 +82,14 @@ public async Task ProcessAsync(ReceiptRequest request) private async Task InternalSign(ftQueue queue, ReceiptRequest data) { + _logger.LogTrace("SignProcessor.InternalSign called."); if ((data.ftReceiptCase & 0x0000800000000000L) > 0) { try { var foundQueueItem = await GetExistingQueueItemOrNullAsync(data).ConfigureAwait(false); if (foundQueueItem != null) - { + { var message = $"Queue {_queueId} found cbReceiptReference \"{foundQueueItem.cbReceiptReference}\""; _logger.LogWarning(message); await CreateActionJournalAsync(message, "", foundQueueItem.ftQueueItemId).ConfigureAwait(false); @@ -134,14 +135,18 @@ private async Task InternalSign(ftQueue queue, ReceiptRequest d queueItem.version = ReceiptRequestHelper.GetRequestVersion(data); queueItem.request = JsonConvert.SerializeObject(data); queueItem.requestHash = _cryptoHelper.GenerateBase64Hash(queueItem.request); + _logger.LogTrace("SignProcessor.InternalSign: Adding QueueItem to database."); await _queueItemRepository.InsertOrUpdateAsync(queueItem).ConfigureAwait(false); + _logger.LogTrace("SignProcessor.InternalSign: Updating Queue in database."); await _configurationRepository.InsertOrUpdateQueueAsync(queue).ConfigureAwait(false); var actionjournals = new List(); try { queueItem.ftWorkMoment = DateTime.UtcNow; + _logger.LogTrace("SignProcessor.InternalSign: Calling country specific SignProcessor."); (var receiptResponse, var countrySpecificActionJournals) = await _countrySpecificSignProcessor.ProcessAsync(data, queue, queueItem).ConfigureAwait(false); + _logger.LogTrace("SignProcessor.InternalSign: Country specific SignProcessor finished."); actionjournals.AddRange(countrySpecificActionJournals); @@ -155,9 +160,13 @@ private async Task InternalSign(ftQueue queue, ReceiptRequest d queueItem.ftDoneMoment = DateTime.UtcNow; queue.ftCurrentRow++; + _logger.LogTrace("SignProcessor.InternalSign: Updating QueueItem in database."); await _queueItemRepository.InsertOrUpdateAsync(queueItem).ConfigureAwait(false); + _logger.LogTrace("SignProcessor.InternalSign: Updating Queue in database."); await _configurationRepository.InsertOrUpdateQueueAsync(queue).ConfigureAwait(false); + _logger.LogTrace("SignProcessor.InternalSign: Adding ReceiptJournal to database."); await CreateReceiptJournalAsync(queue, queueItem, data).ConfigureAwait(false); + return receiptResponse; } finally @@ -171,6 +180,7 @@ private async Task InternalSign(ftQueue queue, ReceiptRequest d private async Task GetExistingQueueItemOrNullAsync(ReceiptRequest data) { + _logger.LogTrace("SignProcessor.GetExistingQueueItemOrNullAsync called."); var queueItems = (await _queueItemRepository.GetByReceiptReferenceAsync(data.cbReceiptReference, data.cbTerminalID).ToListAsync().ConfigureAwait(false)) .OrderByDescending(x => x.TimeStamp); diff --git a/queue/src/fiskaltrust.Middleware.QueueSynchronizer/LocalQueueSynchronizationDecorator.cs b/queue/src/fiskaltrust.Middleware.QueueSynchronizer/LocalQueueSynchronizationDecorator.cs index 13d4bcb68..a43a13c4b 100644 --- a/queue/src/fiskaltrust.Middleware.QueueSynchronizer/LocalQueueSynchronizationDecorator.cs +++ b/queue/src/fiskaltrust.Middleware.QueueSynchronizer/LocalQueueSynchronizationDecorator.cs @@ -5,18 +5,21 @@ using System.Threading.Tasks; using fiskaltrust.ifPOS.v1; using fiskaltrust.Middleware.Contracts; +using Microsoft.Extensions.Logging; namespace fiskaltrust.Middleware.QueueSynchronizer { public sealed class LocalQueueSynchronizationDecorator : ISignProcessor, IDisposable { private readonly ISignProcessor _signProcessor; + private readonly ILogger _logger; private readonly BlockingCollection<(Guid identifier, ReceiptRequest request)> _concurrentQueue; private readonly ConcurrentDictionary _stateDictionary; - public LocalQueueSynchronizationDecorator(ISignProcessor signProcessor) + public LocalQueueSynchronizationDecorator(ISignProcessor signProcessor, ILogger logger) { _signProcessor = signProcessor; + _logger = logger; _concurrentQueue = new BlockingCollection<(Guid, ReceiptRequest)>(new ConcurrentQueue<(Guid, ReceiptRequest)>()); _stateDictionary = new ConcurrentDictionary(); @@ -25,18 +28,21 @@ public LocalQueueSynchronizationDecorator(ISignProcessor signProcessor) public async Task ProcessAsync(ReceiptRequest receiptRequest) { + _logger.LogTrace("LocalQueueSynchronizationDecorator.ProcessAsync called."); var identifier = Guid.NewGuid(); var syncResult = new SynchronizedResult(); _stateDictionary.TryAdd(identifier, syncResult); _concurrentQueue.Add((identifier, receiptRequest)); + _logger.LogTrace("LocalQueueSynchronizationDecorator.ProcessAsync: Waiting until result is available."); syncResult.AutoResetEvent.WaitOne(); if (!_stateDictionary.TryRemove(identifier, out var synchronizedResult)) { throw new KeyNotFoundException(identifier.ToString()); } - if(synchronizedResult.ExceptionDispatchInfo != null) + _logger.LogTrace("LocalQueueSynchronizationDecorator.ProcessAsync: Got receipt result."); + if (synchronizedResult.ExceptionDispatchInfo != null) { synchronizedResult.ExceptionDispatchInfo.Throw(); } @@ -48,6 +54,7 @@ private async Task ProcessReceipts() { while (!_concurrentQueue.IsCompleted && _concurrentQueue.TryTake(out var tuple, -1)) { + _logger.LogTrace("LocalQueueSynchronizationDecorator.ProcessReceipts: Processing a new receipt."); try { var response = await _signProcessor.ProcessAsync(tuple.request).ConfigureAwait(false); diff --git a/queue/src/fiskaltrust.Middleware.QueueSynchronizer/fiskaltrust.Middleware.QueueSynchronizer.csproj b/queue/src/fiskaltrust.Middleware.QueueSynchronizer/fiskaltrust.Middleware.QueueSynchronizer.csproj index 5205fe85f..5dd15daad 100644 --- a/queue/src/fiskaltrust.Middleware.QueueSynchronizer/fiskaltrust.Middleware.QueueSynchronizer.csproj +++ b/queue/src/fiskaltrust.Middleware.QueueSynchronizer/fiskaltrust.Middleware.QueueSynchronizer.csproj @@ -1,15 +1,19 @@ - - net461;netstandard2.0;netstandard2.1;net6 - + + net461;netstandard2.0;netstandard2.1;net6 + - - - + + + - - - + + + + + + + diff --git a/queue/test/fiskaltrust.Middleware.Localization.QueueDE.IntegrationTest/SignProcessorDETests/Helpers/RequestCommandFactoryHelper.cs b/queue/test/fiskaltrust.Middleware.Localization.QueueDE.IntegrationTest/SignProcessorDETests/Helpers/RequestCommandFactoryHelper.cs index f83b8ac90..630351166 100644 --- a/queue/test/fiskaltrust.Middleware.Localization.QueueDE.IntegrationTest/SignProcessorDETests/Helpers/RequestCommandFactoryHelper.cs +++ b/queue/test/fiskaltrust.Middleware.Localization.QueueDE.IntegrationTest/SignProcessorDETests/Helpers/RequestCommandFactoryHelper.cs @@ -70,7 +70,8 @@ public static SignProcessorDE ConstructSignProcessor( configurationRepository, dESSCDProvider, transactionPayloadFactory, - new RequestCommandFactory(services.BuildServiceProvider()) + new RequestCommandFactory(services.BuildServiceProvider()), + logger ); return signProcessor; diff --git a/queue/test/fiskaltrust.Middleware.Queue.AcceptanceTest/QueueBootstrapperUnitTests.cs b/queue/test/fiskaltrust.Middleware.Queue.AcceptanceTest/QueueBootstrapperUnitTests.cs index 02b5dc044..8939759fb 100644 --- a/queue/test/fiskaltrust.Middleware.Queue.AcceptanceTest/QueueBootstrapperUnitTests.cs +++ b/queue/test/fiskaltrust.Middleware.Queue.AcceptanceTest/QueueBootstrapperUnitTests.cs @@ -9,6 +9,7 @@ using fiskaltrust.storage.V0; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Xunit; @@ -57,7 +58,7 @@ public void QueueBootstrapper_AddQueueServices_ShouldReturnServiceCollection() var signProcessorConfiguration = ServiceDescriptor.Singleton(typeof(MiddlewareConfiguration), implementationInstance: signProcessorConfig); var cryptoHelper = new ServiceDescriptor(typeof(ICryptoHelper), typeof(CryptoHelper), ServiceLifetime.Scoped); - var signProcessorDecorator = new ServiceDescriptor(typeof(ISignProcessor), x => new LocalQueueSynchronizationDecorator(x.GetRequiredService()), ServiceLifetime.Scoped); + var signProcessorDecorator = new ServiceDescriptor(typeof(ISignProcessor), x => new LocalQueueSynchronizationDecorator(x.GetRequiredService(), x.GetRequiredService>()), ServiceLifetime.Scoped); var signProcessor = new ServiceDescriptor(typeof(SignProcessor), typeof(SignProcessor), ServiceLifetime.Scoped); var journalProcessor = new ServiceDescriptor(typeof(IJournalProcessor), typeof(JournalProcessor), ServiceLifetime.Scoped); var iPos = new ServiceDescriptor(typeof(IPOS), typeof(Queue), ServiceLifetime.Scoped); diff --git a/queue/test/fiskaltrust.Middleware.QueueSynchronizer.AcceptanceTest/LocalQueueSynchronizerTests.cs b/queue/test/fiskaltrust.Middleware.QueueSynchronizer.AcceptanceTest/LocalQueueSynchronizerTests.cs index 741005b28..750026697 100644 --- a/queue/test/fiskaltrust.Middleware.QueueSynchronizer.AcceptanceTest/LocalQueueSynchronizerTests.cs +++ b/queue/test/fiskaltrust.Middleware.QueueSynchronizer.AcceptanceTest/LocalQueueSynchronizerTests.cs @@ -1,10 +1,12 @@ using fiskaltrust.Middleware.Contracts; +using Microsoft.Extensions.Logging; +using Moq; namespace fiskaltrust.Middleware.QueueSynchronizer.AcceptanceTest { public class LocalQueueSynchronizerTests : AbstractQueueSynchronizerTests { public override ISignProcessor CreateDecorator(ISignProcessor signProcessor) => - new LocalQueueSynchronizationDecorator(signProcessor); + new LocalQueueSynchronizationDecorator(signProcessor, Mock.Of>()); } } diff --git a/queue/version.json b/queue/version.json index ba1fe6b39..95b5ccf62 100644 --- a/queue/version.json +++ b/queue/version.json @@ -1,5 +1,5 @@ { - "version": "1.3.29", + "version": "1.3.30", "releaseBranches": [ "^refs/tags/queue/.*", "^refs/heads/main$"