From 15135e2ae06ac2e2de4c32c6064731bc39c5d34e Mon Sep 17 00:00:00 2001
From: "Niklas.Au" <80054533+7Sovaren@users.noreply.github.com>
Date: Wed, 3 Jun 2026 15:10:42 +0200
Subject: [PATCH 1/8] feat: compat between soap and new rest
---
.../BfsJsonMapperTests.cs | 232 +
.../Bricknode.Rest.CompatSdk.Tests.csproj | 21 +
.../TestSupport/JsonEquivalence.cs | 66 +
.../TestSupport/ObjectFiller.cs | 124 +
.../Bricknode.Rest.CompatSdk.csproj | 26 +
.../Builders/IMultiBfsApiClientBuilder.cs | 14 +
.../Builders/MultiBfsApiClientBuilder.cs | 28 +
.../Configuration/BfsApiConfiguration.cs | 16 +
.../BfsApiDependencyInjectionExtensions.cs | 88 +
.../MultiBfsApiClientBuilderExtensions.cs | 29 +
.../Factories/BfsApiClientFactory.cs | 61 +
.../Factories/BfsApiConfigurationProvider.cs | 31 +
.../Factories/IBfsApiClientFactory.cs | 16 +
.../Factories/IBfsApiConfigurationProvider.cs | 9 +
.../Factories/RestResourceClientActivator.cs | 34 +
.../Factories/SingleBfsClientFactory.cs | 57 +
.../Generated/BfsApiModels.cs | 87317 ++++++++++++++++
.../Lookups/BfsAccountStatus.cs | 13 +
.../Lookups/BfsAccountType.cs | 55 +
.../Lookups/BfsInstrumentType.cs | 18 +
.../Lookups/BfsTransferReceiverTypeKey.cs | 43 +
.../Mapping/BfsJsonMapper.cs | 64 +
.../RestClient.generated.cs | 64975 ++++++++++++
.../Services/Bases/BfsServiceBase.cs | 115 +
.../Services/BfsAccountService.cs | 149 +
.../Services/BfsAllocationProfileService.cs | 120 +
.../Services/BfsAssetService.cs | 319 +
.../Services/BfsAuthenticationService.cs | 71 +
.../Services/BfsBankIdService.cs | 104 +
.../Services/BfsBusinessEventService.cs | 50 +
.../Services/BfsCountryService.cs | 43 +
.../Services/BfsCurrencyService.cs | 75 +
.../Services/BfsCustomFieldService.cs | 70 +
.../Services/BfsDealService.cs | 50 +
.../Services/BfsFeeManagerService.cs | 91 +
.../Services/BfsFileService.cs | 138 +
.../Services/BfsInstructionService.cs | 125 +
.../Services/BfsInsuranceService.cs | 288 +
.../Services/BfsLegalEntitiesService.cs | 224 +
.../Services/BfsMessageService.cs | 95 +
.../Services/BfsNoteService.cs | 95 +
.../Services/BfsOrderService.cs | 1243 +
.../Services/BfsPositionService.cs | 124 +
.../Services/BfsPowerOfAttorneyService.cs | 117 +
.../Services/BfsPriceService.cs | 86 +
.../Services/BfsReservationService.cs | 93 +
.../Services/BfsService.cs | 6 +
.../Services/BfsTaskService.cs | 95 +
.../Services/BfsTaxService.cs | 96 +
.../Services/BfsTransactionNoteService.cs | 50 +
.../Services/BfsTransactionService.cs | 286 +
.../Services/BfsTransferReceiverService.cs | 124 +
.../Services/BfsTrsService.cs | 50 +
.../Services/BfsWebhookService.cs | 141 +
.../Services/BfsWhiteLabelService.cs | 95 +
.../Services/IBfsAccountService.cs | 62 +
.../Services/IBfsAllocationProfileService.cs | 42 +
.../Services/IBfsAssetService.cs | 101 +
.../Services/IBfsAuthenticationService.cs | 22 +
.../Services/IBfsBankIdService.cs | 41 +
.../Services/IBfsBusinessEventService.cs | 16 +
.../Services/IBfsCountryService.cs | 10 +
.../Services/IBfsCurrencyService.cs | 24 +
.../Services/IBfsCustomFieldService.cs | 17 +
.../Services/IBfsDealService.cs | 16 +
.../Services/IBfsFeeManagerService.cs | 19 +
.../Services/IBfsFileService.cs | 49 +
.../Services/IBfsInstructionService.cs | 40 +
.../Services/IBfsInsuranceService.cs | 91 +
.../Services/IBfsLegalEntitiesService.cs | 70 +
.../Services/IBfsMessageService.cs | 34 +
.../Services/IBfsNoteService.cs | 34 +
.../Services/IBfsOrderService.cs | 388 +
.../Services/IBfsPositionService.cs | 44 +
.../Services/IBfsPowerOfAttorneyService.cs | 41 +
.../Services/IBfsPriceService.cs | 34 +
.../Services/IBfsReservationService.cs | 16 +
.../Services/IBfsTaskService.cs | 34 +
.../Services/IBfsTaxService.cs | 34 +
.../Services/IBfsTransactionNoteService.cs | 14 +
.../Services/IBfsTransactionService.cs | 103 +
.../Services/IBfsTransferReceiverService.cs | 42 +
.../Services/IBfsTrsService.cs | 16 +
.../Services/IBfsWebhookService.cs | 48 +
.../Services/IBfsWhiteLabelService.cs | 33 +
Bricknode.Soap.Sdk.sln | 40 +
86 files changed, 159740 insertions(+)
create mode 100644 Bricknode.Rest.CompatSdk.Tests/BfsJsonMapperTests.cs
create mode 100644 Bricknode.Rest.CompatSdk.Tests/Bricknode.Rest.CompatSdk.Tests.csproj
create mode 100644 Bricknode.Rest.CompatSdk.Tests/TestSupport/JsonEquivalence.cs
create mode 100644 Bricknode.Rest.CompatSdk.Tests/TestSupport/ObjectFiller.cs
create mode 100644 Bricknode.Rest.CompatSdk/Bricknode.Rest.CompatSdk.csproj
create mode 100644 Bricknode.Rest.CompatSdk/Builders/IMultiBfsApiClientBuilder.cs
create mode 100644 Bricknode.Rest.CompatSdk/Builders/MultiBfsApiClientBuilder.cs
create mode 100644 Bricknode.Rest.CompatSdk/Configuration/BfsApiConfiguration.cs
create mode 100644 Bricknode.Rest.CompatSdk/Extensions/BfsApiDependencyInjectionExtensions.cs
create mode 100644 Bricknode.Rest.CompatSdk/Extensions/MultiBfsApiClientBuilderExtensions.cs
create mode 100644 Bricknode.Rest.CompatSdk/Factories/BfsApiClientFactory.cs
create mode 100644 Bricknode.Rest.CompatSdk/Factories/BfsApiConfigurationProvider.cs
create mode 100644 Bricknode.Rest.CompatSdk/Factories/IBfsApiClientFactory.cs
create mode 100644 Bricknode.Rest.CompatSdk/Factories/IBfsApiConfigurationProvider.cs
create mode 100644 Bricknode.Rest.CompatSdk/Factories/RestResourceClientActivator.cs
create mode 100644 Bricknode.Rest.CompatSdk/Factories/SingleBfsClientFactory.cs
create mode 100644 Bricknode.Rest.CompatSdk/Generated/BfsApiModels.cs
create mode 100644 Bricknode.Rest.CompatSdk/Lookups/BfsAccountStatus.cs
create mode 100644 Bricknode.Rest.CompatSdk/Lookups/BfsAccountType.cs
create mode 100644 Bricknode.Rest.CompatSdk/Lookups/BfsInstrumentType.cs
create mode 100644 Bricknode.Rest.CompatSdk/Lookups/BfsTransferReceiverTypeKey.cs
create mode 100644 Bricknode.Rest.CompatSdk/Mapping/BfsJsonMapper.cs
create mode 100644 Bricknode.Rest.CompatSdk/RestClient.generated.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/Bases/BfsServiceBase.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsAccountService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsAllocationProfileService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsAssetService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsAuthenticationService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsBankIdService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsBusinessEventService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsCountryService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsCurrencyService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsCustomFieldService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsDealService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsFeeManagerService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsFileService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsInstructionService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsInsuranceService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsLegalEntitiesService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsMessageService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsNoteService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsOrderService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsPositionService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsPowerOfAttorneyService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsPriceService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsReservationService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsTaskService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsTaxService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsTransactionNoteService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsTransactionService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsTransferReceiverService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsTrsService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsWebhookService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/BfsWhiteLabelService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsAccountService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsAllocationProfileService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsAssetService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsAuthenticationService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsBankIdService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsBusinessEventService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsCountryService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsCurrencyService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsCustomFieldService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsDealService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsFeeManagerService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsFileService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsInstructionService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsInsuranceService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsLegalEntitiesService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsMessageService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsNoteService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsOrderService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsPositionService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsPowerOfAttorneyService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsPriceService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsReservationService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsTaskService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsTaxService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsTransactionNoteService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsTransactionService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsTransferReceiverService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsTrsService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsWebhookService.cs
create mode 100644 Bricknode.Rest.CompatSdk/Services/IBfsWhiteLabelService.cs
diff --git a/Bricknode.Rest.CompatSdk.Tests/BfsJsonMapperTests.cs b/Bricknode.Rest.CompatSdk.Tests/BfsJsonMapperTests.cs
new file mode 100644
index 0000000..1f11f7b
--- /dev/null
+++ b/Bricknode.Rest.CompatSdk.Tests/BfsJsonMapperTests.cs
@@ -0,0 +1,232 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using BfsApi;
+using CompatSdkTests.TestSupport;
+using Bricknode.Soap.Sdk.Mapping;
+using Xunit;
+using Xunit.Abstractions;
+using RestApi = global::Bricknode.Rest.CompatSdk;
+
+namespace CompatSdkTests;
+
+///
+/// Validates the JSON-bridge mapper used by the REST compat layer:
+/// SOAP-shaped BfsApi.* DTOs must survive a SOAP -> REST -> SOAP round-trip unchanged.
+///
+public class BfsJsonMapperTests
+{
+ private readonly ITestOutputHelper _output;
+
+ public BfsJsonMapperTests(ITestOutputHelper output)
+ {
+ _output = output;
+ }
+
+ // ---- Diagnostic: which BfsApi request/response types have NO REST counterpart? ----
+ // These are SOAP operations that cannot be ported by name as-is (the REST op may be absent,
+ // renamed, or merged). Informational only - stays green; writes the list to a file artifact.
+
+ [Fact]
+ public void Report_Soap_RequestResponse_Types_Without_Rest_Counterpart()
+ {
+ var assembly = typeof(RestApi.AccountsClient).Assembly;
+ var restNames = RestTypeNames(assembly);
+
+ var soapTypes = SoapRequestResponseTypes(assembly).ToList();
+ var unmatched = soapTypes
+ .Where(t => !restNames.Contains(t.Name))
+ .Select(t => t.Name)
+ .OrderBy(n => n, StringComparer.Ordinal)
+ .ToList();
+
+ var matchedCount = soapTypes.Count - unmatched.Count;
+
+ var report =
+ $"BfsApi request/response types: {soapTypes.Count} total, " +
+ $"{matchedCount} matched to a REST type, {unmatched.Count} unmatched.\n" +
+ "Unmatched (no REST type with the same name):\n" +
+ (unmatched.Count == 0 ? " (none)" : string.Join("\n", unmatched.Select(n => " " + n)));
+
+ _output.WriteLine(report);
+
+ var path = Path.Combine(AppContext.BaseDirectory, "unmatched-soap-request-response.txt");
+ File.WriteAllText(path, report);
+ _output.WriteLine("Written to: " + path);
+ }
+
+ // ---- Round-trip fidelity for EVERY BfsApi request/response with a REST counterpart ----
+ // SOAP -> REST -> SOAP must "look the same". Data-driven so new types are covered automatically.
+
+ [Theory]
+ [MemberData(nameof(RequestResponsePairs))]
+ public void RequestResponse_RoundTrips(TypePair pair)
+ {
+ var original = ObjectFiller.Create(pair.Soap);
+ Assert.NotNull(original);
+
+ var rest = MapDynamic(original!, pair.Rest);
+ Assert.NotNull(rest);
+
+ var roundTripped = MapDynamic(rest!, pair.Soap);
+ Assert.NotNull(roundTripped);
+ Assert.NotNull(original);
+
+ JsonEquivalence.AssertEquivalent(original, roundTripped);
+ Assert.NotEqual(original, roundTripped);
+ }
+
+ public static IEnumerable