From 8a3813389ed56b6553142789f1ba302c1527e643 Mon Sep 17 00:00:00 2001 From: jvandaal Date: Wed, 29 Nov 2023 14:55:49 +0100 Subject: [PATCH] feat: add StreetNameWasRenamed event --- .../Projections/StreetNameKafkaProjection.cs | 1 + .../Extensions/MessageExtensions.cs | 21 -------- ...ireAddressesBecauseStreetNameWasRenamed.cs | 45 ---------------- .../RetireStreetNameBecauseOfRename.cs | 5 ++ .../StreetName/Events/StreetNameWasRenamed.cs | 52 +++++++++++++++++++ src/AddressRegistry/StreetName/StreetName.cs | 4 +- .../StreetNameCommandHandlerModule.cs | 2 +- .../StreetName/StreetName_State.cs | 6 +++ .../GivenStreetName.cs | 51 +++++++++++++++--- 9 files changed, 110 insertions(+), 77 deletions(-) delete mode 100644 src/AddressRegistry/StreetName/Commands/RetireAddressesBecauseStreetNameWasRenamed.cs create mode 100644 src/AddressRegistry/StreetName/Events/StreetNameWasRenamed.cs diff --git a/src/AddressRegistry.Consumer/Projections/StreetNameKafkaProjection.cs b/src/AddressRegistry.Consumer/Projections/StreetNameKafkaProjection.cs index 4999d82c3..b726ea01b 100644 --- a/src/AddressRegistry.Consumer/Projections/StreetNameKafkaProjection.cs +++ b/src/AddressRegistry.Consumer/Projections/StreetNameKafkaProjection.cs @@ -179,6 +179,7 @@ await commandHandler.Handle( var retireStreetNameBecauseOfRename = new RetireStreetNameBecauseOfRename( new StreetNamePersistentLocalId(message.PersistentLocalId), + new StreetNamePersistentLocalId(message.DestinationPersistentLocalId), FromProvenance(message.Provenance)); await commandHandler.Handle(retireStreetNameBecauseOfRename, ct); diff --git a/src/AddressRegistry.Producer/Extensions/MessageExtensions.cs b/src/AddressRegistry.Producer/Extensions/MessageExtensions.cs index 4ec747e2e..1aa9f146f 100644 --- a/src/AddressRegistry.Producer/Extensions/MessageExtensions.cs +++ b/src/AddressRegistry.Producer/Extensions/MessageExtensions.cs @@ -246,27 +246,6 @@ public static Contracts.AddressWasCorrectedFromRejectedToProposed ToContract(thi message.AddressPersistentLocalId, message.Provenance.ToContract()); - public static Contracts.MigratedStreetNameWasImported ToContract(this StreetNameAggregate.MigratedStreetNameWasImported message) => - new Contracts.MigratedStreetNameWasImported( - message.StreetNameId.ToString("D"), - message.StreetNamePersistentLocalId, - message.MunicipalityId.ToString("D"), - message.NisCode, - message.StreetNameStatus.ToString(), - message.Provenance.ToContract()); - - public static Contracts.StreetNameWasApproved ToContract(this StreetNameAggregate.StreetNameWasApproved message) => - new Contracts.StreetNameWasApproved(message.StreetNamePersistentLocalId, message.Provenance.ToContract()); - - public static Contracts.StreetNameWasRetired ToContract(this StreetNameAggregate.StreetNameWasRetired message) => - new Contracts.StreetNameWasRetired(message.StreetNamePersistentLocalId, message.Provenance.ToContract()); - - public static Contracts.StreetNameWasImported ToContract(this StreetNameAggregate.StreetNameWasImported message) => - new Contracts.StreetNameWasImported(message.StreetNamePersistentLocalId, message.MunicipalityId.ToString("D"), message.StreetNameStatus.ToString(), message.Provenance.ToContract()); - - public static Contracts.StreetNameWasRemoved ToContract(this StreetNameAggregate.StreetNameWasRemoved message) => - new Contracts.StreetNameWasRemoved(message.StreetNamePersistentLocalId, message.Provenance.ToContract()); - public static Contracts.AddressRegularizationWasCorrected ToContract(this StreetNameAggregate.AddressRegularizationWasCorrected message) => new Contracts.AddressRegularizationWasCorrected(message.StreetNamePersistentLocalId, message.AddressPersistentLocalId, message.Provenance.ToContract()); diff --git a/src/AddressRegistry/StreetName/Commands/RetireAddressesBecauseStreetNameWasRenamed.cs b/src/AddressRegistry/StreetName/Commands/RetireAddressesBecauseStreetNameWasRenamed.cs deleted file mode 100644 index 793622953..000000000 --- a/src/AddressRegistry/StreetName/Commands/RetireAddressesBecauseStreetNameWasRenamed.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace AddressRegistry.StreetName.Commands -{ - using System; - using System.Collections.Generic; - using Be.Vlaanderen.Basisregisters.Generators.Guid; - using Be.Vlaanderen.Basisregisters.GrAr.Provenance; - using Be.Vlaanderen.Basisregisters.Utilities; - - public class RetireAddressesBecauseStreetNameWasRenamed : IHasCommandProvenance - { - private static readonly Guid Namespace = new Guid("cb9535c1-bcec-47b3-87fe-038f375d878a"); - - public StreetNamePersistentLocalId PersistentLocalId { get; } - - public List AddressesToRetire { get; } - public Provenance Provenance { get; } - - public RetireAddressesBecauseStreetNameWasRenamed( - StreetNamePersistentLocalId persistentLocalId, - List addressPersistentLocalIds, - Provenance provenance) - { - PersistentLocalId = persistentLocalId; - AddressesToRetire = addressPersistentLocalIds; - Provenance = provenance; - } - - public Guid CreateCommandId() - => Deterministic.Create(Namespace, $"RetireAddressesBecauseStreetNameWasRenamed-{ToString()}"); - - public override string? ToString() - => ToStringBuilder.ToString(IdentityFields()); - - private IEnumerable IdentityFields() - { - yield return PersistentLocalId; - yield return AddressesToRetire; - - foreach (var field in Provenance.GetIdentityFields()) - { - yield return field; - } - } - } -} diff --git a/src/AddressRegistry/StreetName/Commands/RetireStreetNameBecauseOfRename.cs b/src/AddressRegistry/StreetName/Commands/RetireStreetNameBecauseOfRename.cs index ef0474222..df833d235 100644 --- a/src/AddressRegistry/StreetName/Commands/RetireStreetNameBecauseOfRename.cs +++ b/src/AddressRegistry/StreetName/Commands/RetireStreetNameBecauseOfRename.cs @@ -11,13 +11,17 @@ public class RetireStreetNameBecauseOfRename : IHasCommandProvenance private static readonly Guid Namespace = new Guid("32e8aabd-67fb-4b59-9071-de2b226f701b"); public StreetNamePersistentLocalId PersistentLocalId { get; } + public StreetNamePersistentLocalId DestinationPersistentLocalId { get; set; } + public Provenance Provenance { get; } public RetireStreetNameBecauseOfRename( StreetNamePersistentLocalId persistentLocalId, + StreetNamePersistentLocalId destinationPersistentLocalId, Provenance provenance) { PersistentLocalId = persistentLocalId; + DestinationPersistentLocalId = destinationPersistentLocalId; Provenance = provenance; } @@ -30,6 +34,7 @@ public Guid CreateCommandId() private IEnumerable IdentityFields() { yield return PersistentLocalId; + yield return DestinationPersistentLocalId; foreach (var field in Provenance.GetIdentityFields()) { diff --git a/src/AddressRegistry/StreetName/Events/StreetNameWasRenamed.cs b/src/AddressRegistry/StreetName/Events/StreetNameWasRenamed.cs new file mode 100644 index 000000000..d79e78eb2 --- /dev/null +++ b/src/AddressRegistry/StreetName/Events/StreetNameWasRenamed.cs @@ -0,0 +1,52 @@ +namespace AddressRegistry.StreetName.Events +{ + using System.Collections.Generic; + using System.Globalization; + using System.Linq; + using Be.Vlaanderen.Basisregisters.EventHandling; + using Be.Vlaanderen.Basisregisters.GrAr.Common; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; + using Newtonsoft.Json; + + [EventTags(Tag.StreetName)] + [EventName(EventName)] + [EventDescription("De straatnaam werd hernoemd.")] + public class StreetNameWasRenamed : IStreetNameEvent + { + public const string EventName = "StreetNameWasRenamed"; // BE CAREFUL CHANGING THIS!! + + public int StreetNamePersistentLocalId { get; } + public int DestinationStreetNamePersistentLocalId { get; } + public ProvenanceData Provenance { get; private set; } + + public StreetNameWasRenamed( + StreetNamePersistentLocalId streetNamePersistentLocalId, + StreetNamePersistentLocalId destinationStreetNamePersistentLocalId) + { + StreetNamePersistentLocalId = streetNamePersistentLocalId; + DestinationStreetNamePersistentLocalId = destinationStreetNamePersistentLocalId; + } + + [JsonConstructor] + private StreetNameWasRenamed( + int streetNamePersistentLocalId, + int destinationStreetNamePersistentLocalId, + ProvenanceData provenance) + : this( + new StreetNamePersistentLocalId(streetNamePersistentLocalId), + new StreetNamePersistentLocalId(destinationStreetNamePersistentLocalId)) + => ((ISetProvenance)this).SetProvenance(provenance.ToProvenance()); + + void ISetProvenance.SetProvenance(Provenance provenance) => Provenance = new ProvenanceData(provenance); + + public IEnumerable GetHashFields() + { + var fields = Provenance.GetHashFields().ToList(); + fields.Add(StreetNamePersistentLocalId.ToString(CultureInfo.InvariantCulture)); + fields.Add(DestinationStreetNamePersistentLocalId.ToString(CultureInfo.InvariantCulture)); + return fields; + } + + public string GetHash() => this.ToEventHash(EventName); + } +} diff --git a/src/AddressRegistry/StreetName/StreetName.cs b/src/AddressRegistry/StreetName/StreetName.cs index ba9bef956..9c1f40d2b 100644 --- a/src/AddressRegistry/StreetName/StreetName.cs +++ b/src/AddressRegistry/StreetName/StreetName.cs @@ -194,14 +194,14 @@ private static void RetireAddressesBecauseStreetNameWasRetired(IEnumerable(When); Register(When); Register(When); + Register(When); Register(When); Register(When); Register(When); @@ -131,6 +132,11 @@ private void When(StreetNameWasRetired @event) Status = StreetNameStatus.Retired; } + private void When(StreetNameWasRenamed @event) + { + Status = StreetNameStatus.Retired; + } + private void When(StreetNameWasRemoved @event) { IsRemoved = true; diff --git a/test/AddressRegistry.Tests/AggregateTests/WhenRetiringStreetNameBecauseOfRename/GivenStreetName.cs b/test/AddressRegistry.Tests/AggregateTests/WhenRetiringStreetNameBecauseOfRename/GivenStreetName.cs index f728168e0..80ee0d876 100644 --- a/test/AddressRegistry.Tests/AggregateTests/WhenRetiringStreetNameBecauseOfRename/GivenStreetName.cs +++ b/test/AddressRegistry.Tests/AggregateTests/WhenRetiringStreetNameBecauseOfRename/GivenStreetName.cs @@ -1,9 +1,13 @@ namespace AddressRegistry.Tests.AggregateTests.WhenRetiringStreetNameBecauseOfRename { + using System.Collections.Generic; using AutoFixture; using Be.Vlaanderen.Basisregisters.AggregateSource; + using Be.Vlaanderen.Basisregisters.AggregateSource.Snapshotting; using Be.Vlaanderen.Basisregisters.AggregateSource.Testing; + using Be.Vlaanderen.Basisregisters.GrAr.Provenance; using EventExtensions; + using FluentAssertions; using global::AutoFixture; using StreetName; using StreetName.Commands; @@ -28,10 +32,13 @@ public void ThenAddressesWereRetiredOrRejectedAndStreetNameWasRetired() { var streetNamePersistentLocalId = Fixture.Create(); - var command = Fixture.Create(); + var command = new RetireStreetNameBecauseOfRename( + streetNamePersistentLocalId, + new StreetNamePersistentLocalId(streetNamePersistentLocalId + 1), + Fixture.Create()); var streetNameWasImported = Fixture.Create() - .WithStatus(StreetNameStatus.Current); + .WithStatus(StreetNameStatus.Current); var proposedAddress = Fixture.Create() .AsHouseNumberAddress(); @@ -47,11 +54,13 @@ public void ThenAddressesWereRetiredOrRejectedAndStreetNameWasRetired() .When(command) .Then( new Fact(new StreetNameStreamId(command.PersistentLocalId), - new AddressWasRejectedBecauseOfReaddress(streetNamePersistentLocalId, new AddressPersistentLocalId(proposedAddress.AddressPersistentLocalId))), + new AddressWasRejectedBecauseOfReaddress(streetNamePersistentLocalId, + new AddressPersistentLocalId(proposedAddress.AddressPersistentLocalId))), new Fact(new StreetNameStreamId(command.PersistentLocalId), - new AddressWasRetiredBecauseOfReaddress(streetNamePersistentLocalId, new AddressPersistentLocalId(currentAddress.AddressPersistentLocalId))), + new AddressWasRetiredBecauseOfReaddress(streetNamePersistentLocalId, + new AddressPersistentLocalId(currentAddress.AddressPersistentLocalId))), new Fact(new StreetNameStreamId(command.PersistentLocalId), - new StreetNameWasRetired(streetNamePersistentLocalId)))); + new StreetNameWasRenamed(streetNamePersistentLocalId, command.DestinationPersistentLocalId)))); } [Fact] @@ -59,10 +68,13 @@ public void WithInActiveAddresses_ThenStreetNameWasRetired() { var streetNamePersistentLocalId = Fixture.Create(); - var command = Fixture.Create(); + var command = new RetireStreetNameBecauseOfRename( + streetNamePersistentLocalId, + new StreetNamePersistentLocalId(streetNamePersistentLocalId + 1), + Fixture.Create()); var streetNameWasImported = Fixture.Create() - .WithStatus(StreetNameStatus.Current); + .WithStatus(StreetNameStatus.Current); var retiredAddress = Fixture.Create() .AsHouseNumberAddress() @@ -83,7 +95,30 @@ public void WithInActiveAddresses_ThenStreetNameWasRetired() removedAddress) .When(command) .Then(new Fact(new StreetNameStreamId(command.PersistentLocalId), - new StreetNameWasRetired(streetNamePersistentLocalId)))); + new StreetNameWasRenamed(streetNamePersistentLocalId, command.DestinationPersistentLocalId)))); + } + + [Fact] + public void StateCheck() + { + // Arrange + var streetNamePersistentLocalId = Fixture.Create(); + var destinationStreetNamePersistentLocalId = new StreetNamePersistentLocalId(streetNamePersistentLocalId + 1); + + var migratedStreetNameWasImported = Fixture.Create() + .WithStatus(StreetNameStatus.Current); + + var sut = new StreetNameFactory(NoSnapshotStrategy.Instance).Create(); + sut.Initialize(new List + { + migratedStreetNameWasImported, + new StreetNameWasRenamed( + streetNamePersistentLocalId, + destinationStreetNamePersistentLocalId) + }); + + // Assert + sut.Status.Should().Be(StreetNameStatus.Retired); } } }