From a191e93416896de6dd94d6fac88ba4dad2840bc1 Mon Sep 17 00:00:00 2001 From: Stuart Ferguson Date: Fri, 21 Oct 2022 17:50:19 +0100 Subject: [PATCH] Added new projection --- .../EventStoreProjections.Tests.njsproj | 1 + .../tests/MerchantBalanceAggregatorTests.js | 93 +++++++++++++++++++ NugetPackage/NugetPackage.csproj | 10 ++ .../obj/NugetPackage.csproj.nuget.dgspec.json | 3 +- .../obj/NugetPackage.csproj.nuget.g.props | 2 +- NugetPackage/obj/project.assets.json | 3 +- NugetPackage/obj/project.nuget.cache | 2 +- .../continuous/MerchantBalanceAggregator.js | 46 +++++++++ 8 files changed, 154 insertions(+), 6 deletions(-) create mode 100644 EventStoreProjections/tests/MerchantBalanceAggregatorTests.js create mode 100644 NugetPackage/projections/continuous/MerchantBalanceAggregator.js diff --git a/EventStoreProjections/EventStoreProjections.Tests.njsproj b/EventStoreProjections/EventStoreProjections.Tests.njsproj index 3c8804e..a5f41be 100644 --- a/EventStoreProjections/EventStoreProjections.Tests.njsproj +++ b/EventStoreProjections/EventStoreProjections.Tests.njsproj @@ -43,6 +43,7 @@ + diff --git a/EventStoreProjections/tests/MerchantBalanceAggregatorTests.js b/EventStoreProjections/tests/MerchantBalanceAggregatorTests.js new file mode 100644 index 0000000..d748f44 --- /dev/null +++ b/EventStoreProjections/tests/MerchantBalanceAggregatorTests.js @@ -0,0 +1,93 @@ +require('../../NugetPackage/projections/continuous/MerchantBalanceAggregator.js'); +var projection = require('@transactionprocessing/esprojection-testing-framework'); +var testData = require('./TestData.js'); +var describe = require('tape-describe'); +var test = describe('Merchant Balance Aggregator Tests'); + +test('Projection Can Handle Merchant Events', + t => + { + projection.initialize(); + + var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; + var merchantId = 'c4c33d75-f011-40e4-9d97-1f428ab563d8'; + var merchantName = 'Test Merchant 1'; + + // Set up the merchant events + var merchantCreatedEvent = testData.getMerchantCreatedEvent(estateId, merchantId, merchantName); + + var depositDateTime = '2020-05-30T06:21:31.356Z'; + var depositAmount = 1000.00; + var manualDepositMadeEvent = + testData.getManualDepositMadeEvent(estateId, merchantId, depositDateTime, depositAmount); + + var automaticDepositMadeEvent = + testData.getAutomaticDepositMadeEvent(estateId, merchantId, depositDateTime, depositAmount); + + projection.processEvent( + 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), + merchantCreatedEvent.eventType, + merchantCreatedEvent.data); + + projection.processEvent( + 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), + manualDepositMadeEvent.eventType, + manualDepositMadeEvent.data); + + projection.processEvent( + 'MerchantAggregate-' + merchantId.replace(/-/gi, ""), + automaticDepositMadeEvent.eventType, + automaticDepositMadeEvent.data); + + var events = projection.emittedEvents; + t.equal(events.length, 3); + t.end(); + }); + +test('Projection Can Handle Transaction Events', + t => + { + projection.initialize(); + + var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc'; + var merchantId = 'c4c33d75-f011-40e4-9d97-1f428ab563d8'; + var transactionId = 'c4c33d75-f011-40e4-9d97-1f428ab563d8'; + var transactionAmount = 100.00; + var transactionType = 'Sale'; + + var transactionHasStartedEvent = testData.getTransactionHasStartedEvent(estateId, + merchantId, + transactionId, + transactionAmount, + transactionType); + + var transactionHasBeenCompletedEvent = + testData.getTransactionHasBeenCompletedEvent(estateId, merchantId, transactionId, true); + + var calculatedValue = 5.00; + var eventCreatedDateTime = "2020-05-16T07:47:51.6617562+00:00"; + var merchantFeeAddedToTransactionEvent = testData.getMerchantFeeAddedToTransactionEvent(estateId, + merchantId, + transactionId, + calculatedValue, + eventCreatedDateTime); + + projection.processEvent( + 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), + transactionHasStartedEvent.eventType, + transactionHasStartedEvent.data); + + projection.processEvent( + 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), + transactionHasBeenCompletedEvent.eventType, + transactionHasBeenCompletedEvent.data); + + projection.processEvent( + 'TransactionAggregate-' + transactionId.replace(/-/gi, ""), + merchantFeeAddedToTransactionEvent.eventType, + merchantFeeAddedToTransactionEvent.data); + + var events = projection.emittedEvents; + t.equal(events.length, 3); + t.end(); + }); \ No newline at end of file diff --git a/NugetPackage/NugetPackage.csproj b/NugetPackage/NugetPackage.csproj index 86a0296..29bd709 100644 --- a/NugetPackage/NugetPackage.csproj +++ b/NugetPackage/NugetPackage.csproj @@ -30,4 +30,14 @@ + + + + + + + Always + + + diff --git a/NugetPackage/obj/NugetPackage.csproj.nuget.dgspec.json b/NugetPackage/obj/NugetPackage.csproj.nuget.dgspec.json index fb4228c..414ecbf 100644 --- a/NugetPackage/obj/NugetPackage.csproj.nuget.dgspec.json +++ b/NugetPackage/obj/NugetPackage.csproj.nuget.dgspec.json @@ -28,7 +28,6 @@ "sources": { "C:\\Program Files\\dotnet\\library-packs": {}, "https://api.nuget.org/v3/index.json": {}, - "https://nuget.devexpress.com/tP9yfuwysSqblTj4iZAmef8L1WgJPsXlZjZLvEacI8BaCoK3A1/api": {}, "https://www.myget.org/F/transactionprocessing/api/v3/index.json": {}, "https://www.myget.org/F/vme-intellistore/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {}, "https://www.myget.org/F/vme-shared/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {} @@ -64,7 +63,7 @@ "privateAssets": "all" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.401\\RuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.100-rc.2.22477.23\\RuntimeIdentifierGraph.json" } } } diff --git a/NugetPackage/obj/NugetPackage.csproj.nuget.g.props b/NugetPackage/obj/NugetPackage.csproj.nuget.g.props index 1937de4..35c5861 100644 --- a/NugetPackage/obj/NugetPackage.csproj.nuget.g.props +++ b/NugetPackage/obj/NugetPackage.csproj.nuget.g.props @@ -7,7 +7,7 @@ $(UserProfile)\.nuget\packages\ C:\Users\stuar\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages;C:\Program Files\dotnet\sdk\NuGetFallbackFolder PackageReference - 6.3.0 + 6.4.0 diff --git a/NugetPackage/obj/project.assets.json b/NugetPackage/obj/project.assets.json index 192c004..9aa4546 100644 --- a/NugetPackage/obj/project.assets.json +++ b/NugetPackage/obj/project.assets.json @@ -36,7 +36,6 @@ "sources": { "C:\\Program Files\\dotnet\\library-packs": {}, "https://api.nuget.org/v3/index.json": {}, - "https://nuget.devexpress.com/tP9yfuwysSqblTj4iZAmef8L1WgJPsXlZjZLvEacI8BaCoK3A1/api": {}, "https://www.myget.org/F/transactionprocessing/api/v3/index.json": {}, "https://www.myget.org/F/vme-intellistore/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {}, "https://www.myget.org/F/vme-shared/auth/024ff48c-540a-4059-8712-d54f7b0d6a31/api/v3/index.json": {} @@ -72,7 +71,7 @@ "privateAssets": "all" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.401\\RuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.100-rc.2.22477.23\\RuntimeIdentifierGraph.json" } } } diff --git a/NugetPackage/obj/project.nuget.cache b/NugetPackage/obj/project.nuget.cache index 324312d..b348e77 100644 --- a/NugetPackage/obj/project.nuget.cache +++ b/NugetPackage/obj/project.nuget.cache @@ -1,6 +1,6 @@ { "version": 2, - "dgSpecHash": "KbjJ6b/Y+kTy1GKsVWpr7Z3DDcY3Fx1ElosAQ1kHqJTgRiQCXFzRulAKCOqka9t8HA4vmisX5vbm1ENdIq+C8Q==", + "dgSpecHash": "zKSi6wid/WSnBVdoC/xTn5nYXu7whOdnAbYDX2c907cmEVYMfmCreIiWizMZeX0Heo5FKLmFLarJl29Q9A9qJg==", "success": true, "projectFilePath": "C:\\Projects\\TransactionProcessing\\EventStoreProjections\\NugetPackage\\NugetPackage.csproj", "expectedPackageFiles": [], diff --git a/NugetPackage/projections/continuous/MerchantBalanceAggregator.js b/NugetPackage/projections/continuous/MerchantBalanceAggregator.js new file mode 100644 index 0000000..4cbc140 --- /dev/null +++ b/NugetPackage/projections/continuous/MerchantBalanceAggregator.js @@ -0,0 +1,46 @@ +//starttestsetup +var fromAll = fromAll || require("../../../EventStoreProjections/node_modules/@transactionprocessing/esprojection-testing-framework").scope.fromAll; +var linkTo = linkTo || require("../../../EventStoreProjections/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) { + if (e.eventType == "MerchantCreatedEvent" || + e.eventType === "ManualDepositMadeEvent" || + e.eventType === "AutomaticDepositMadeEvent" || + e.eventType === "TransactionHasStartedEvent" || + e.eventType === "TransactionHasBeenCompletedEvent" || + e.eventType === "MerchantFeeAddedToTransactionEvent") { + var streamName = "MerchantBalanceArchive-" + merchantId.replace(/-/gi, ""); + linkTo(streamName, e); + } + } + } + } + }); \ No newline at end of file