Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: replace parcel address because of municipality merger #796

Merged
merged 8 commits into from
Jul 24, 2024
20 changes: 10 additions & 10 deletions paket.dependencies
Original file line number Diff line number Diff line change
Expand Up @@ -79,16 +79,16 @@ nuget Be.Vlaanderen.Basisregisters.Projector 15.0.0

nuget Be.Vlaanderen.Basisregisters.Crab 4.0.0

nuget Be.Vlaanderen.Basisregisters.GrAr.Common 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Notifications 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Contracts 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Edit 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Import 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Legacy 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Provenance 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Provenance.AcmIdm 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Extracts 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Oslo 21.7.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Common 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Notifications 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Contracts 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Edit 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Import 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Legacy 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Provenance 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Provenance.AcmIdm 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Extracts 21.14.0
nuget Be.Vlaanderen.Basisregisters.GrAr.Oslo 21.14.0

nuget Be.Vlaanderen.Basisregisters.MessageHandling.AwsSqs.Simple 5.0.1
nuget Be.Vlaanderen.Basisregisters.MessageHandling.Kafka.Simple 5.0.1
Expand Down
30 changes: 15 additions & 15 deletions paket.lock
Original file line number Diff line number Diff line change
Expand Up @@ -253,18 +253,18 @@ NUGET
Autofac.Extensions.DependencyInjection (>= 9.0)
Be.Vlaanderen.Basisregisters.EventHandling (5.0)
Be.Vlaanderen.Basisregisters.Generators.Guid.Deterministic (4.0)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.14)
Be.Vlaanderen.Basisregisters.AggregateSource (>= 9.0.1)
Be.Vlaanderen.Basisregisters.CommandHandling (>= 9.0.1)
NetTopologySuite (>= 2.5)
NodaTime (>= 3.1.11)
Be.Vlaanderen.Basisregisters.GrAr.Contracts (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Edit (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Contracts (21.14)
Be.Vlaanderen.Basisregisters.GrAr.Edit (21.14)
NetTopologySuite (>= 2.5)
Be.Vlaanderen.Basisregisters.GrAr.Extracts (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Extracts (21.14)
Be.Vlaanderen.Basisregisters.Api (>= 21.0)
Be.Vlaanderen.Basisregisters.Shaperon (>= 10.0.2)
Be.Vlaanderen.Basisregisters.GrAr.Import (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Import (21.14)
Autofac (>= 8.0)
Be.Vlaanderen.Basisregisters.AggregateSource.SqlStreamStore (>= 9.0.1)
Be.Vlaanderen.Basisregisters.CommandHandling (>= 9.0.1)
Expand All @@ -279,31 +279,31 @@ NUGET
Serilog (>= 3.1.1)
Serilog.Extensions.Logging (>= 8.0)
System.Threading.Tasks.Dataflow (>= 8.0)
Be.Vlaanderen.Basisregisters.GrAr.Legacy (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Legacy (21.14)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.14)
Be.Vlaanderen.Basisregisters.Utilities.Rfc3339DateTimeOffset (>= 4.0)
Newtonsoft.Json (>= 13.0.3)
Be.Vlaanderen.Basisregisters.GrAr.Notifications (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Notifications (21.14)
AWSSDK.SimpleNotificationService (>= 3.7.301.3)
System.Text.Json (>= 8.0.3)
Be.Vlaanderen.Basisregisters.GrAr.Oslo (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Oslo (21.14)
Be.Vlaanderen.Basisregisters.AspNetCore.Mvc.Formatters.Json (>= 5.0)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.14)
Be.Vlaanderen.Basisregisters.Utilities.Rfc3339DateTimeOffset (>= 4.0)
Microsoft.Extensions.Configuration (>= 8.0)
Microsoft.Extensions.Http.Polly (>= 8.0.3)
Newtonsoft.Json (>= 13.0.3)
Be.Vlaanderen.Basisregisters.GrAr.Provenance (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Provenance (21.14)
Be.Vlaanderen.Basisregisters.CommandHandling (>= 9.0.1)
Be.Vlaanderen.Basisregisters.Crab (>= 4.0)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.14)
Microsoft.CSharp (>= 4.7)
Be.Vlaanderen.Basisregisters.GrAr.Provenance.AcmIdm (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Provenance.AcmIdm (21.14)
Be.Vlaanderen.Basisregisters.Auth.AcmIdm (>= 2.0)
Be.Vlaanderen.Basisregisters.CommandHandling (>= 9.0.1)
Be.Vlaanderen.Basisregisters.Crab (>= 4.0)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Provenance (21.7)
Be.Vlaanderen.Basisregisters.GrAr.Common (21.14)
Be.Vlaanderen.Basisregisters.GrAr.Provenance (21.14)
Microsoft.CSharp (>= 4.7)
Be.Vlaanderen.Basisregisters.MessageHandling.AwsSqs.Simple (5.0.1)
AWSSDK.Core (>= 3.7.302.15)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,19 @@ await context
, ct);
});

When<AddressWasProposedForMunicipalityMerger>(async (context, message, ct) =>
{
await context
.AddressConsumerItems
.AddAsync(new AddressConsumerItem(
message.AddressPersistentLocalId,
AddressStatus.Proposed,
message.GeometryMethod,
message.GeometrySpecification,
ParsePosition(message.ExtendedWkbGeometry))
, ct);
});

When<AddressWasApproved>(async (context, message, ct) =>
{
var address = await context.AddressConsumerItems.FindAsync(message.AddressPersistentLocalId, cancellationToken: ct);
Expand Down Expand Up @@ -86,6 +99,12 @@ await context
address!.Status = AddressStatus.Rejected;
});

When<AddressWasRejectedBecauseOfMunicipalityMerger>(async (context, message, ct) =>
{
var address = await context.AddressConsumerItems.FindAsync(message.AddressPersistentLocalId, cancellationToken: ct);
address!.Status = AddressStatus.Rejected;
});

When<AddressWasRetiredV2>(async (context, message, ct) =>
{
var address = await context.AddressConsumerItems.FindAsync(message.AddressPersistentLocalId, cancellationToken: ct);
Expand All @@ -110,6 +129,12 @@ await context
address!.Status = AddressStatus.Retired;
});

When<AddressWasRetiredBecauseOfMunicipalityMerger>(async (context, message, ct) =>
{
var address = await context.AddressConsumerItems.FindAsync(message.AddressPersistentLocalId, cancellationToken: ct);
address!.Status = AddressStatus.Retired;
});

When<AddressWasRemovedBecauseStreetNameWasRemoved>(async (context, message, ct) =>
{
var address = await context.AddressConsumerItems.FindAsync(message.AddressPersistentLocalId, cancellationToken: ct);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,36 @@ await DetachBecauseRejected(
ct);
});

When<AddressWasRejectedBecauseOfMunicipalityMerger>(async (commandHandler, message, ct) =>
{
await using var backOfficeContext = await _backOfficeContextFactory.CreateDbContextAsync(ct);
var relations = backOfficeContext.ParcelAddressRelations
.AsNoTracking()
.Where(x => x.AddressPersistentLocalId == new AddressPersistentLocalId(message.AddressPersistentLocalId))
.ToList();

foreach (var relation in relations)
{
var command = new ReplaceParcelAddressBecauseOfMunicipalityMerger(
new ParcelId(relation.ParcelId),
new AddressPersistentLocalId(message.NewAddressPersistentLocalId),
new AddressPersistentLocalId(message.AddressPersistentLocalId),
FromProvenance(message.Provenance));

await commandHandler.Handle(command, ct);

await backOfficeContext.RemoveIdempotentParcelAddressRelation(
command.ParcelId,
command.PreviousAddressPersistentLocalId,
ct);

await backOfficeContext.AddIdempotentParcelAddressRelation(
command.ParcelId,
command.NewAddressPersistentLocalId,
ct);
}
});

When<AddressWasRetiredV2>(async (commandHandler, message, ct) =>
{
await DetachBecauseRetired(
Expand Down Expand Up @@ -135,6 +165,36 @@ await DetachBecauseRetired(
ct);
});

When<AddressWasRetiredBecauseOfMunicipalityMerger>(async (commandHandler, message, ct) =>
{
await using var backOfficeContext = await _backOfficeContextFactory.CreateDbContextAsync(ct);
var relations = backOfficeContext.ParcelAddressRelations
.AsNoTracking()
.Where(x => x.AddressPersistentLocalId == new AddressPersistentLocalId(message.AddressPersistentLocalId))
.ToList();

foreach (var relation in relations)
{
var command = new ReplaceParcelAddressBecauseOfMunicipalityMerger(
new ParcelId(relation.ParcelId),
new AddressPersistentLocalId(message.NewAddressPersistentLocalId),
new AddressPersistentLocalId(message.AddressPersistentLocalId),
FromProvenance(message.Provenance));

await commandHandler.Handle(command, ct);

await backOfficeContext.RemoveIdempotentParcelAddressRelation(
command.ParcelId,
command.PreviousAddressPersistentLocalId,
ct);

await backOfficeContext.AddIdempotentParcelAddressRelation(
command.ParcelId,
command.NewAddressPersistentLocalId,
ct);
}
});

When<AddressWasRemovedV2>(async (commandHandler, message, ct) =>
{
await DetachBecauseRemoved(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,20 @@ await snapshotManager.FindMatchingSnapshot(
ct);
});

When<Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore.Envelope<ParcelAddressWasReplacedBecauseOfMunicipalityMerger>>(async (_, message, ct) =>
{
await FindAndProduce(async () =>
await snapshotManager.FindMatchingSnapshot(
message.Message.CaPaKey,
message.Message.Provenance.Timestamp,
message.Message.GetHash(),
message.Position,
throwStaleWhenGone: false,
ct),
message.Position,
ct);
});

When<Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore.Envelope<ParcelAddressWasDetachedV2>>(async (_, message, ct) =>
{
await FindAndProduce(async () =>
Expand Down
3 changes: 3 additions & 0 deletions src/ParcelRegistry.Producer/Extensions/MessageExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ public static Contracts.ParcelWasRegistered ToContract(this Legacy.ParcelWasRegi
public static Contracts.ParcelAddressWasAttachedV2 ToContract(this ParcelAggregate.ParcelAddressWasAttachedV2 message) =>
new Contracts.ParcelAddressWasAttachedV2(message.ParcelId.ToString("D"), message.CaPaKey, message.AddressPersistentLocalId, message.Provenance.ToContract());

public static Contracts.ParcelAddressWasReplacedBecauseOfMunicipalityMerger ToContract(this ParcelAggregate.ParcelAddressWasReplacedBecauseOfMunicipalityMerger message) =>
new Contracts.ParcelAddressWasReplacedBecauseOfMunicipalityMerger(message.ParcelId.ToString("D"), message.CaPaKey, message.NewAddressPersistentLocalId, message.PreviousAddressPersistentLocalId, message.Provenance.ToContract());

public static Contracts.ParcelAddressWasDetachedV2 ToContract(this ParcelAggregate.ParcelAddressWasDetachedV2 message) =>
new Contracts.ParcelAddressWasDetachedV2(message.ParcelId.ToString("D"), message.CaPaKey, message.AddressPersistentLocalId, message.Provenance.ToContract());

Expand Down
5 changes: 5 additions & 0 deletions src/ParcelRegistry.Producer/ProducerMigrateProjections.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ public ProducerMigrateProjections(IProducer producer)
await Produce(message.Message.ParcelId, message.Message.ToContract(), message.Position, ct);
});

When<Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore.Envelope<Parcel.Events.ParcelAddressWasReplacedBecauseOfMunicipalityMerger>>(async (_, message, ct) =>
{
await Produce(message.Message.ParcelId, message.Message.ToContract(), message.Position, ct);
});

When<Be.Vlaanderen.Basisregisters.ProjectionHandling.SqlStreamStore.Envelope<Parcel.Events.ParcelAddressWasDetachedV2>>(async (_, message, ct) =>
{
await Produce(message.Message.ParcelId, message.Message.ToContract(), message.Position, ct);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,27 @@ await backOfficeContext.AddIdempotentParcelAddressRelation(
await backOfficeContext.SaveChangesAsync(cancellationToken);
});

When<Envelope<ParcelAddressWasReplacedBecauseOfMunicipalityMerger>>(async (_, message, cancellationToken) =>
{
await DelayProjection(message, delayInSeconds, cancellationToken);

await using var backOfficeContext = await backOfficeContextFactory.CreateDbContextAsync(cancellationToken);

await backOfficeContext.RemoveIdempotentParcelAddressRelation(
new ParcelId(message.Message.ParcelId),
new AddressPersistentLocalId(message.Message.PreviousAddressPersistentLocalId),
cancellationToken,
saveChanges: false);

await backOfficeContext.AddIdempotentParcelAddressRelation(
new ParcelId(message.Message.ParcelId),
new AddressPersistentLocalId(message.Message.NewAddressPersistentLocalId),
cancellationToken,
saveChanges: false);

await backOfficeContext.SaveChangesAsync(cancellationToken);
});

When<Envelope<ParcelAddressWasDetachedV2>>(async (_, message, cancellationToken) =>
{
await DelayProjection(message, delayInSeconds, cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,17 @@ await context.FindAndUpdateParcelExtract(
ct);
});

When<Envelope<ParcelAddressWasReplacedBecauseOfMunicipalityMerger>>(async (context, message, ct) =>
{
await context.FindAndUpdateParcelExtract(
message.Message.ParcelId,
parcel =>
{
UpdateVersie(parcel, message.Message.Provenance.Timestamp);
},
ct);
});

When<Envelope<ParcelAddressWasDetachedV2>>(async (context, message, ct) =>
{
await context.FindAndUpdateParcelExtract(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@ await context
}, ct);
});

When<Envelope<ParcelAddressWasReplacedBecauseOfMunicipalityMerger>>(async (context, message, ct) =>
{
await RemoveParcelLink(context, message.Message.ParcelId, message.Message.PreviousAddressPersistentLocalId, ct);
await AddParcelLink(context, message.Message.ParcelId, message.Message.CaPaKey, message.Message.NewAddressPersistentLocalId, ct);
});

When<Envelope<ParcelAddressWasDetachedV2>>(async (context, message, ct) =>
{
await RemoveParcelLink(context, message.Message.ParcelId, message.Message.AddressPersistentLocalId, ct);
Expand Down Expand Up @@ -135,26 +141,12 @@ await context
{
foreach (var addressPersistentLocalId in message.Message.DetachedAddressPersistentLocalIds)
{
var relation = await context
.ParcelLinkExtract
.FindAsync([message.Message.ParcelId, addressPersistentLocalId], ct);

if (relation is not null)
{
context.ParcelLinkExtract.Remove(relation);
}
await RemoveParcelLink(context, message.Message.ParcelId, addressPersistentLocalId, ct);
}

foreach (var addressPersistentLocalId in message.Message.AttachedAddressPersistentLocalIds)
{
var relation = await context
.ParcelLinkExtract
.FindAsync([message.Message.ParcelId, addressPersistentLocalId], ct);

if (relation is not null)
{
await context.ParcelLinkExtract.AddAsync(relation, ct);
}
await AddParcelLink(context, message.Message.ParcelId, message.Message.CaPaKey, addressPersistentLocalId, ct);
}
});
}
Expand All @@ -169,7 +161,41 @@ private static async Task RemoveParcelLink(
.ParcelLinkExtract
.FindAsync(new object?[] { parcelId, addressPersistentLocalId }, ct);

context.Remove(linkExtractItem!);
if (linkExtractItem is not null)
{
context.Remove(linkExtractItem);
}
}

private async Task AddParcelLink(
ExtractContext context,
Guid parcelId,
string caPaKey,
int addressPersistentLocalId,
CancellationToken ct)
{
var newAddress = await context
.ParcelLinkExtract
.FindAsync(new object?[] { parcelId, addressPersistentLocalId }, ct);

if (newAddress is null || context.Entry(newAddress).State == EntityState.Deleted)
{
await context
.ParcelLinkExtract
.AddAsync(new ParcelLinkExtractItem
{
ParcelId = parcelId,
CaPaKey = caPaKey,
AddressPersistentLocalId = addressPersistentLocalId,
Count = 1,
DbaseRecord = new ParcelLinkDbaseRecord
{
objecttype = { Value = ParcelObjectType },
adresobjid = { Value = caPaKey },
adresid = { Value = addressPersistentLocalId }
}.ToBytes(_encoding)
}, ct);
}
}
}
}
Loading
Loading