From effca3b8a97dae95bbac5687eb5c3d17645ae318 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Mon, 24 Oct 2022 10:27:26 +0100 Subject: [PATCH] Updated nuget package for projections --- .../DataGenerator/Program.cs | 11 +- .../TransactionDataGenerator.csproj | 6 +- .../Program.cs | 36 ++- ...ransactionProcessor.SystemSetupTool.csproj | 43 ++- .../appsettings.json | 12 +- .../estateconfig/Merchant.cs | 6 + .../continuous/CallbackHandlerEnricher.js | 85 ------ .../continuous/EstateAggregator.js | 51 ---- ...tateManagementSubscriptionStreamBuilder.js | 68 ----- .../FileProcessorSubscriptionStreamBuilder.js | 72 ----- .../continuous/MerchantAggregator.js | 39 --- .../continuous/MerchantBalanceCalculator.js | 255 ------------------ .../continuous/TransactionEnricher.js | 70 ----- ...ctionProcessorSubscriptionStreamBuilder.js | 67 ----- .../setupconfig.json | 36 ++- 15 files changed, 92 insertions(+), 765 deletions(-) delete mode 100644 TransactionProcessor.SystemSetupTool/projections/continuous/CallbackHandlerEnricher.js delete mode 100644 TransactionProcessor.SystemSetupTool/projections/continuous/EstateAggregator.js delete mode 100644 TransactionProcessor.SystemSetupTool/projections/continuous/EstateManagementSubscriptionStreamBuilder.js delete mode 100644 TransactionProcessor.SystemSetupTool/projections/continuous/FileProcessorSubscriptionStreamBuilder.js delete mode 100644 TransactionProcessor.SystemSetupTool/projections/continuous/MerchantAggregator.js delete mode 100644 TransactionProcessor.SystemSetupTool/projections/continuous/MerchantBalanceCalculator.js delete mode 100644 TransactionProcessor.SystemSetupTool/projections/continuous/TransactionEnricher.js delete mode 100644 TransactionProcessor.SystemSetupTool/projections/continuous/TransactionProcessorSubscriptionStreamBuilder.js diff --git a/TransactionProcessor.DataGenerator/DataGenerator/Program.cs b/TransactionProcessor.DataGenerator/DataGenerator/Program.cs index d99296a..34c11a3 100644 --- a/TransactionProcessor.DataGenerator/DataGenerator/Program.cs +++ b/TransactionProcessor.DataGenerator/DataGenerator/Program.cs @@ -99,7 +99,8 @@ static async Task Main(string[] args) Program.TransactionProcessorClient = new TransactionProcessorClient(baseAddressFunc, httpClient); // Set an estate - Guid estateId = Guid.Parse("435613ac-a468-47a3-ac4f-649d89764c22"); + //Guid estateId = Guid.Parse("435613ac-a468-47a3-ac4f-649d89764c22"); + Guid estateId = Guid.Parse("7c757c2c-4ec9-4d78-ac9b-3a7bfc6d5877"); // Get a token await Program.GetToken(CancellationToken.None); @@ -108,8 +109,8 @@ static async Task Main(string[] args) List merchants = await Program.EstateClient.GetMerchants(Program.TokenResponse.AccessToken, estateId, CancellationToken.None); // Set the date range - DateTime startDate = new DateTime(2022,8,1); //27/7 - DateTime endDate = new DateTime(2022,8,1); // This is the date of te last generated transaction + DateTime startDate = new DateTime(2022,10,1); //27/7 + DateTime endDate = new DateTime(2022,10,22); // This is the date of te last generated transaction List dateRange = Program.GenerateDateRange(startDate, endDate); // Only use merchants that have a device @@ -117,8 +118,8 @@ static async Task Main(string[] args) foreach (DateTime dateTime in dateRange) { - await Program.GenerateTransactions(merchants, dateTime, CancellationToken.None); - //await Program.GenerateFileUploads(merchants, dateTime, CancellationToken.None); + //await Program.GenerateTransactions(merchants, dateTime, CancellationToken.None); + await Program.GenerateFileUploads(merchants, dateTime, CancellationToken.None); } Console.WriteLine($"Process Complete"); diff --git a/TransactionProcessor.DataGenerator/DataGenerator/TransactionDataGenerator.csproj b/TransactionProcessor.DataGenerator/DataGenerator/TransactionDataGenerator.csproj index 26d68cb..3d7ce54 100644 --- a/TransactionProcessor.DataGenerator/DataGenerator/TransactionDataGenerator.csproj +++ b/TransactionProcessor.DataGenerator/DataGenerator/TransactionDataGenerator.csproj @@ -2,14 +2,14 @@ Exe - net5.0 + net6.0 - + - + diff --git a/TransactionProcessor.SystemSetupTool/Program.cs b/TransactionProcessor.SystemSetupTool/Program.cs index bb4d1e2..9be6e6e 100644 --- a/TransactionProcessor.SystemSetupTool/Program.cs +++ b/TransactionProcessor.SystemSetupTool/Program.cs @@ -37,6 +37,8 @@ class Program static async Task Main(string[] args) { + + IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); IConfigurationRoot configurationRoot = builder.Build(); @@ -61,14 +63,14 @@ static async Task Main(string[] args) EventStoreClientSettings settings = EventStoreClientSettings.Create(ConfigurationReader.GetValue("EventStoreAddress")); Program.ProjectionClient = new EventStoreProjectionManagementClient(settings); Program.PersistentSubscriptionsClient = new EventStorePersistentSubscriptionsClient(settings); - - await Program.SetupIdentityServerFromConfig(); - // Setup latest projections - await DeployProjections(); + //await Program.SetupIdentityServerFromConfig(); + + //Setup latest projections + //await DeployProjections(); - // Setup subcriptions - await SetupSubscriptions(); + //Setup subcriptions + //await SetupSubscriptions(); await Program.SetupEstatesFromConfig(); } @@ -83,15 +85,23 @@ private static async Task SetupSubscriptions() EstateConfig estateConfiguration = JsonSerializer.Deserialize(estateJsonData); + foreach (var estate in estateConfiguration.Estates) { - PersistentSubscriptionSettings s = new PersistentSubscriptionSettings(resolveLinkTos:true, maxRetryCount:5); + // Setup the subscrtipions - await PersistentSubscriptionsClient.CreateAsync(estate.Name.Replace(" ", ""), "Reporting", s); - await PersistentSubscriptionsClient.CreateAsync($"FileProcessorSubscriptionStream_{estate.Name.Replace(" ", "")}", "File sProcessor", s); - await PersistentSubscriptionsClient.CreateAsync($"TransactionProcessorSubscriptionStream_{estate.Name.Replace(" ", "")}", "Transaction Processor", s); - await Program.PersistentSubscriptionsClient.CreateAsync($"EstateManagementSubscriptionStream_{estate.Name.Replace(" ", "")}", "Estate Management", s); + await PersistentSubscriptionsClient.CreateAsync(estate.Name.Replace(" ", ""), "Reporting", CreatePersistentSettings()); + await PersistentSubscriptionsClient.CreateAsync($"FileProcessorSubscriptionStream_{estate.Name.Replace(" ", "")}", "File Processor", CreatePersistentSettings(2)); + await Program.PersistentSubscriptionsClient.CreateAsync($"EstateManagementSubscriptionStream_{estate.Name.Replace(" ", "")}", "Estate Management", CreatePersistentSettings()); + await PersistentSubscriptionsClient.CreateAsync($"TransactionProcessorSubscriptionStream_{estate.Name.Replace(" ", "")}", "Transaction Processor", CreatePersistentSettings(1)); } + + await PersistentSubscriptionsClient.CreateAsync($"$et-EstateCreatedEvent", "Transaction Processor - Ordered", CreatePersistentSettings(1)); + await PersistentSubscriptionsClient.CreateAsync($"$ce-MerchantBalanceArchive", "Transaction Processor - Ordered", CreatePersistentSettings()); + } + + private static PersistentSubscriptionSettings CreatePersistentSettings(Int32 retryCount = 0) { + return new PersistentSubscriptionSettings(resolveLinkTos: true, maxRetryCount: retryCount); } private static async Task DeployProjections() @@ -362,7 +372,9 @@ await Program.EstateClient.AddTransactionFeeForProductToContract(Program.TokenRe ContactName = merchant.Contact.ContactName, EmailAddress = merchant.Contact.EmailAddress }, - SettlementSchedule = settlementSchedule + SettlementSchedule = settlementSchedule, + CreatedDateTime = merchant.CreateDate, + MerchantId = merchant.MerchantId, }; var merchantResponse = await Program.EstateClient.CreateMerchant(Program.TokenResponse.AccessToken, estateResponse.EstateId, createMerchantRequest, cancellationToken); diff --git a/TransactionProcessor.SystemSetupTool/TransactionProcessor.SystemSetupTool.csproj b/TransactionProcessor.SystemSetupTool/TransactionProcessor.SystemSetupTool.csproj index a51cd09..669824b 100644 --- a/TransactionProcessor.SystemSetupTool/TransactionProcessor.SystemSetupTool.csproj +++ b/TransactionProcessor.SystemSetupTool/TransactionProcessor.SystemSetupTool.csproj @@ -10,15 +10,16 @@ - + Always - + + @@ -27,37 +28,33 @@ - - Always - - + Always - - + + Always - - + + Always - - + + Always - - + + Always - - + + Always - - + + + + + Always - + Always - - - - diff --git a/TransactionProcessor.SystemSetupTool/appsettings.json b/TransactionProcessor.SystemSetupTool/appsettings.json index e528098..3920db5 100644 --- a/TransactionProcessor.SystemSetupTool/appsettings.json +++ b/TransactionProcessor.SystemSetupTool/appsettings.json @@ -1,13 +1,13 @@ { "AppSettings": { // Local (Docker) - "EstateManagementUri": "http://127.0.0.1:5000", - "SecurityServiceUri": "https://127.0.0.1:5001", - "EventStoreAddress": "esdb://admin:changeit@127.0.0.1:4113?tls=false&tlsVerifyCert=false" + //"EstateManagementUri": "http://127.0.0.1:5000", + //"SecurityServiceUri": "https://127.0.0.1:5001", + //"EventStoreAddress": "esdb://admin:changeit@127.0.0.1:4113?tls=false&tlsVerifyCert=false" // Staging - //"EstateManagementUri": "http://192.168.0.133:5000", - //"SecurityServiceUri": "https://192.168.0.133:5001", - //"EventStoreAddress": "esdb://admin:changeit@192.168.0.133:2113?tls=false&tlsVerifyCert=false" + "EstateManagementUri": "http://192.168.0.133:5000", + "SecurityServiceUri": "https://192.168.0.133:5001", + "EventStoreAddress": "esdb://admin:changeit@192.168.0.133:2113?tls=false&tlsVerifyCert=false" } } diff --git a/TransactionProcessor.SystemSetupTool/estateconfig/Merchant.cs b/TransactionProcessor.SystemSetupTool/estateconfig/Merchant.cs index e858ccf..087da1b 100644 --- a/TransactionProcessor.SystemSetupTool/estateconfig/Merchant.cs +++ b/TransactionProcessor.SystemSetupTool/estateconfig/Merchant.cs @@ -5,6 +5,12 @@ public class Merchant { + [JsonPropertyName("merchant_id")] + public Guid MerchantId { get; set; } + + [JsonPropertyName("createdate")] + public DateTime CreateDate { get; set; } + [JsonPropertyName("name")] public String Name { get; set; } diff --git a/TransactionProcessor.SystemSetupTool/projections/continuous/CallbackHandlerEnricher.js b/TransactionProcessor.SystemSetupTool/projections/continuous/CallbackHandlerEnricher.js deleted file mode 100644 index 30acab3..0000000 --- a/TransactionProcessor.SystemSetupTool/projections/continuous/CallbackHandlerEnricher.js +++ /dev/null @@ -1,85 +0,0 @@ -//starttestsetup -var fromStreams = fromStreams || require('../../node_modules/@transactionprocessing/esprojection-testing-framework').scope.fromStreams; -var emit = emit || require('../../node_modules/@transactionprocessing/esprojection-testing-framework').scope.emit; -//endtestsetup - -fromStreams("$ce-EstateAggregate", "$et-CallbackReceivedEvent") - .when({ - $init: function (s, e) - { - return { - estates: [], - debug: [] - } - }, - "EstateCreatedEvent": function (s, e) { - s.estates.push({ - estateId: e.data.estateId, - estateName: e.data.estateName - }); - }, - "EstateReferenceAllocatedEvent": function (s, e) { - var estateIndex = s.estates.findIndex(element => element.estateId === e.data.estateId); - s.estates[estateIndex].reference = e.data.estateReference; - }, - "CallbackReceivedEvent": function (s, e) { - // find the estate from the reference - if (s.debug === undefined) { - s.debug = []; - } - var ref = e.data.reference.split("-"); // Element 0 is estate reference, Element 1 is merchant reference - var estate = s.estates.find(element => element.reference === ref[0]); - if (estate !== undefined && estate !== null) { - var enrichedEvent = createEnrichedEvent(e, estate); - - // Emit the enriched event - emit(getStreamName(estate, e), "CallbackReceivedEnrichedEvent", enrichedEvent); - } - else { - var enrichedEvent = createEnrichedEvent(e); - // Emit the enriched event - emit(getStreamName(estate, e), "CallbackReceivedEnrichedWithNoEstateEvent", enrichedEvent); - } - } - }); - -function createEnrichedEvent(originalEvent, estate) { - var enrichedEvent = {}; - if (estate !== undefined && estate !== null) { - enrichedEvent = { - typeString: originalEvent.data.typeString, - messageFormat: originalEvent.data.messageFormat, - callbackMessage: originalEvent.data.callbackMessage, - estateId: estate.estateId, - reference: originalEvent.data.reference - }; - } - else { - enrichedEvent = { - typeString: originalEvent.data.typeString, - messageFormat: originalEvent.data.messageFormat, - callbackMessage: originalEvent.data.callbackMessage, - reference: originalEvent.data.reference - }; - } - - return enrichedEvent; -} - -function getStreamName(estate, e) { - var streamName = ""; - if (e.data.destination === "EstateManagement") { - streamName += "EstateManagementSubscriptionStream_"; - } - - // Add the estate name - if (estate !== undefined && estate !== null) { - streamName += estate.estateName.replace(/ /g, ""); - } - else { - streamName += "UnknownEstate"; - } - - return streamName; - -} \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/projections/continuous/EstateAggregator.js b/TransactionProcessor.SystemSetupTool/projections/continuous/EstateAggregator.js deleted file mode 100644 index 3a910e1..0000000 --- a/TransactionProcessor.SystemSetupTool/projections/continuous/EstateAggregator.js +++ /dev/null @@ -1,51 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.linkTo; -//endtestsetup - -isEstateEvent = (e) => { return (e.data && e.data.estateId); } -isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') }; - -isAMerchantFeeAddedToTransactionEvent = (e) => { return compareEventTypeSafely(e.eventType, 'MerchantFeeAddedToTransactionEvent') }; -isAServiceProviderFeeAddedToTransactionEvent = (e) => { return compareEventTypeSafely(e.eventType, 'ServiceProviderFeeAddedToTransactionEvent') }; - -compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); } - -ignoreEvent = (e) => isAServiceProviderFeeAddedToTransactionEvent(e) | isAMerchantFeeAddedToTransactionEvent(e); - -isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined); - -isTruncated = function (metadata) { - if (metadata && metadata['$v']) { - var parts = metadata['$v'].split(":"); - var projectionEpoch = parts[1]; - - return (projectionEpoch < 0); - } - return false; -}; - -getStringWithNoSpaces = function(inputString) { return inputString.replace(/-/gi, "").replace(/ /g, ""); } - -fromAll() - .when({ - $init: function (s, e) { - return { estates: {} } - }, - $any: function (s, e) { - if (isTruncated(e)) return; - - if (isEstateEvent(e)) { - if (ignoreEvent(e)) return; - - if (isAnEstateCreatedEvent(e)) { - s.estates[e.data.estateId] = { - name: getStringWithNoSpaces(e.data.estateName) - }; - } - - linkTo(s.estates[e.data.estateId].name, e); - } - } - } - ); \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/projections/continuous/EstateManagementSubscriptionStreamBuilder.js b/TransactionProcessor.SystemSetupTool/projections/continuous/EstateManagementSubscriptionStreamBuilder.js deleted file mode 100644 index 7b69f57..0000000 --- a/TransactionProcessor.SystemSetupTool/projections/continuous/EstateManagementSubscriptionStreamBuilder.js +++ /dev/null @@ -1,68 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.linkTo; -//endtestsetup - -isEstateEvent = (e) => { return (e.data && e.data.estateId); } -isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') }; -compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); } -isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined); - -getSupportedEventTypes = function () { - var eventTypes = []; - - eventTypes.push('TransactionHasBeenCompletedEvent'); - eventTypes.push('MerchantFeeSettledEvent'); - eventTypes.push('StatementGeneratedEvent'); - - return eventTypes; -} - -isARequiredEvent = (e) => { - var supportedEvents = getSupportedEventTypes(); - - var index = supportedEvents.indexOf(e.eventType); - - return index !== -1; -}; - -isTruncated = function (metadata) { - if (metadata && metadata['$v']) { - var parts = metadata['$v'].split(":"); - var projectionEpoch = parts[1]; - - return (projectionEpoch < 0); - } - return false; -}; - -getStreamName = function (estateName) { - return 'EstateManagementSubscriptionStream_' + estateName; -} - -getStringWithNoSpaces = function (inputString) { return inputString.replace(/-/gi, "").replace(/ /g, ""); } - -fromAll() - .when({ - $init: function (s, e) { - return { estates: {} } - }, - $any: function (s, e) { - if (isTruncated(e)) return; - - if (isEstateEvent(e)) { - - if (isAnEstateCreatedEvent(e)) { - s.estates[e.data.estateId] = { - filteredName: e.data.estateName.replace(/-/gi, ""), - name: getStringWithNoSpaces(e.data.estateName) - }; - } - - if (isARequiredEvent(e) === false) return; - - linkTo(getStreamName(s.estates[e.data.estateId].name), e); - } - } - } - ); \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/projections/continuous/FileProcessorSubscriptionStreamBuilder.js b/TransactionProcessor.SystemSetupTool/projections/continuous/FileProcessorSubscriptionStreamBuilder.js deleted file mode 100644 index 5cc7d29..0000000 --- a/TransactionProcessor.SystemSetupTool/projections/continuous/FileProcessorSubscriptionStreamBuilder.js +++ /dev/null @@ -1,72 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.linkTo; -//endtestsetup - -isEstateEvent = (e) => { return (e.data && e.data.estateId); } -isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') }; -compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); } -isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined); - -getSupportedEventTypes = function () { - var eventTypes = []; - - eventTypes.push('ImportLogCreatedEvent'); - eventTypes.push('FileAddedToImportLogEvent'); - eventTypes.push('FileCreatedEvent'); - eventTypes.push('FileLineAddedEvent'); - eventTypes.push('FileLineProcessingSuccessfulEvent'); - eventTypes.push('FileLineProcessingIgnoredEvent'); - eventTypes.push('FileLineProcessingFailedEvent'); - eventTypes.push('FileProcessingCompletedEvent'); - - return eventTypes; -} - -isARequiredEvent = (e) => { - var supportedEvents = getSupportedEventTypes(); - - var index = supportedEvents.indexOf(e.eventType); - - return index !== -1 -}; - -isTruncated = function (metadata) { - if (metadata && metadata['$v']) { - var parts = metadata['$v'].split(":"); - var projectionEpoch = parts[1]; - - return (projectionEpoch < 0); - } - return false; -}; -getStreamName = function (estateName) { - return 'FileProcessorSubscriptionStream_' + estateName; -} - -getStringWithNoSpaces = function (inputString) { return inputString.replace(/-/gi, "").replace(/ /g, ""); } - -fromAll() - .when({ - $init: function (s, e) { - return { estates: {} } - }, - $any: function (s, e) { - if (isTruncated(e)) return; - - if (isEstateEvent(e)) { - - if (isAnEstateCreatedEvent(e)) { - s.estates[e.data.estateId] = { - filteredName: e.data.estateName.replace(/-/gi, ""), - name: getStringWithNoSpaces(e.data.estateName) - }; - } - - if (isARequiredEvent(e) === false) return; - - linkTo(getStreamName(s.estates[e.data.estateId].name), e); - } - } - } -); \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/projections/continuous/MerchantAggregator.js b/TransactionProcessor.SystemSetupTool/projections/continuous/MerchantAggregator.js deleted file mode 100644 index 8174f30..0000000 --- a/TransactionProcessor.SystemSetupTool/projections/continuous/MerchantAggregator.js +++ /dev/null @@ -1,39 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.linkTo; -//endtestsetup - -isValidEvent = function (e) { - - if (e) { - if (e.data) { - if (e.isJson) { - if (e.eventType !== "$metadata") { - return true; - } - } - } - } - - return false; -}; - -getMerchantId = function (e) { - if (e.data.merchantId === undefined) { - return null; - } - return e.data.merchantId; -}; - -fromAll() - .when({ - $any: function (s, e) { - if (isValidEvent(e)) { - var merchantId = getMerchantId(e); - if (merchantId !== null) { - var streamName = "MerchantArchive-" + merchantId.replace(/-/gi, ""); - linkTo(streamName, e); - } - } - } - }); \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/projections/continuous/MerchantBalanceCalculator.js b/TransactionProcessor.SystemSetupTool/projections/continuous/MerchantBalanceCalculator.js deleted file mode 100644 index 35a14f1..0000000 --- a/TransactionProcessor.SystemSetupTool/projections/continuous/MerchantBalanceCalculator.js +++ /dev/null @@ -1,255 +0,0 @@ -//starttestsetup -var fromCategory = fromCategory || require('../../node_modules/@transactionprocessing/esprojection-testing-framework').scope.fromCategory; -var partitionBy = partitionBy !== null ? partitionBy : require('../../node_modules/@transactionprocessing/esprojection-testing-framework').scope.partitionBy; -var emit = emit || require('../../node_modules/@transactionprocessing/esprojection-testing-framework').scope.emit; -//endtestsetup - -fromCategory('MerchantArchive') - .foreachStream() - .when({ - $init: function () { - return { - initialised: true, - availableBalance: 0, - balance: 0, - lastDepositDateTime: null, - lastSaleDateTime: null, - lastFeeProcessedDateTime: null, - debug: [], - totalDeposits: 0, - totalAuthorisedSales: 0, - totalDeclinedSales: 0, - totalFees: 0, - emittedEvents:1 - } - }, - $any: function (s, e) - { - if (e === null || e.data === null || e.data.IsJson === false) - return; - - eventbus.dispatch(s, e); - } - }); - -var eventbus = { - dispatch: function (s, e) { - - if (e.eventType === 'MerchantCreatedEvent') { - merchantCreatedEventHandler(s, e); - return; - } - - if (e.eventType === 'ManualDepositMadeEvent') { - depositMadeEventHandler(s, e); - return; - } - - if (e.eventType === 'AutomaticDepositMadeEvent') { - depositMadeEventHandler(s, e); - return; - } - - if (e.eventType === 'TransactionHasStartedEvent') { - transactionHasStartedEventHandler(s, e); - return; - } - - if (e.eventType === 'TransactionHasBeenCompletedEvent') { - transactionHasCompletedEventHandler(s, e); - return; - } - - if (e.eventType === 'MerchantFeeAddedToTransactionEvent') { - merchantFeeAddedToTransactionEventHandler(s, e); - return; - } - } -} - -function getStreamName(s) { - return "MerchantBalanceHistory-" + s.merchantId.replace(/-/gi, ""); -} - -function getEventTypeName() { - return 'EstateReporting.BusinessLogic.Events.' + getEventType() + ', EstateReporting.BusinessLogic.Events'; -} - -function getEventType() { return "MerchantBalanceChangedEvent"; } - -function addTwoNumbers(number1, number2) { - return parseFloat((number1 + number2).toFixed(4)); -} - -function subtractTwoNumbers(number1, number2) { - return parseFloat((number1 - number2).toFixed(4)); -} - -var incrementBalanceFromDeposit = function (s, amount, dateTime) { - s.balance = addTwoNumbers(s.balance, amount); - s.availableBalance = addTwoNumbers(s.availableBalance, amount); - s.totalDeposits = addTwoNumbers(s.totalDeposits, amount); - - // protect against events coming in out of order - if (s.lastDepositDateTime === null || dateTime > s.lastDepositDateTime) { - s.lastDepositDateTime = dateTime; - } -}; - -var incrementBalanceFromMerchantFee = function (s, amount, dateTime) { - s.balance = addTwoNumbers(s.balance, amount); - s.availableBalance = addTwoNumbers(s.availableBalance, amount); - s.totalFees = addTwoNumbers(s.totalFees, amount); - - // protect against events coming in out of order - if (s.lastFeeProcessedDateTime === null || dateTime > s.lastFeeProcessedDateTime) { - s.lastFeeProcessedDateTime = dateTime; - } -}; - -var decrementAvailableBalanceFromTransactionStarted = function (s, amount, dateTime) { - s.availableBalance = subtractTwoNumbers(s.availableBalance, amount); - - // protect against events coming in out of order - if (s.lastSaleDateTime === null || dateTime > s.lastSaleDateTime) { - s.lastSaleDateTime = dateTime; - } -}; - -var decrementBalanceFromAuthorisedTransaction = function (s, amount) { - s.balance = subtractTwoNumbers(s.balance, amount); - s.totalAuthorisedSales = addTwoNumbers(s.totalAuthorisedSales, amount); -}; - -var incrementAvailableBalanceFromDeclinedTransaction = function (s, amount) { - s.availableBalance = addTwoNumbers(s.availableBalance, amount); - s.totalDeclinedSales = addTwoNumbers(s.totalDeclinedSales, amount); -}; - -var merchantCreatedEventHandler = function (s, e) { - - // Setup the state here - s.estateId = e.data.estateId; - s.merchantId = e.data.merchantId; - s.merchantName = e.data.merchantName; -}; - -var emitBalanceChangedEvent = function (aggregateId, eventId, s, changeAmount, dateTime, reference) { - - if (s.initialised === true) { - - // Emit an opening balance event - var openingBalanceEvent = { - $type: getEventTypeName(), - "merchantId": s.merchantId, - "estateId": s.estateId, - "balance": 0, - "changeAmount": 0, - "eventId": s.merchantId, - "eventCreatedDateTime": dateTime, - "reference": "Opening Balance", - "aggregateId": s.merchantId - } - emit(getStreamName(s), getEventType(), openingBalanceEvent); - s.emittedEvents++; - s.initialised = false; - } - - var balanceChangedEvent = { - $type: getEventTypeName(), - "merchantId": s.merchantId, - "estateId": s.estateId, - "balance": s.balance, - "changeAmount": changeAmount, - "eventId": eventId, - "eventCreatedDateTime": dateTime, - "reference": reference, - "aggregateId": aggregateId - } - - // emit an balance changed event here - emit(getStreamName(s), getEventType(), balanceChangedEvent); - s.emittedEvents++; - return s; -}; - -var depositMadeEventHandler = function (s, e) { - - // Check if we have got a merchant id already set - if (s.merchantId === undefined) { - // We have obviously not got a created event yet but we must process this event, - // so fill in what we can here - s.estateId = e.data.estateId; - s.merchantId = e.data.merchantId; - } - - incrementBalanceFromDeposit(s, e.data.amount, e.data.depositDateTime); - - // emit an balance changed event here - emitBalanceChangedEvent(e.data.merchantId, e.eventId, s, e.data.amount, e.data.depositDateTime, "Merchant Deposit"); -}; - -var transactionHasStartedEventHandler = function (s, e) { - - // Check if we have got a merchant id already set - if (s.merchantId === undefined) { - // We have obviously not got a created event yet but we must process this event, - // so fill in what we can here - e.estateId = e.data.estateId; - s.merchantId = e.data.merchantId; - } - - var amount = e.data.transactionAmount; - if (amount === undefined) { - amount = 0; - } - decrementAvailableBalanceFromTransactionStarted(s, amount, e.data.transactionDateTime); -}; - -var transactionHasCompletedEventHandler = function (s, e) { - - // Check if we have got a merchant id already set - if (s.merchantId === undefined) { - // We have obviously not got a created event yet but we must process this event, - // so fill in what we can here - e.estateId = e.data.estateId; - s.merchantId = e.data.merchantId; - } - - var amount = e.data.transactionAmount; - if (amount === undefined) { - amount = 0; - } - - var transactionDateTime = new Date(Date.parse(e.data.completedDateTime)); - var completedTime = new Date(transactionDateTime.getFullYear(), transactionDateTime.getMonth(), transactionDateTime.getDate(), transactionDateTime.getHours(), transactionDateTime.getMinutes(), transactionDateTime.getSeconds() + 2); - - if (e.data.isAuthorised) { - decrementBalanceFromAuthorisedTransaction(s, amount, completedTime); - - // emit an balance changed event here - if (amount > 0) { - s = emitBalanceChangedEvent(e.data.transactionId, e.eventId, s, amount * -1, completedTime, "Transaction Completed"); - } - } - else { - incrementAvailableBalanceFromDeclinedTransaction(s, amount, completedTime); - } -}; - -var merchantFeeAddedToTransactionEventHandler = function (s, e) { - - // Check if we have got a merchant id already set - if (s.merchantId === undefined) { - // We have obviously not got a created event yet but we must process this event, - // so fill in what we can here - e.estateId = e.data.estateId; - s.merchantId = e.data.merchantId; - } - - // increment the balance now - incrementBalanceFromMerchantFee(s, e.data.calculatedValue, e.data.feeCalculatedDateTime); - - // emit an balance changed event here - s = emitBalanceChangedEvent(e.data.transactionId, e.eventId, s, e.data.calculatedValue, e.data.feeCalculatedDateTime, "Transaction Fee Processed"); -} \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/projections/continuous/TransactionEnricher.js b/TransactionProcessor.SystemSetupTool/projections/continuous/TransactionEnricher.js deleted file mode 100644 index 271dead..0000000 --- a/TransactionProcessor.SystemSetupTool/projections/continuous/TransactionEnricher.js +++ /dev/null @@ -1,70 +0,0 @@ -//starttestsetup -var fromCategory = fromCategory || require('../../node_modules/@transactionprocessing/esprojection-testing-framework').scope.fromCategory; -var emit = emit || require('../../node_modules/@transactionprocessing/esprojection-testing-framework').scope.emit; -var linkTo = linkTo || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.linkTo; -//endtestsetup - -fromCategory('TransactionAggregate') - .foreachStream() - .when({ - $any: function (s, e) { - - if (e === null || e.data === null || e.data.IsJson === false) - return; - - eventbus.dispatch(s, e); - } - }); - -var eventbus = { - dispatch: function (s, e) { - - if (e.eventType === 'MerchantFeeAddedToTransactionEvent') { - merchantFeeAddedToTransactionEventHandler(s, e); - return; - } - if (e.eventType === 'ServiceProviderFeeAddedToTransactionEvent') { - serviceProviderFeeAddedToTransactionEventHandler(s, e); - return; - } - else { - //Just add the existing event to to our stream - linkTo(getStreamName(s), e); - } - - } -} - -function merchantFeeAddedToTransactionEventHandler(s, e) { - var newEvent = { - calculatedValue: e.data.calculatedValue, - feeCalculatedDateTime: e.data.feeCalculatedDateTime, - estateId: e.data.estateId, - feeId: e.data.feeId, - feeValue: e.data.feeValue, - merchantId: e.data.merchantId, - transactionId: e.data.transactionId, - feeCalculationType: e.data.feeCalculationType, - eventId: e.eventId - } - emit(getStreamName(s), "MerchantFeeAddedToTransactionEnrichedEvent", newEvent, null); -} - -function serviceProviderFeeAddedToTransactionEventHandler(s, e) { - var newEvent = { - calculatedValue: e.data.calculatedValue, - feeCalculatedDateTime: e.data.feeCalculatedDateTime, - estateId: e.data.estateId, - feeId: e.data.feeId, - feeValue: e.data.feeValue, - merchantId: e.data.merchantId, - transactionId: e.data.transactionId, - feeCalculationType: e.data.feeCalculationType, - eventId: e.eventId - } - emit(getStreamName(s), "ServiceProviderFeeAddedToTransactionEnrichedEvent", newEvent, null); -} - -function getStreamName(s) { - return "TransactionEnricherResult"; -} \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/projections/continuous/TransactionProcessorSubscriptionStreamBuilder.js b/TransactionProcessor.SystemSetupTool/projections/continuous/TransactionProcessorSubscriptionStreamBuilder.js deleted file mode 100644 index 3a0b08b..0000000 --- a/TransactionProcessor.SystemSetupTool/projections/continuous/TransactionProcessorSubscriptionStreamBuilder.js +++ /dev/null @@ -1,67 +0,0 @@ -//starttestsetup -var fromAll = fromAll || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.fromAll; -var linkTo = linkTo || require("../../node_modules/@transactionprocessing/esprojection-testing-framework").scope.linkTo; -//endtestsetup - -isEstateEvent = (e) => { return (e.data && e.data.estateId); } -isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') }; -compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); } -isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined); - -getSupportedEventTypes = function () { - var eventTypes = []; - - eventTypes.push('CustomerEmailReceiptRequestedEvent'); - eventTypes.push('TransactionHasBeenCompletedEvent'); - eventTypes.push('MerchantFeeAddedToTransactionEvent'); - - return eventTypes; -} - -isARequiredEvent = (e) => { - var supportedEvents = getSupportedEventTypes(); - - var index = supportedEvents.indexOf(e.eventType); - - return index !== -1; -}; - -isTruncated = function (metadata) { - if (metadata && metadata['$v']) { - var parts = metadata['$v'].split(":"); - var projectionEpoch = parts[1]; - - return (projectionEpoch < 0); - } - return false; -}; -getStreamName = function (estateName) { - return 'TransactionProcessorSubscriptionStream_' + estateName; -} - -getStringWithNoSpaces = function (inputString) { return inputString.replace(/-/gi, "").replace(/ /g, ""); } - -fromAll() - .when({ - $init: function (s, e) { - return { estates: {} } - }, - $any: function (s, e) { - if (isTruncated(e)) return; - - if (isEstateEvent(e)) { - - if (isAnEstateCreatedEvent(e)) { - s.estates[e.data.estateId] = { - filteredName: e.data.estateName.replace(/-/gi, ""), - name: getStringWithNoSpaces(e.data.estateName) - }; - } - - if (isARequiredEvent(e) === false) return; - - linkTo(getStreamName(s.estates[e.data.estateId].name), e); - } - } - } -); \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/setupconfig.json b/TransactionProcessor.SystemSetupTool/setupconfig.json index 9e92eb7..e3463be 100644 --- a/TransactionProcessor.SystemSetupTool/setupconfig.json +++ b/TransactionProcessor.SystemSetupTool/setupconfig.json @@ -13,6 +13,7 @@ }, "merchants": [ { + "merchant_id": "AB1C99FB-1C6C-4694-9A32-B71BE5D1DA33", "name": "Test Merchant 1", "settlementschedule": "Weekly", "address": { @@ -34,9 +35,11 @@ }, "device": { "device_identifier": "testmerchant1device" - } + }, + "createdate": "2022-08-31" }, { + "merchant_id": "AF4D7C7C-9B8D-4E58-A12A-28D3E0B89DF6", "name": "Test Merchant 2", "settlementschedule": "Weekly", "address": { @@ -63,9 +66,11 @@ }, "device": { "device_identifier": "testmerchant2device" - } + }, + "createdate": "2022-08-31" }, { + "merchant_id": "0D20A8B7-DA2E-421A-B591-53A08E694CEF", "name": "Test Merchant 3", "settlementschedule": "Monthly", "address": { @@ -92,9 +97,11 @@ }, "device": { "device_identifier": "testmerchant3device" - } + }, + "createdate": "2022-08-31" }, { + "merchant_id": "8BC8434D-41F9-4CC3-83BC-E73F20C02E1D", "name": "v28 Emulator Merchant", "settlementschedule": "Immediate", "address": { @@ -121,9 +128,11 @@ }, "device": { "device_identifier": "dea09153b9c4220c" - } + }, + "createdate": "2022-08-31" }, { + "merchant_id": "A5B55C9A-12D6-4DE3-BF51-B111B5C8792C", "name": "S7 Merchant", "settlementschedule": "Immediate", "address": { @@ -150,9 +159,11 @@ }, "device": { "device_identifier": "ce11160bbd98480601" - } + }, + "createdate": "2022-08-31" }, { + "merchant_id": "22549CD1-AFDD-44F9-882F-51C3EA71CCC0", "name": "Xperia Merchant", "settlementschedule": "Immediate", "address": { @@ -179,7 +190,8 @@ }, "device": { "device_identifier": "CB5A26UB14" - } + }, + "createdate": "2022-08-31" } ], "operators": [ @@ -312,6 +324,7 @@ }, "merchants": [ { + "merchant_id": "1E637E40-9621-472E-9DC0-52DF473829B4", "name": "Test Merchant 4", "settlementschedule": "Immediate", "address": { @@ -333,9 +346,11 @@ }, "device": { "device_identifier": "testmerchant4device" - } + }, + "createdate": "2022-08-31" }, { + "merchant_id": "7042BA14-7549-4531-9892-2BD840C5BC63", "name": "Test Merchant 5", "settlementschedule": "Weekly", "address": { @@ -361,9 +376,11 @@ }, "device": { "device_identifier": "testmerchant5device" - } + }, + "createdate": "2022-08-31" }, { + "merchant_id": "D6DBA8D5-AE1F-49E6-BA94-D1432F41F686", "name": "Test Merchant 6", "settlementschedule": "Monthly", "address": { @@ -389,7 +406,8 @@ }, "device": { "device_identifier": "testmerchant6device" - } + }, + "createdate": "2022-08-31" } ], "operators": [