Skip to content

Commit

Permalink
added referensaId param, improved logging
Browse files Browse the repository at this point in the history
  • Loading branch information
erlendoksvoll committed Aug 21, 2024
1 parent 2f94af2 commit 399251c
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 16 deletions.
6 changes: 6 additions & 0 deletions src/Altinn.Dan.Plugin.Banking/Metadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,12 @@ public List<EvidenceCode> GetEvidenceCodes()
EvidenceParamName = "SkipKAR",
ParamType = EvidenceParamType.Boolean,
Required = false
},
new EvidenceParameter()
{
EvidenceParamName = "ReferanseId",
ParamType = EvidenceParamType.String,
Required = true
}
},
AuthorizationRequirements = new List<Requirement>()
Expand Down
3 changes: 2 additions & 1 deletion src/Altinn.Dan.Plugin.Banking/Models/BankResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ public class BankInfo
public string BankName { get; set; }
public bool IsImplemented { get; set; } = true;
public List<AccountV2> Accounts { get; set; }
//public Exception Exception { get; set; } = null;

public bool HasErrors { get; set; } = false;
}

public class Account
Expand Down
5 changes: 4 additions & 1 deletion src/Altinn.Dan.Plugin.Banking/Plugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,9 @@ private async Task<List<EvidenceValue>> 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
{
Expand All @@ -205,7 +208,7 @@ private async Task<List<EvidenceValue>> 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();
Expand Down
51 changes: 38 additions & 13 deletions src/Altinn.Dan.Plugin.Banking/Services/BankService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -37,9 +39,12 @@ public BankService(ILoggerFactory loggerFactory, IMaskinportenService maskinport
_settings = applicationSettings.Value;
}

public async Task<BankResponse> GetTransactions(string ssn, List<EndpointExternal> bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId)
public async Task<BankResponse> GetTransactions(string ssn, List<EndpointExternal> 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<BankInfo>() };
var bankTasks = new List<Task<BankInfo>>();
Expand All @@ -55,16 +60,16 @@ public async Task<BankResponse> GetTransactions(string ssn, List<EndpointExterna
try
{
bankList.ForEach(bank =>
_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<AccountDtoV2>() };
bankInfo = new BankInfo { Accounts = new List<AccountDtoV2>(), 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;
Expand All @@ -91,7 +96,7 @@ public async Task<BankResponse> GetTransactions(string ssn, List<EndpointExterna
return bankResponse;
}

private async Task<BankInfo> InvokeBank(string ssn, string orgnr, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId)
private async Task<BankInfo> 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<AccountDtoV2>(), IsImplemented = false };
Expand All @@ -108,30 +113,46 @@ private async Task<BankInfo> 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<BankInfo> GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank_v2.Accounts accounts, Guid accountInfoRequestId, Guid correlationId, DateTimeOffset? fromDate, DateTimeOffset? toDate)
private async Task<BankInfo> GetAccountDetailsV2(Bank_v2.Bank_v2 bankClient,Bank_v2.Accounts accounts, Guid accountInfoRequestId, DateTimeOffset? fromDate, DateTimeOffset? toDate)
{


BankInfo bankInfo = new BankInfo() { Accounts = new List<AccountDtoV2>() };
var accountDetailsTasks = new List<Task<AccountDtoV2>>();
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)
{
Expand All @@ -156,6 +177,10 @@ private async Task<BankInfo> 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);
}));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ namespace Altinn.Dan.Plugin.Banking.Services.Interfaces;

public interface IBankService
{
Task<BankResponse> GetTransactions(string ssn, List<EndpointExternal> bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId, Guid correlationId);
Task<BankResponse> GetTransactions(string ssn, List<EndpointExternal> bankList, DateTimeOffset? fromDate, DateTimeOffset? toDate, Guid accountInfoRequestId);
}

0 comments on commit 399251c

Please sign in to comment.