Skip to content

Commit c43c2ac

Browse files
Merge pull request #69 from TransactionProcessing/task/#66_addlogging
More changes for logging and error handling
2 parents e98925e + 3389869 commit c43c2ac

File tree

12 files changed

+173
-114
lines changed

12 files changed

+173
-114
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
namespace TransactionProcessing.SchedulerService.Jobs;
2+
3+
using System;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using DataGeneration;
7+
using EstateManagement.Client;
8+
using SecurityService.Client;
9+
using SecurityService.DataTransferObjects.Responses;
10+
using Shared.Logger;
11+
using TransactionProcessor.Client;
12+
13+
public abstract class BaseJob{
14+
public String JobName { get; set; }
15+
16+
protected ITransactionDataGenerator CreateTransactionDataGenerator(String clientId, String clientSecret, RunningMode runningMode){
17+
ISecurityServiceClient securityServiceClient = Bootstrapper.GetService<ISecurityServiceClient>();
18+
IEstateClient estateClient = Bootstrapper.GetService<IEstateClient>();
19+
ITransactionProcessorClient transactionProcessorClient = Bootstrapper.GetService<ITransactionProcessorClient>();
20+
Func<String, String> baseAddressFunc = Bootstrapper.GetService<Func<String, String>>();
21+
22+
ITransactionDataGenerator g = new TransactionDataGenerator(securityServiceClient,
23+
estateClient,
24+
transactionProcessorClient,
25+
baseAddressFunc("EstateManagementApi"),
26+
baseAddressFunc("FileProcessorApi"),
27+
baseAddressFunc("TestHostApi"),
28+
clientId,
29+
clientSecret,
30+
runningMode);
31+
return g;
32+
}
33+
34+
protected async Task<String> GetToken(String clientId, String clientSecret, CancellationToken cancellationToken)
35+
{
36+
ISecurityServiceClient securityServiceClient = Bootstrapper.GetService<ISecurityServiceClient>();
37+
TokenResponse token = await securityServiceClient.GetToken(clientId, clientSecret, cancellationToken);
38+
39+
return token.AccessToken;
40+
}
41+
42+
protected void TraceGenerated(TraceEventArgs traceArguments)
43+
{
44+
if (traceArguments.TraceLevel == TraceEventArgs.Level.Error){
45+
Logger.LogError(new Exception(traceArguments.Message));
46+
}
47+
else if (traceArguments.TraceLevel == TraceEventArgs.Level.Warning){
48+
Logger.LogWarning(traceArguments.Message);
49+
}
50+
else{
51+
Logger.LogInformation(traceArguments.Message);
52+
}
53+
}
54+
}
Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
namespace TransactionProcessing.SchedulerService.Jobs;
22

33
using System;
4+
using System.Diagnostics.Eventing.Reader;
45
using System.Net.Http;
5-
using System.Threading.Tasks;
6-
using System.Threading;
7-
using DataGeneration;
86
using EstateManagement.Client;
97
using EstateManagement.DataTransferObjects.Responses;
108
using MessagingService.Client;
119
using Microsoft.Extensions.DependencyInjection;
1210
using Quartz;
1311
using SecurityService.Client;
14-
using SecurityService.DataTransferObjects.Responses;
1512
using TransactionProcessor.Client;
1613

1714
public static class Bootstrapper{
@@ -50,32 +47,4 @@ public static T GetService<T>()
5047
{
5148
return Bootstrapper.ServiceProvider.GetService<T>();
5249
}
53-
}
54-
55-
public class BaseJob{
56-
protected ITransactionDataGenerator CreateTransactionDataGenerator(String clientId, String clientSecret, RunningMode runningMode){
57-
ISecurityServiceClient securityServiceClient = Bootstrapper.GetService<ISecurityServiceClient>();
58-
IEstateClient estateClient = Bootstrapper.GetService<IEstateClient>();
59-
TransactionProcessorClient transactionProcessorClient = Bootstrapper.GetService<TransactionProcessorClient>();
60-
Func<String, String> baseAddressFunc = Bootstrapper.GetService<Func<String, String>>();
61-
62-
ITransactionDataGenerator g = new TransactionDataGenerator(securityServiceClient,
63-
estateClient,
64-
transactionProcessorClient,
65-
baseAddressFunc("EstateManagementApi"),
66-
baseAddressFunc("FileProcessorApi"),
67-
baseAddressFunc("TestHostApi"),
68-
clientId,
69-
clientSecret,
70-
runningMode);
71-
return g;
72-
}
73-
74-
protected async Task<String> GetToken(String clientId, String clientSecret, CancellationToken cancellationToken)
75-
{
76-
ISecurityServiceClient securityServiceClient = Bootstrapper.GetService<ISecurityServiceClient>();
77-
TokenResponse token = await securityServiceClient.GetToken(clientId, clientSecret, cancellationToken);
78-
79-
return token.AccessToken;
80-
}
8150
}

TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateFileUploadsJob.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using DataGeneration;
77
using EstateManagement.DataTransferObjects.Responses;
88
using Quartz;
9-
using Quartz.Logging;
9+
using Shared.Logger;
1010

1111
[DisallowConcurrentExecution]
1212
public class GenerateFileUploadsJob : BaseJob, IJob
@@ -21,13 +21,15 @@ public async Task Execute(IJobExecutionContext context)
2121
Guid estateId = context.MergedJobDataMap.GetGuidValueFromString("EstateId");
2222
Guid merchantId = context.MergedJobDataMap.GetGuidValueFromString("MerchantId");
2323

24-
ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live);
24+
Logger.LogInformation($"Running Job {context.JobDetail.Description}");
25+
Logger.LogInformation($"Client Id: [{clientId}]");
26+
Logger.LogInformation($"Estate Id: [{estateId}]");
27+
Logger.LogInformation($"Merchant Id: [{merchantId}]");
2528

29+
ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live);
30+
t.TraceGenerated += TraceGenerated;
2631
await Jobs.GenerateFileUploads(t, estateId, merchantId, context.CancellationToken);
2732
}
28-
29-
30-
3133
#endregion
3234
}
3335
}

TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateMerchantStatementJob.cs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Threading.Tasks;
55
using DataGeneration;
66
using Quartz;
7+
using Shared.Logger;
78

89
public class GenerateMerchantStatementJob : BaseJob, IJob
910
{
@@ -14,23 +15,12 @@ public async Task Execute(IJobExecutionContext context)
1415
String clientSecret = context.MergedJobDataMap.GetString("ClientSecret");
1516
Guid estateId = context.MergedJobDataMap.GetGuidValueFromString("EstateId");
1617

18+
Logger.LogInformation($"Running Job {context.JobDetail.Description}");
19+
Logger.LogInformation($"Client Id: [{clientId}]");
20+
Logger.LogInformation($"Estate Id: [{estateId}]");
21+
1722
ITransactionDataGenerator t = this.CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live);
18-
23+
t.TraceGenerated += TraceGenerated;
1924
await Jobs.GenerateMerchantStatements(t, estateId, context.CancellationToken);
2025
}
21-
}
22-
23-
public class SupportReportJob : BaseJob, IJob
24-
{
25-
public async Task Execute(IJobExecutionContext context)
26-
{
27-
Bootstrapper.ConfigureServices(context);
28-
29-
String eventStoreAddress = context.MergedJobDataMap.GetString("EventStoreAddress");
30-
String databaseConnectionString = context.MergedJobDataMap.GetString("DatabaseConnectionString");
31-
32-
// Events in Parked Queues
33-
// Incomplete Files
34-
}
35-
3626
}

TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/GenerateTransactionsJob.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,25 @@ public class GenerateTransactionsJob : BaseJob, IJob{
2828
#region Methods
2929

3030
public async Task Execute(IJobExecutionContext context){
31-
Bootstrapper.ConfigureServices(context);
31+
this.JobName = context.JobDetail.Description;
32+
Bootstrapper.ConfigureServices(context);
3233

33-
String clientId = context.MergedJobDataMap.GetString("ClientId");
34-
String clientSecret = context.MergedJobDataMap.GetString("ClientSecret");
35-
Guid estateId = context.MergedJobDataMap.GetGuidValueFromString("EstateId");
36-
Guid merchantId = context.MergedJobDataMap.GetGuidValueFromString("MerchantId");
37-
Boolean requireLogon = context.MergedJobDataMap.GetBooleanValueFromString("requireLogon");
34+
String clientId = context.MergedJobDataMap.GetString("ClientId");
35+
String clientSecret = context.MergedJobDataMap.GetString("ClientSecret");
36+
Guid estateId = context.MergedJobDataMap.GetGuidValueFromString("EstateId");
37+
Guid merchantId = context.MergedJobDataMap.GetGuidValueFromString("MerchantId");
38+
Boolean requireLogon = context.MergedJobDataMap.GetBooleanValueFromString("requireLogon");
39+
40+
Logger.LogInformation($"Running Job {context.JobDetail.Description}");
41+
Logger.LogInformation($"Client Id: [{clientId}]");
42+
Logger.LogInformation($"Estate Id: [{estateId}]");
43+
Logger.LogInformation($"Merchant Id: [{merchantId}]");
44+
Logger.LogInformation($"Require Logon: [{requireLogon}]");
3845

39-
Logger.LogInformation($"Running Job {context.JobDetail.Description}");
40-
Logger.LogInformation($"Client Id: [{clientId}]");
41-
Logger.LogInformation($"Client Secret: [{clientSecret}]");
42-
Logger.LogInformation($"Estate Id: [{estateId}]");
43-
Logger.LogInformation($"Merchant Id: [{merchantId}]");
44-
Logger.LogInformation($"Require Logon: [{requireLogon}]");
45-
46-
ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live);
47-
48-
await Jobs.GenerateTransactions(t, estateId, merchantId, requireLogon, context.CancellationToken);
49-
}
46+
ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live);
47+
t.TraceGenerated += TraceGenerated;
48+
await Jobs.GenerateTransactions(t, estateId, merchantId, requireLogon, context.CancellationToken);
49+
}
5050
#endregion
5151
}
5252
}

TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/Jobs.cs

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,68 +14,116 @@
1414
using MessagingService.Client;
1515
using MessagingService.DataTransferObjects;
1616
using Microsoft.Data.SqlClient;
17+
using Microsoft.VisualBasic;
1718
using Newtonsoft.Json;
1819
using Quartz;
1920
using Shared.Logger;
2021

2122
public static class Jobs{
2223
public static async Task GenerateMerchantStatements(ITransactionDataGenerator t, Guid estateId, CancellationToken cancellationToken){
2324
List<MerchantResponse> merchants = await t.GetMerchants(estateId, cancellationToken);
25+
26+
if (merchants.Any() == false){
27+
throw new JobExecutionException($"No merchants returned for Estate [{estateId}]");
28+
}
29+
30+
List<String> results = new List<String>();
2431
foreach (MerchantResponse merchantResponse in merchants)
2532
{
26-
await t.GenerateMerchantStatement(merchantResponse.EstateId, merchantResponse.MerchantId, DateTime.Now, cancellationToken);
33+
Boolean success = await t.GenerateMerchantStatement(merchantResponse.EstateId, merchantResponse.MerchantId, DateTime.Now, cancellationToken);
34+
if (success == false){
35+
results.Add(merchantResponse.MerchantName);
36+
}
37+
}
38+
39+
if (results.Any()){
40+
throw new JobExecutionException($"Error generating statements for merchants [{String.Join(",", results)}]");
2741
}
2842
}
2943

3044
public static async Task GenerateFileUploads(ITransactionDataGenerator t, Guid estateId, Guid merchantId, CancellationToken cancellationToken)
3145
{
3246
MerchantResponse merchant = await t.GetMerchant(estateId, merchantId, cancellationToken);
3347

48+
if (merchant == default)
49+
{
50+
throw new JobExecutionException($"No merchant returned for Estate Id [{estateId}] Merchant Id [{merchantId}]");
51+
}
52+
3453
List<ContractResponse> contracts = await t.GetMerchantContracts(merchant, cancellationToken);
3554
DateTime fileDate = DateTime.Now;
55+
List<String> results = new List<String>();
3656
foreach (ContractResponse contract in contracts)
3757
{
3858
// Generate a file and upload
39-
await t.SendUploadFile(fileDate, contract, merchant, cancellationToken);
59+
Boolean success = await t.SendUploadFile(fileDate, contract, merchant, cancellationToken);
60+
61+
if (success == false)
62+
{
63+
results.Add(contract.OperatorName);
64+
}
65+
}
66+
67+
if (results.Any())
68+
{
69+
throw new JobExecutionException($"Error uploading files for merchant [{merchant.MerchantName}] [{String.Join(",", results)}]");
4070
}
4171
}
4272

4373
public static async Task GenerateTransactions(ITransactionDataGenerator t, Guid estateId, Guid merchantId, Boolean requireLogon, CancellationToken cancellationToken){
44-
MerchantResponse merchant = null;
4574
// get the merchant
46-
try
47-
{
48-
merchant = await t.GetMerchant(estateId, merchantId, cancellationToken);
49-
}
50-
catch(Exception e){
51-
Logger.LogWarning($"Error getting merchant record [{merchantId}]");
52-
throw new JobExecutionException(new Exception($"Error getting merchant record [{merchantId}]"), false);
75+
MerchantResponse merchant = await t.GetMerchant(estateId, merchantId, cancellationToken);
76+
77+
if (merchant == default){
78+
throw new JobExecutionException($"Error getting Merchant Id [{merchantId}] for Estate Id [{estateId}]");
5379
}
5480

5581
DateTime transactionDate = DateTime.Now;
5682

83+
// Get the merchants contracts
84+
List<ContractResponse> contracts = await t.GetMerchantContracts(merchant, cancellationToken);
85+
86+
if (contracts.Any() == false)
87+
{
88+
throw new JobExecutionException($"No contracts returned for Merchant [{merchant.MerchantName}]");
89+
}
90+
5791
if (requireLogon)
5892
{
5993
// Do a logon transaction for the merchant
60-
await t.PerformMerchantLogon(transactionDate, merchant, cancellationToken);
61-
}
94+
Boolean logonSuccess = await t.PerformMerchantLogon(transactionDate, merchant, cancellationToken);
6295

63-
// Get the merchants contracts
64-
List<ContractResponse> contracts = await t.GetMerchantContracts(merchant, cancellationToken);
96+
if (logonSuccess == false)
97+
{
98+
throw new JobExecutionException($"Error performing logon for Merchant [{merchant.MerchantName}]");
99+
}
100+
}
65101

102+
List<String> results = new List<String>();
66103
foreach (ContractResponse contract in contracts)
67104
{
68105
// Generate and send some sales
69-
await t.SendSales(transactionDate, merchant, contract, cancellationToken);
106+
Boolean success = await t.SendSales(transactionDate, merchant, contract, cancellationToken);
70107

71-
// Generate a file and upload
72-
await t.SendUploadFile(transactionDate, contract, merchant, cancellationToken);
108+
if (success == false)
109+
{
110+
results.Add(contract.OperatorName);
111+
}
112+
}
113+
114+
if (results.Any())
115+
{
116+
throw new JobExecutionException($"Error sending sales files for merchant [{merchant.MerchantName}] [{String.Join(",", results)}]");
73117
}
74118
}
75119

76120
public static async Task PerformSettlement(ITransactionDataGenerator t, DateTime dateTime, Guid estateId, CancellationToken cancellationToken)
77121
{
78-
await t.PerformSettlement(dateTime, estateId, cancellationToken);
122+
Boolean success = await t.PerformSettlement(dateTime, estateId, cancellationToken);
123+
124+
if (success == false){
125+
throw new JobExecutionException($"Error performing settlement for Estate Id [{estateId}] and date [{dateTime:dd-MM-yyyy}]");
126+
}
79127
}
80128

81129
public static async Task<List<(String groupName, String streamName, Int64 parkedMessageCount)>> GetParkedQueueInformation(String eventStoreConnectionString, CancellationToken cancellationToken){

TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/ProcessSettlementJob.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace TransactionProcessing.SchedulerService.Jobs
1010
using Quartz;
1111
using SecurityService.Client;
1212
using SecurityService.DataTransferObjects.Responses;
13+
using Shared.Logger;
1314
using TransactionProcessing.DataGeneration;
1415
using TransactionProcessor.Client;
1516

@@ -22,8 +23,12 @@ public async Task Execute(IJobExecutionContext context)
2223
String clientSecret = context.MergedJobDataMap.GetString("ClientSecret");
2324
Guid estateId = context.MergedJobDataMap.GetGuidValueFromString("EstateId");
2425

25-
ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live);
26+
Logger.LogInformation($"Running Job {context.JobDetail.Description}");
27+
Logger.LogInformation($"Client Id: [{clientId}]");
28+
Logger.LogInformation($"Estate Id: [{estateId}]");
2629

30+
ITransactionDataGenerator t = CreateTransactionDataGenerator(clientId, clientSecret, RunningMode.Live);
31+
t.TraceGenerated += TraceGenerated;
2732
await Jobs.PerformSettlement(t, DateTime.Now, estateId, context.CancellationToken);
2833
}
2934
}

TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.Jobs/SupportReportEmailJob.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Threading.Tasks;
66
using MessagingService.Client;
77
using Quartz;
8+
using Shared.Logger;
89

910
public class SupportReportEmailJob : BaseJob, IJob
1011
{
@@ -19,6 +20,10 @@ public async Task Execute(IJobExecutionContext context)
1920
String databaseConnectionString = context.MergedJobDataMap.GetString("DatabaseConnectionString");
2021
String estateIds = context.MergedJobDataMap.GetString("EstateIds");
2122

23+
Logger.LogInformation($"Running Job {context.JobDetail.Description}");
24+
Logger.LogInformation($"Client Id: [{clientId}]");
25+
Logger.LogInformation($"Estate Id: [{estateIds}]");
26+
2227
String token = await this.GetToken(clientId, clientSecret, context.CancellationToken);
2328

2429
IMessagingServiceClient messagingServiceClient = Bootstrapper.GetService<IMessagingServiceClient>();

0 commit comments

Comments
 (0)