From 399251c024ce04f9e7bb2382c862649fdf073800 Mon Sep 17 00:00:00 2001 From: erlend oksvoll Date: Wed, 21 Aug 2024 11:37:22 +0200 Subject: [PATCH] added referensaId param, improved logging --- src/Altinn.Dan.Plugin.Banking/Metadata.cs | 6 +++ .../Models/BankResponse.cs | 3 +- src/Altinn.Dan.Plugin.Banking/Plugin.cs | 5 +- .../Services/BankService.cs | 51 ++++++++++++++----- .../Services/Interfaces/IBankService.cs | 2 +- 5 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/Altinn.Dan.Plugin.Banking/Metadata.cs b/src/Altinn.Dan.Plugin.Banking/Metadata.cs index c1f6d36..778f83d 100644 --- a/src/Altinn.Dan.Plugin.Banking/Metadata.cs +++ b/src/Altinn.Dan.Plugin.Banking/Metadata.cs @@ -58,6 +58,12 @@ public List GetEvidenceCodes() EvidenceParamName = "SkipKAR", ParamType = EvidenceParamType.Boolean, Required = false + }, + new EvidenceParameter() + { + EvidenceParamName = "ReferanseId", + ParamType = EvidenceParamType.String, + Required = true } }, AuthorizationRequirements = new List() diff --git a/src/Altinn.Dan.Plugin.Banking/Models/BankResponse.cs b/src/Altinn.Dan.Plugin.Banking/Models/BankResponse.cs index a61c61c..f8036d7 100644 --- a/src/Altinn.Dan.Plugin.Banking/Models/BankResponse.cs +++ b/src/Altinn.Dan.Plugin.Banking/Models/BankResponse.cs @@ -15,7 +15,8 @@ public class BankInfo public string BankName { get; set; } public bool IsImplemented { get; set; } = true; public List Accounts { get; set; } - //public Exception Exception { get; set; } = null; + + public bool HasErrors { get; set; } = false; } public class Account diff --git a/src/Altinn.Dan.Plugin.Banking/Plugin.cs b/src/Altinn.Dan.Plugin.Banking/Plugin.cs index 85eca57..de3c607 100644 --- a/src/Altinn.Dan.Plugin.Banking/Plugin.cs +++ b/src/Altinn.Dan.Plugin.Banking/Plugin.cs @@ -182,6 +182,9 @@ private async Task> GetEvidenceValuesBankTransaksjoner(Evide bool skipKAR = evidenceHarvesterRequest.TryGetParameter("SkipKAR", out bool paramSkipKAR) ? paramSkipKAR : false; + //accountinforequestid must be provided in parameter in order to maintain the correct use across requests from different users of digitalt dødsbo + accountInfoRequestId = evidenceHarvesterRequest.TryGetParameter("ReferanseId", out string accountInfoRequestIdFromParam) ? new Guid(accountInfoRequestIdFromParam) : accountInfoRequestId; + KARResponse karResponse; try { @@ -205,7 +208,7 @@ private async Task> GetEvidenceValuesBankTransaksjoner(Evide var ecb = new EvidenceBuilder(new Metadata(), "Banktransaksjoner"); - BankResponse bankResult = karResponse.Banks.Count > 0 ? await _bankService.GetTransactions(ssn, filteredEndpoints, fromDate, toDate, accountInfoRequestId, correlationId) : new() { BankAccounts = new()}; + BankResponse bankResult = karResponse.Banks.Count > 0 ? await _bankService.GetTransactions(ssn, filteredEndpoints, fromDate, toDate, accountInfoRequestId) : new() { BankAccounts = new()}; ecb.AddEvidenceValue("default", JsonConvert.SerializeObject(bankResult), "", false); return ecb.GetEvidenceValues(); diff --git a/src/Altinn.Dan.Plugin.Banking/Services/BankService.cs b/src/Altinn.Dan.Plugin.Banking/Services/BankService.cs index 689953f..238e998 100644 --- a/src/Altinn.Dan.Plugin.Banking/Services/BankService.cs +++ b/src/Altinn.Dan.Plugin.Banking/Services/BankService.cs @@ -4,11 +4,13 @@ using Altinn.Dan.Plugin.Banking.Services.Interfaces; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using StackExchange.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; +using System.Runtime.Intrinsics.X86; using System.Threading; using System.Threading.Tasks; using AccountDto = Altinn.Dan.Plugin.Banking.Models.Account; @@ -37,9 +39,12 @@ public BankService(ILoggerFactory loggerFactory, IMaskinportenService maskinport _settings = applicationSettings.Value; } - public async Task GetTransactions(string ssn, List bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId) + public async Task GetTransactions(string ssn, List bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId) { Configure(bankList); + var correlationId1 = Guid.NewGuid(); + var correlationId2 = Guid.NewGuid(); + var correlationId3 = Guid.NewGuid(); BankResponse bankResponse = new BankResponse { BankAccounts = new List() }; var bankTasks = new List>(); @@ -55,16 +60,16 @@ public async Task GetTransactions(string ssn, List - _logger.LogInformation($"Preparing request to bank {bank.Name} with url {bank.Url} and version {bank.Version} and accountinforequestid {accountInfoRequestId} and correlationid {correlationId}") + _logger.LogInformation($"Preparing request to bank {bank.Name} with url {bank.Url} and version {bank.Version} and accountinforequestid {accountInfoRequestId}") ); - bankInfo = await InvokeBank(ssn, orgnr, fromDate, toDate, accountInfoRequestId, correlationId); + bankInfo = await InvokeBank(ssn, orgnr, fromDate, toDate, accountInfoRequestId, correlationId1, correlationId2, correlationId3); } catch (Exception e) { - bankInfo = new BankInfo { Accounts = new List() }; + bankInfo = new BankInfo { Accounts = new List(), HasErrors = true}; _logger.LogError( - "Banktransaksjoner failed while processing bank {Bank} ({OrgNo}) for {Subject}, error {Error} (accountInfoRequestId: {AccountInfoRequestId}, correlationID: {CorrelationId})", - name, orgnr, ssn[..6], e.Message, accountInfoRequestId, correlationId); + "Banktransaksjoner failed while processing bank {Bank} ({OrgNo}) for {Subject}, error {Error}, accountInfoRequestId: {AccountInfoRequestId}, correlationId1: {correlationId1}, correlationId2: {correlationId2}, correlationId3: {correlationId3} )", + name, orgnr, ssn[..6], e.Message, accountInfoRequestId, correlationId1, correlationId2, correlationId3); } bankInfo.BankName = name; @@ -91,7 +96,7 @@ public async Task GetTransactions(string ssn, List InvokeBank(string ssn, string orgnr, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId) + private async Task InvokeBank(string ssn, string orgnr, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId1, Guid correlationId2, Guid correlationId3) { if (!_bankConfigs.ContainsKey(orgnr)) return new BankInfo { Accounts = new List(), IsImplemented = false }; @@ -108,30 +113,46 @@ private async Task InvokeBank(string ssn, string orgnr, DateTimeOffset }; var accountListTimeout = new CancellationTokenSource(TimeSpan.FromSeconds(AccountListRequestTimeoutSecs)); - var accounts = await bankClient.ListAccountsAsync(accountInfoRequestId, correlationId, "OED", ssn, true, null, null, null, fromDate, toDate); + var accounts = await bankClient.ListAccountsAsync(accountInfoRequestId, correlationId1, "OED", ssn, true, null, null, null, fromDate, toDate); - _logger.LogInformation("Found {0} accounts for {1} in bank {2}", accounts.Accounts1.Count, ssn.Substring(0,6), orgnr); - return await GetAccountDetailsV2(bankClient, accounts, accountInfoRequestId, correlationId, fromDate, toDate); //application/jose + _logger.LogInformation("Found {0} accounts for {1} in bank {2} with accountinforequestid{3} and correlationid {4}", accounts.Accounts1.Count, ssn.Substring(0,6), orgnr, accountInfoRequestId, correlationId1); + return await GetAccountDetailsV2(bankClient, accounts, accountInfoRequestId, fromDate, toDate); //application/jose } - private async Task GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank_v2.Accounts accounts, Guid accountInfoRequestId, Guid correlationId, DateTimeOffset? fromDate, DateTimeOffset? toDate) + private async Task GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank_v2.Accounts accounts, Guid accountInfoRequestId, DateTimeOffset? fromDate, DateTimeOffset? toDate) { + BankInfo bankInfo = new BankInfo() { Accounts = new List() }; var accountDetailsTasks = new List>(); foreach (Bank_v2.Account account in accounts.Accounts1) { + Guid correlationIdDetails = Guid.NewGuid(); + Guid correlationIdTransactions = Guid.NewGuid(); + accountDetailsTasks.Add(Task.Run(async () => { // Start fetching transactions concurrently var transactionsTimeout = new CancellationTokenSource(TimeSpan.FromSeconds(TransactionRequestTimeoutSecs)); + + _logger.LogInformation("Getting transactions: bank {0} account {1} dob {2} accountinforequestid {3} correlationid {4}", + account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner.Identifier.Value.Substring(0,6), accountInfoRequestId, correlationIdTransactions); + var transactionsTask = bankClient.ListTransactionsAsync(account.AccountReference, accountInfoRequestId, - correlationId, "OED", null, null, null, fromDate, toDate, transactionsTimeout.Token); + correlationIdTransactions, "OED", null, null, null, fromDate, toDate, transactionsTimeout.Token); + + + _logger.LogInformation("Getting account details: bank {0} account {1} dob {2} accountinforequestid {4} correlationid {5}", + account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner.Identifier.Value.Substring(0, 6), accountInfoRequestId, correlationIdDetails); + var detailsTimeout = new CancellationTokenSource(TimeSpan.FromSeconds(AccountDetailsRequestTimeoutSecs)); var details = await bankClient.ShowAccountByIdAsync(account.AccountReference, accountInfoRequestId, - correlationId, "OED", null, null, null, fromDate , toDate, detailsTimeout.Token); + correlationIdDetails, "OED", null, null, null, fromDate , toDate, detailsTimeout.Token); + + _logger.LogInformation("Retrieved account details: bank {0} account {1} dob {2} details {3} accountinforequestid {4} correlationid {5}", + account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner.Identifier.Value.Substring(0, 6), details.ResponseDetails.Status, accountInfoRequestId, correlationIdDetails); if (details.Account == null) { @@ -156,6 +177,10 @@ private async Task GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank await transactionsTask; + _logger.LogInformation("Retrieved transactions: bank {0} account {1} dob {2} transaction count {3} accountinforequestid {4} correlationid {5}", + account.Servicer.Name, account.AccountIdentifier, account.PrimaryOwner.Identifier.Value.Substring(0, 6), transactionsTask.Result.Transactions1.Count, accountInfoRequestId, correlationIdTransactions); + + return MapToInternalV2(details.Account, transactionsTask.Result.Transactions1, availableCredit - availableDebit, bookedCredit - bookedDebit); })); } diff --git a/src/Altinn.Dan.Plugin.Banking/Services/Interfaces/IBankService.cs b/src/Altinn.Dan.Plugin.Banking/Services/Interfaces/IBankService.cs index ff01ecb..9bf23b9 100644 --- a/src/Altinn.Dan.Plugin.Banking/Services/Interfaces/IBankService.cs +++ b/src/Altinn.Dan.Plugin.Banking/Services/Interfaces/IBankService.cs @@ -9,5 +9,5 @@ namespace Altinn.Dan.Plugin.Banking.Services.Interfaces; public interface IBankService { - Task GetTransactions(string ssn, List bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId); + Task GetTransactions(string ssn, List bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId); }