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

Or 1759 #550

Merged
merged 4 commits into from
Nov 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@ await Update(@event.Data.Moedervereniging.VCode, @event, ops,
public async Task Project(IEvent<NaamWerdGewijzigd> @event, IDocumentOperations ops)
{
var updateDocs = Enumerable.Empty<BeheerVerenigingDetailDocument>().ToList();
var afdeling = (await ops.LoadAsync<BeheerVerenigingDetailDocument>(@event.StreamKey!))!;
var vereniging = (await ops.LoadAsync<BeheerVerenigingDetailDocument>(@event.StreamKey!))!;

var gerelateerdeVerenigingen = ops.Query<BeheerVerenigingDetailDocument>()
.Where(d => d.Relaties.Any(r => r.AndereVereniging.VCode == afdeling.VCode))
.Where(d => d.Relaties.Any(r => r.AndereVereniging.VCode == vereniging.VCode))
.ToList();

foreach (var gerelateerdeVereniging in gerelateerdeVerenigingen)
Expand All @@ -61,9 +61,9 @@ public async Task Project(IEvent<NaamWerdGewijzigd> @event, IDocumentOperations
updateDocs.Add(gerelateerdeVereniging);
}

BeheerVerenigingDetailProjector.Apply(@event, afdeling);
BeheerVerenigingDetailProjector.UpdateMetadata(@event, afdeling);
updateDocs.Add(afdeling);
BeheerVerenigingDetailProjector.Apply(@event, vereniging);
BeheerVerenigingDetailProjector.UpdateMetadata(@event, vereniging);
updateDocs.Add(vereniging);
ops.StoreObjects(updateDocs);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
namespace AssociationRegistry.Public.ProjectionHost.Infrastructure.Extensions;

public static class IEnumerableExtensions
{
public static IEnumerable<T> UpdateSingle<T>(this IEnumerable<T> collection, Func<T, bool> identityFunc, Func<T, T> update)
{
var array = collection as T[] ?? collection.ToArray();
var objectToUpdate = array.Single(identityFunc);
var updatedObject = update(objectToUpdate);
return array
.Where(t1 => !identityFunc(t1))
.Append(updatedObject);
}

public static IEnumerable<T> UpdateSingleWith<T>(this IEnumerable<T> collection, Func<T, bool> identityFunc, Func<T, T> update)
{
var array = collection as T[] ?? collection.ToArray();
var objectToUpdate = array.Single(identityFunc);
var updatedObject = update(objectToUpdate);
return array
.Where(t1 => !identityFunc(t1))
.Append(updatedObject);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
namespace AssociationRegistry.Public.ProjectionHost.Projections.Detail;

using Events;
using Infrastructure.Extensions;
using Marten;
using Marten.Events;
using Marten.Events.Projections;
Expand Down Expand Up @@ -35,7 +36,39 @@ await Update(@event.Data.Moedervereniging.VCode, @event, ops,
}

public async Task Project(IEvent<NaamWerdGewijzigd> @event, IDocumentOperations ops)
=> await Update(@event, ops, PubliekVerenigingDetailProjector.Apply);
{
var updateDocs = Enumerable.Empty<PubliekVerenigingDetailDocument>().ToList();
var vereniging = (await ops.LoadAsync<PubliekVerenigingDetailDocument>(@event.StreamKey!))!;

var gerelateerdeVerenigingen = ops.Query<PubliekVerenigingDetailDocument>()
.Where(d => d.Relaties.Any(r => r.AndereVereniging.VCode == vereniging.VCode))
.ToList();

foreach (var gerelateerdeVereniging in gerelateerdeVerenigingen)
{
gerelateerdeVereniging.Relaties = gerelateerdeVereniging.Relaties
.UpdateSingle(
identityFunc: relatie
=> relatie.AndereVereniging.VCode == @event.Data.VCode,
update: r =>
{
r.AndereVereniging.Naam = @event.Data.Naam;

return r;
})
.ToArray();

PubliekVerenigingDetailProjector.UpdateMetadata(@event, gerelateerdeVereniging);
updateDocs.Add(gerelateerdeVereniging);
}


PubliekVerenigingDetailProjector.Apply(@event, vereniging);
PubliekVerenigingDetailProjector.UpdateMetadata(@event, vereniging);

updateDocs.Add(vereniging);
ops.StoreObjects(updateDocs);
}

public async Task Project(IEvent<RoepnaamWerdGewijzigd> @event, IDocumentOperations ops)
=> await Update(@event, ops, PubliekVerenigingDetailProjector.Apply);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,13 +136,9 @@ public async Task Handle(EventEnvelope<VerenigingMetRechtspersoonlijkheidWerdGer
);

public async Task Handle(EventEnvelope<NaamWerdGewijzigd> message)
=> await _elasticRepository.UpdateAsync(
message.Data.VCode,
new VerenigingZoekDocument
{
Naam = message.Data.Naam,
}
);
{
await _elasticRepository.WijzigNaamAfdeling(message.VCode, message.Data.Naam);
}

public async Task Handle(EventEnvelope<RoepnaamWerdGewijzigd> message)
=> await _elasticRepository.UpdateAsync(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
namespace AssociationRegistry.Public.ProjectionHost.Projections.Search;

using Elasticsearch.Net;
using Nest;
using Schema.Search;
using Vereniging;

public class ElasticRepository : IElasticRepository
{
Expand Down Expand Up @@ -120,4 +122,41 @@ public async Task AppendRelatie(string id, Relatie relatie)
if (!response.IsValid)
throw new IndexDocumentFailed(response.DebugInformation);
}
public async Task WijzigNaamAfdeling(string vCode, string nieuweNaam)
{
var afdeling = _elasticClient.Get<VerenigingZoekDocument>(vCode);

if (afdeling.Source.Type.Code == Verenigingstype.Afdeling.Code)
{
var bulkResponse = await _elasticClient.BulkAsync(b => b
// Update the Association's name and perform version check
.Update<VerenigingZoekDocument>(u => u
.Id(vCode)
.IfSequenceNumber(afdeling.SequenceNumber)
.IfPrimaryTerm(afdeling.PrimaryTerm)
.Doc(new VerenigingZoekDocument
{ Naam = nieuweNaam }))
// Update the Mother Association's relation's name and perform version check
.Update<VerenigingZoekDocument>(u => u
.Id(afdeling.Source.Relaties.First().AndereVereniging.VCode)
.ScriptedUpsert()
.Script(s => s
.Source(
"for (relatie in ctx._source.relaties) { if (relatie.andereVereniging.vCode == params.associationId) { relatie.andereVereniging.naam = params.newName; } }")
.Params(p => p
.Add(key: "newName", nieuweNaam)
.Add(key: "associationId", vCode))))
.Refresh(Refresh.True));
}
else
{
await UpdateAsync(
vCode,
new VerenigingZoekDocument
{
Naam = nieuweNaam,
}
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ Task IndexAsync<TDocument>(TDocument document)
Task UpdateLocatie(string id, VerenigingZoekDocument.Locatie locatie);
Task Remove(string id);
Task AppendRelatie(string id, Relatie relatie);
Task WijzigNaamAfdeling(string vCode, string nieuweNaam);
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public class GivenEventsFixture : PublicApiFixture
public readonly V015_VerenigingMetRechtspersoonlijkheidWerdGeregistreerd_With_WijzigBasisgegevens V015VerenigingMetRechtspersoonlijkheidWerdGeregistreerdWithWijzigBasisgegevens = new();
public readonly V016_VerenigingWerdGestopt V016VerenigingWerdGestopt = new();
public readonly V017_VerenigingMetRechtspersoonlijkheidWerdGeregistreerd_With_WijzigMaatschappelijkeZetel_Scenario V017VerenigingMetRechtspersoonlijkheidWerdGeregistreerdWithWijzigMaatschappelijkeZetelScenario = new();
public readonly V018_AfdelingWerdGeregistreerd_MetBestaandeMoeder_VoorNaamWerdGewijzigd V018AfdelingWerdGeregistreerdMetBestaandeMoederVoorNaamWerdGewijzigd = new();

private IEnumerable<IScenario> Scenarios
=> new IScenario[]
Expand All @@ -40,8 +41,10 @@ private IEnumerable<IScenario> Scenarios
V015VerenigingMetRechtspersoonlijkheidWerdGeregistreerdWithWijzigBasisgegevens,
V016VerenigingWerdGestopt,
V017VerenigingMetRechtspersoonlijkheidWerdGeregistreerdWithWijzigMaatschappelijkeZetelScenario,
V018AfdelingWerdGeregistreerdMetBestaandeMoederVoorNaamWerdGewijzigd,
};


public override async Task InitializeAsync()
{
foreach (var scenario in Scenarios)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
namespace AssociationRegistry.Test.Public.Api.Fixtures.GivenEvents.Scenarios;

using AssociationRegistry.Framework;
using AutoFixture;
using Events;
using EventStore;
using Framework;
using Vereniging;

public class V018_AfdelingWerdGeregistreerd_MetBestaandeMoeder_VoorNaamWerdGewijzigd : IScenario
{
public readonly VerenigingMetRechtspersoonlijkheidWerdGeregistreerd MoederWerdGeregistreerd;
public readonly AfdelingWerdGeregistreerd AfdelingWerdGeregistreerd;
public readonly NaamWerdGewijzigd NaamWerdGewijzigd;
public readonly CommandMetadata Metadata;

public V018_AfdelingWerdGeregistreerd_MetBestaandeMoeder_VoorNaamWerdGewijzigd()
{
var fixture = new Fixture().CustomizePublicApi();

VCodeMoeder = "V9999018";
NaamMoeder = "De coolste moeder";

VCode = VCode.Create("V9999019");
NaamAfdeling = "De coolste afdeling";

MoederWerdGeregistreerd = fixture.Create<VerenigingMetRechtspersoonlijkheidWerdGeregistreerd>() with
{
VCode = VCodeMoeder,
Naam = NaamMoeder,
Rechtsvorm = "SVON"
};

KboNummerMoeder = MoederWerdGeregistreerd.KboNummer;

AfdelingWerdGeregistreerd = fixture.Create<AfdelingWerdGeregistreerd>() with
{
VCode = VCode,
Moedervereniging = new AfdelingWerdGeregistreerd.MoederverenigingsData(KboNummerMoeder, VCodeMoeder, NaamMoeder),
Locaties = Array.Empty<Registratiedata.Locatie>(),
Naam = "De minder coole afdeling",
KorteNaam = string.Empty,
Startdatum = null,
KorteBeschrijving = string.Empty,
Contactgegevens = Array.Empty<Registratiedata.Contactgegeven>(),
Vertegenwoordigers = Array.Empty<Registratiedata.Vertegenwoordiger>(),
HoofdactiviteitenVerenigingsloket = Array.Empty<Registratiedata.HoofdactiviteitVerenigingsloket>(),
};

NaamWerdGewijzigd = fixture.Create<NaamWerdGewijzigd>() with
{
VCode = VCode,
Naam = NaamAfdeling
};

Metadata = fixture.Create<CommandMetadata>() with { ExpectedVersion = null };
}

public string KboNummerMoeder { get; set; }
public string NaamMoeder { get; set; }
public string NaamAfdeling { get; set; }
public string VCodeMoeder { get; set; }
public VCode VCode { get; set; }
public StreamActionResult Result { get; set; } = null!;

public IEvent[] GetEvents()
=> new IEvent[]
{ MoederWerdGeregistreerd, AfdelingWerdGeregistreerd, NaamWerdGewijzigd };

public CommandMetadata GetCommandMetadata()
=> Metadata;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace AssociationRegistry.Test.Public.Api.Framework;

public class CaseSensitiveComparer : IComparer<string>
{
public int Compare(string? x, string? y)
=> string.Compare(x, y, StringComparison.Ordinal);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
namespace AssociationRegistry.Test.Public.Api.When_Retrieving_Detail;

using Fixtures;
using Fixtures.GivenEvents;
using Fixtures.GivenEvents.Scenarios;
using FluentAssertions;
using Microsoft.Net.Http.Headers;
using System.Net;
using templates;
using Test.Framework;
using Xunit;
using Xunit.Categories;

[Collection(nameof(PublicApiCollection))]
[Category("AdminApi")]
[IntegrationTest]
public class Given_MoederWerdGeregistreerd_And_Then_AfdelingWerdGeregistreerd_AndThen_NaamWerdGewijzigd
{
private readonly PublicApiClient _apiClient;
private readonly V018_AfdelingWerdGeregistreerd_MetBestaandeMoeder_VoorNaamWerdGewijzigd _scenario;

public Given_MoederWerdGeregistreerd_And_Then_AfdelingWerdGeregistreerd_AndThen_NaamWerdGewijzigd(GivenEventsFixture fixture)
{
_scenario = fixture.V018AfdelingWerdGeregistreerdMetBestaandeMoederVoorNaamWerdGewijzigd;
_apiClient = fixture.PublicApiClient;
}

[Fact]
public async Task Then_we_get_a_successful_response_if_sequence_is_equal_or_greater_than_expected_sequence()
=> (await _apiClient.GetDetail(_scenario.VCode))
.Should().BeSuccessful();

[Fact]
public async Task Then_we_get_a_successful_response_if_no_sequence_provided()
=> (await _apiClient.GetDetail(_scenario.VCode))
.Should().BeSuccessful();


[Fact]
public async Task Then_we_get_a_detail_afdeling_response()
{
var response = await _apiClient.GetDetail(_scenario.VCode);
var content = await response.Content.ReadAsStringAsync();

var expected = new DetailVerenigingResponseTemplate()
.FromEvent(_scenario.AfdelingWerdGeregistreerd)
.WithNaam(_scenario.NaamWerdGewijzigd.Naam)
.WithDatumLaatsteAanpassing(_scenario.Metadata.Tijdstip);

content.Should().BeEquivalentJson(expected);
}

[Fact]
public async Task Then_we_get_a_detail_moeder_response()
{
var response = await _apiClient.GetDetail(_scenario.MoederWerdGeregistreerd.VCode);

var content = await response.Content.ReadAsStringAsync();

var expected = new DetailVerenigingResponseTemplate()
.FromEvent(_scenario.MoederWerdGeregistreerd)
.WithDatumLaatsteAanpassing(_scenario.Metadata.Tijdstip)
.HeeftAfdeling(_scenario.AfdelingWerdGeregistreerd.VCode, _scenario.NaamWerdGewijzigd.Naam);

content.Should().BeEquivalentJson(expected);
}
}
Loading
Loading