diff --git a/src/AssociationRegistry.Admin.Api/Magda/MagdaGeefVerenigingService.cs b/src/AssociationRegistry.Admin.Api/Magda/MagdaGeefVerenigingService.cs index 42eba719b..d4e4efa99 100644 --- a/src/AssociationRegistry.Admin.Api/Magda/MagdaGeefVerenigingService.cs +++ b/src/AssociationRegistry.Admin.Api/Magda/MagdaGeefVerenigingService.cs @@ -46,11 +46,16 @@ public MagdaGeefVerenigingService( _logger = logger; } - public async Task> GeefVereniging(KboNummer kboNummer, CommandMetadata metadata, CancellationToken cancellationToken) + public async Task> GeefVereniging( + KboNummer kboNummer, + CommandMetadata metadata, + CancellationToken cancellationToken) { try { - var reference = await CreateReference(_magdaCallReferenceRepository, metadata.Initiator, metadata.CorrelationId, kboNummer, cancellationToken); + var reference = await CreateReference(_magdaCallReferenceRepository, metadata.Initiator, metadata.CorrelationId, kboNummer, + cancellationToken); + var magdaResponse = await _magdaFacade.GeefOnderneming(kboNummer, reference); if (MagdaResponseValidator.HasBlokkerendeUitzonderingen(magdaResponse)) @@ -70,7 +75,9 @@ public async Task> GeefVereniging(KboNummer kboNumm if (naamOndernemingType is null) return VerenigingVolgensKboResult.GeenGeldigeVereniging; - var maatschappelijkeZetel = magdaOnderneming.Adressen.SingleOrDefault(a => a.Type.Code.Value == AdresCodes.MaatschappelijkeZetel && IsActiveToday(a.DatumBegin, a.DatumEinde)); + var maatschappelijkeZetel = + magdaOnderneming.Adressen.SingleOrDefault(a => a.Type.Code.Value == AdresCodes.MaatschappelijkeZetel && + IsActiveToday(a.DatumBegin, a.DatumEinde)); return VerenigingVolgensKboResult.GeldigeVereniging( new VerenigingVolgensKbo @@ -198,17 +205,31 @@ private static bool IsActief(Onderneming2_0Type magdaOnderneming) private static bool IsOnderneming(Onderneming2_0Type magdaOnderneming) => magdaOnderneming.OndernemingOfVestiging.Code.Value == OndernemingOfVestigingCodes.Onderneming; - private Result HandleUitzonderingen(string kboNummer, ResponseEnvelope? magdaResponse) + private Result HandleUitzonderingen( + string kboNummer, + ResponseEnvelope? magdaResponse) { + var uitzonderingen = magdaResponse?.Body?.GeefOndernemingResponse?.Repliek.Antwoorden.Antwoord.Uitzonderingen; + _logger.LogInformation( - message: "Uitzondering bij het aanroepen van de Magda GeefOnderneming service voor KBO-nummer {KboNummer}: '{Diagnose}'", + "Uitzondering bij het aanroepen van de Magda GeefOnderneming service voor KBO-nummer {KboNummer}: " + + "\nFouten:\n'{Uitzonderingen}'" + + "\nWaarschuwingen:\n'{Waarschuwingen}'" + + "\nInformatie:\n'{Informatie}'", kboNummer, - magdaResponse?.Body?.GeefOndernemingResponse?.Repliek.Antwoorden.Antwoord.Uitzonderingen.ConcatenateUitzonderingen("\n")); + uitzonderingen?.ConcatenateUitzonderingen(separator: "\n", UitzonderingTypeType.FOUT), + uitzonderingen?.ConcatenateUitzonderingen(separator: "\n", UitzonderingTypeType.WAARSCHUWING), + uitzonderingen?.ConcatenateUitzonderingen(separator: "\n", UitzonderingTypeType.INFORMATIE)); return VerenigingVolgensKboResult.GeenGeldigeVereniging; } - private static async Task CreateReference(IMagdaCallReferenceRepository repository, string initiator, Guid correlationId, string opgevraagdOnderwerp, CancellationToken cancellationToken) + private static async Task CreateReference( + IMagdaCallReferenceRepository repository, + string initiator, + Guid correlationId, + string opgevraagdOnderwerp, + CancellationToken cancellationToken) { var magdaCallReference = new MagdaCallReference { diff --git a/src/AssociationRegistry.Admin.Api/Magda/MagdaResponseExtensions.cs b/src/AssociationRegistry.Admin.Api/Magda/MagdaResponseExtensions.cs index cecd017c7..e7f7c835a 100644 --- a/src/AssociationRegistry.Admin.Api/Magda/MagdaResponseExtensions.cs +++ b/src/AssociationRegistry.Admin.Api/Magda/MagdaResponseExtensions.cs @@ -1,24 +1,31 @@ namespace AssociationRegistry.Admin.Api.Magda; -using System; -using System.Linq; using AssociationRegistry.Magda.Models; using AssociationRegistry.Magda.Models.GeefOnderneming; using AssociationRegistry.Magda.Onderneming.GeefOnderneming; +using System; +using System.Linq; public static class MagdaResponseExtensions { - public static string ConcatenateUitzonderingen(this UitzonderingType[] source, string separator) + public static string ConcatenateUitzonderingen( + this UitzonderingType[] source, + string separator, + UitzonderingTypeType uitzonderingTypeType) => string.Join( separator, - source.Where(type => type.Type == UitzonderingTypeType.FOUT) - .Select(type => type.Diagnose)); + source.Where(type => type.Type == uitzonderingTypeType) + .Select(type => $"{type.Identificatie} - {type.Diagnose} - {type.Omstandigheid}")); - public static bool HasUitzonderingenOfType(this ResponseEnvelope? source, UitzonderingTypeType uitzonderingTypeType) + public static bool HasUitzonderingenOfType( + this ResponseEnvelope? source, + UitzonderingTypeType uitzonderingTypeType) { - return HasAnyUitzondering(source, type => type.Type == uitzonderingTypeType); + return HasAnyUitzondering(source, predicate: type => type.Type == uitzonderingTypeType); } - public static bool HasAnyUitzondering(this ResponseEnvelope? source, Func predicate) + public static bool HasAnyUitzondering( + this ResponseEnvelope? source, + Func predicate) => source?.Body?.GeefOndernemingResponse?.Repliek?.Antwoorden?.Antwoord?.Uitzonderingen?.Any(predicate) ?? false; } diff --git a/src/AssociationRegistry.Magda/MagdaFacade.cs b/src/AssociationRegistry.Magda/MagdaFacade.cs index 9bb66eb41..4db88308b 100644 --- a/src/AssociationRegistry.Magda/MagdaFacade.cs +++ b/src/AssociationRegistry.Magda/MagdaFacade.cs @@ -1,14 +1,14 @@ namespace AssociationRegistry.Magda; -using System.Security.Cryptography.X509Certificates; -using System.Text; -using System.Xml.Serialization; using Configuration; using Framework; using Microsoft.Extensions.Logging; using Models; using Models.GeefOnderneming; using Models.GeefOndernemingVKBO; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Xml.Serialization; public class MagdaFacade : IMagdaFacade { @@ -23,10 +23,12 @@ public MagdaFacade( _logger = logger; } - public async Task?> GeefOndernemingVKBO(string kbonummer, MagdaCallReference reference) + public async Task?> GeefOndernemingVKBO( + string kbonummer, + MagdaCallReference reference) { Throw - .IfNullOrWhiteSpace(_magdaOptions.GeefOndernemingVkboEndpoint, $"{nameof(MagdaOptionsSection.GeefOndernemingVkboEndpoint)}"); + .IfNullOrWhiteSpace(_magdaOptions.GeefOndernemingVkboEndpoint, $"{nameof(MagdaOptionsSection.GeefOndernemingVkboEndpoint)}"); var unsignedEnvelope = MakeEnvelope(GeefOndernemingVKBOBody.CreateRequest(kbonummer, reference.Reference, _magdaOptions)); var clientCertificate = GetMagdaClientCertificate(_magdaOptions); @@ -38,11 +40,10 @@ public MagdaFacade( signedEnvelope); } - public async Task?> GeefOnderneming(string kbonummer, MagdaCallReference reference) { Throw - .IfNullOrWhiteSpace(_magdaOptions.GeefOndernemingEndpoint, $"{nameof(MagdaOptionsSection.GeefOndernemingEndpoint)}"); + .IfNullOrWhiteSpace(_magdaOptions.GeefOndernemingEndpoint, $"{nameof(MagdaOptionsSection.GeefOndernemingEndpoint)}"); var unsignedEnvelope = MakeEnvelope(GeefOndernemingBody.CreateRequest(kbonummer, reference.Reference, _magdaOptions)); var clientCertificate = GetMagdaClientCertificate(_magdaOptions); @@ -58,7 +59,8 @@ public MagdaFacade( { if (magdaOptionsSection.ClientCertificate is null && magdaOptionsSection.ClientCertificatePassword is null) return null; - var maybeClientCertificate = MagdaClientCertificate.Create(magdaOptionsSection.ClientCertificate!, magdaOptionsSection.ClientCertificatePassword!); + var maybeClientCertificate = + MagdaClientCertificate.Create(magdaOptionsSection.ClientCertificate!, magdaOptionsSection.ClientCertificatePassword!); if (maybeClientCertificate is not { } clientCertificate) throw new NullReferenceException("ClientCertificate should never be null"); @@ -66,21 +68,27 @@ public MagdaFacade( return clientCertificate; } - private async Task?> PerformMagdaRequest(string endpoint, X509Certificate? magdaClientCertificate, string signedEnvelope) + private async Task?> PerformMagdaRequest( + string endpoint, + X509Certificate? magdaClientCertificate, + string signedEnvelope) { using var client = GetMagdaHttpClient(magdaClientCertificate); + try { return await SendEnvelopeToendpoint(endpoint, signedEnvelope, client); } catch (TaskCanceledException ex) { - _logger.LogError(ex, "{Message}", ex.Message); - throw new Exception("A timeout occurred when calling the Magda services", ex); + _logger.LogError(ex, message: "{Message}", ex.Message); + + throw new Exception(message: "A timeout occurred when calling the Magda services", ex); } catch (Exception ex) { - _logger.LogError(ex, "{Message}", ex.Message); + _logger.LogError(ex, message: "An error occurred when calling the Magda services: {Message}", ex.Message); + throw new Exception(ex.Message, ex); } } @@ -89,15 +97,16 @@ private HttpClient GetMagdaHttpClient(X509Certificate? magdaClientCertificate) { var client = new HttpClient(new MagdaHttpClientHandler(magdaClientCertificate)); client.Timeout = TimeSpan.FromSeconds(_magdaOptions.Timeout); + return client; } private async Task?> SendEnvelopeToendpoint(string endpoint, string signedEnvelope, HttpClient client) { var response = await client - .PostAsync( + .PostAsync( endpoint, - new StringContent(signedEnvelope, Encoding.UTF8, "application/soap+xml")); + new StringContent(signedEnvelope, Encoding.UTF8, mediaType: "application/soap+xml")); if (!response.IsSuccessStatusCode) { @@ -107,12 +116,13 @@ private HttpClient GetMagdaHttpClient(X509Certificate? magdaClientCertificate) return null; } - _logger.LogTrace("GeefOnderneming http response: {@Result}", response); + _logger.LogTrace(message: "GeefOnderneming http response: {@Result}", response); var serializer = new XmlSerializer(typeof(ResponseEnvelope)); var xml = await response.Content.ReadAsStringAsync(); using var reader = new StringReader(xml); + { return (ResponseEnvelope?)serializer.Deserialize(reader); } diff --git a/test/AssociationRegistry.Test.Admin.Api/Magda/MagdaKboService/When_Retrieving_VerenigingVolgensKbo/Given_GeefOndernemingResponseBody_With_Fout_Uitzondering.cs b/test/AssociationRegistry.Test.Admin.Api/Magda/MagdaKboService/When_Retrieving_VerenigingVolgensKbo/Given_GeefOndernemingResponseBody_With_Fout_Uitzondering.cs index 80ce85466..78900b3e0 100644 --- a/test/AssociationRegistry.Test.Admin.Api/Magda/MagdaKboService/When_Retrieving_VerenigingVolgensKbo/Given_GeefOndernemingResponseBody_With_Fout_Uitzondering.cs +++ b/test/AssociationRegistry.Test.Admin.Api/Magda/MagdaKboService/When_Retrieving_VerenigingVolgensKbo/Given_GeefOndernemingResponseBody_With_Fout_Uitzondering.cs @@ -74,7 +74,7 @@ public async Task Then_It_LogsTheUitzondering() It.Is(l => l == LogLevel.Information), It.IsAny(), It.Is((v, t) => v.ToString() == - $"Uitzondering bij het aanroepen van de Magda GeefOnderneming service voor KBO-nummer {kboNummer}: 'Er is een fout gebeurd\nEr is nog een fout gebeurd'"), + $"Uitzondering bij het aanroepen van de Magda GeefOnderneming service voor KBO-nummer {kboNummer}: \nFouten:\n' - Er is een fout gebeurd - \n - Er is nog een fout gebeurd - '\nWaarschuwingen:\n''\nInformatie:\n''"), It.IsAny(), It.Is>((v, t) => true)!), Times.Once);