Skip to content

Commit

Permalink
feat: or-1759 add naamwerdgewijzigd to publiek detail
Browse files Browse the repository at this point in the history
  • Loading branch information
QuintenGreenstack committed Nov 14, 2023
1 parent 45bd5fe commit 3902a7b
Show file tree
Hide file tree
Showing 10 changed files with 335 additions and 7 deletions.
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,22 @@ public async Task Handle(EventEnvelope<VerenigingMetRechtspersoonlijkheidWerdGer
);

public async Task Handle(EventEnvelope<NaamWerdGewijzigd> message)
=> await _elasticRepository.UpdateAsync(
{
await _elasticRepository.UpdateAsync(
message.Data.VCode,
new VerenigingZoekDocument
{
Naam = message.Data.Naam,
}
);
await _elasticRepository.UpdateNaamInRelaties(
new VerenigingZoekDocument
{
VCode = message.Data.VCode,
Naam = 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
Expand Up @@ -120,4 +120,56 @@ public async Task AppendRelatie(string id, Relatie relatie)
if (!response.IsValid)
throw new IndexDocumentFailed(response.DebugInformation);
}

public async Task UpdateNaamInRelaties(VerenigingZoekDocument documentToUpdate)
{
var matches = _elasticClient.Search<VerenigingZoekDocument>(descriptor => descriptor.Query(
q => q
.Nested(n => n
.Path(document => document.Relaties)
.Query(nq => nq
.Nested(n => n
.Path(doc => doc.Relaties.First()
.AndereVereniging)
.Query(nq2 => nq2
.Term(m => m
.Field(
doc => doc
.Relaties
.First()
.AndereVereniging
.VCode)
.Value(
documentToUpdate
.VCode)))))
)
));

var response = await _elasticClient.UpdateByQueryAsync<VerenigingZoekDocument>(
u => u
.Query(
q => q
.Nested(n => n
.Path(document => document.Relaties)
.Query(nq => nq
.Nested(n => n
.Path(doc => doc.Relaties.First().AndereVereniging)
.Query(nq2 => nq2
.Term(m => m
.Field(doc => doc.Relaties.First().AndereVereniging.VCode)
.Value(documentToUpdate.VCode)))))
)
)
.Script(s => s
.Source("for(r in ctx._source.relaties){" +
" if(r.andereVereniging.vCode == params.gewijzigdeVereniging.vCode){" +
" r.andereVereniging.naam = params.gewijzigdeVereniging.naam" +
" }" +
"}")
.Params(objects => objects.Add(key: "gewijzigdeVereniging", documentToUpdate)))
);

if (!response.IsValid)
throw new IndexDocumentFailed(response.DebugInformation);
}
}
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 UpdateNaamInRelaties(VerenigingZoekDocument documentToUpdate);
}
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,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

0 comments on commit 3902a7b

Please sign in to comment.