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: OR-1217 allow vereniging to be removed and block further updates #597

Merged
merged 2 commits into from
Jan 12, 2024
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 @@ -72,6 +72,16 @@ public async Task Project(IEvent<VerenigingWerdGestopt> verenigingWerdGestopt, I
ops.StoreObjects(docs);
}

public async Task Project(IEvent<VerenigingWerdVerwijderd> verenigingWerdVerwijderd, IDocumentOperations ops)
{
var docs = new List<object>();

docs.Add(await VerenigingDocumentProjector.Apply(verenigingWerdVerwijderd, ops));
docs.AddRange(await VerenigingenPerInszProjector.Apply(verenigingWerdVerwijderd, ops));

ops.StoreObjects(docs);
}

private static class VerenigingenPerInszProjector
{
public static async Task<List<VerenigingenPerInszDocument>> Apply(
Expand Down Expand Up @@ -183,6 +193,26 @@ public static async Task<List<VerenigingenPerInszDocument>> Apply(

return docs;
}

public static async Task<List<VerenigingenPerInszDocument>> Apply(
IEvent<VerenigingWerdVerwijderd> verenigingWerdVerwijderd,
IDocumentOperations ops)
{
var docs = new List<VerenigingenPerInszDocument>();
var documents = await ops.GetVerenigingenPerInszDocuments(verenigingWerdVerwijderd.StreamKey!);

foreach (var verenigingenPerInszDocument in documents)
{
verenigingenPerInszDocument.Verenigingen = verenigingenPerInszDocument.Verenigingen
.Where(v => v.VCode !=
verenigingWerdVerwijderd.StreamKey)
.ToList();

docs.Add(verenigingenPerInszDocument);
}

return docs;
}
}

private static class VerenigingDocumentProjector
Expand Down Expand Up @@ -220,5 +250,14 @@ public static async Task<VerenigingDocument> Apply(IEvent<VerenigingWerdGestopt>

return verenigingDocument;
}

public static async Task<VerenigingDocument> Apply(
IEvent<VerenigingWerdVerwijderd> verenigingWerdVerwijderd,
IDocumentOperations ops)
{
ops.Delete<VerenigingDocument>(verenigingWerdVerwijderd.StreamKey!);

return await ops.GetVerenigingDocument(verenigingWerdVerwijderd.StreamKey!);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
namespace AssociationRegistry.Acm.Schema.VerenigingenPerInsz;

using Marten.Metadata;
using Marten.Schema;

public class VerenigingDocument
public class VerenigingDocument: ISoftDeleted
{
[Identity]
public string VCode { get; set; } = null!;

public string Naam { get; set; } = null!;
public string Status { get; set; } = null!;
public string KboNummer { get; set; } = null!;
public bool Deleted { get; set; }
public DateTimeOffset? DeletedAt { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ await _client
q => q.Bool(
b => b.Must(
MatchOpNaam(naam),
IsNietGestopt
IsNietGestopt,
IsNietVerwijderd
)
.Filter(MatchOpPostcodeOfGemeente(gemeentes, postcodes)
)
Expand Down Expand Up @@ -70,6 +71,12 @@ private static QueryContainer IsNietGestopt(QueryContainerDescriptor<DuplicateDe
.Value(false));
}

private static QueryContainer IsNietVerwijderd(QueryContainerDescriptor<DuplicateDetectionDocument> descriptor)
{
return descriptor.Term(queryDescriptor => queryDescriptor.Field(document => document.IsVerwijderd)
.Value(false));
}

private static Func<QueryContainerDescriptor<DuplicateDetectionDocument>, QueryContainer> MatchOpPostcode(string[] postcodes)
{
return postalCodesQuery => postalCodesQuery
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
namespace AssociationRegistry.Admin.Api.Infrastructure;
namespace AssociationRegistry.Admin.Api.ProjectieBeheer;

using AssociationRegistry.Admin.Api.Infrastructure;
using AssociationRegistry.Admin.Api.Infrastructure.HttpClients;
using Be.Vlaanderen.Basisregisters.Api;
using HttpClients;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Net.Http;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ private static async Task<ISearchResponse<VerenigingZoekDocument>> Search(
boolQueryDescriptor => boolQueryDescriptor.Must(
queryContainerDescriptor => queryContainerDescriptor.QueryString(
queryStringQueryDescriptor => queryStringQueryDescriptor.Query(q)
)
),
descriptor => descriptor.Term(document => document.IsVerwijderd, false)
)
)
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace AssociationRegistry.Admin.Api.Verenigingen.Verwijderen.RequestModels;

using System.ComponentModel.DataAnnotations;
using System.Runtime.Serialization;

[DataContract]
public class VerwijderVerenigingRequest
{
/// <summary>
/// De reden waarom de vereniging verwijderd werd.
/// </summary>
[DataMember]
[Required]
public string Reden { get; set; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
namespace AssociationRegistry.Admin.Api.Verenigingen.Verwijder;

using Acties.VerwijderVereniging;
using Infrastructure.ConfigurationBindings;
using Infrastructure.Extensions;
using Infrastructure.Middleware;
using Framework;
using Vereniging;
using Be.Vlaanderen.Basisregisters.Api;
using FluentValidation;
using Infrastructure.Swagger.Annotations;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Verwijderen.RequestModels;
using Wolverine;

[ApiVersion("1.0")]
[AdvertiseApiVersions("1.0")]
[ApiRoute("verenigingen")]
[ApiExplorerSettings(IgnoreApi = true)]
[Authorize(Policy = Program.SuperAdminPolicyName)]
public class VerwijderVerenigingController : ApiController
{
private readonly IMessageBus _bus;
private readonly AppSettings _appsettings;
private readonly IValidator<VerwijderVerenigingRequest> _validator;

public VerwijderVerenigingController(IMessageBus bus, AppSettings appsettings, IValidator<VerwijderVerenigingRequest> validator)
{
_bus = bus;
_appsettings = appsettings;
_validator = validator;
}

[HttpDelete("{vCode}")]
[ConsumesJson]
[ProducesJson]
public async Task<IActionResult> Delete(
[FromBody] VerwijderVerenigingRequest? request,
[FromRoute] string vCode,
[FromServices] ICommandMetadataProvider metadataProvider)
{
await _validator.NullValidateAndThrowAsync(request);

var command = new VerwijderVerenigingCommand(VCode.Create(vCode), request.Reden);

var metaData = metadataProvider.GetMetadata();
var envelope = new CommandEnvelope<VerwijderVerenigingCommand>(command, metaData);
var stopResult = await _bus.InvokeAsync<CommandResult>(envelope);

if (!stopResult.HasChanges()) return Ok();

return this.AcceptedCommand(_appsettings, stopResult);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace AssociationRegistry.Admin.Api.Verenigingen.Verwijderen;

using FluentValidation;
using Infrastructure.Validation;
using RequestModels;

public class VerwijderVerenigingRequestValidator : AbstractValidator<VerwijderVerenigingRequest>
{
public VerwijderVerenigingRequestValidator()
{
this.RequireNotNullOrEmpty(request => request.Reden);

RuleFor(request => request.Reden).MustNotContainHtml();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Marten;
using Marten.Events;
using Marten.Events.Projections;
using Marten.Schema;
using Schema.Detail;

public class BeheerVerenigingDetailProjection : EventProjection
Expand Down Expand Up @@ -133,6 +134,14 @@
public async Task Project(IEvent<ContactgegevenUitKBOWerdGewijzigd> @event, IDocumentOperations ops)
=> await Update(@event, ops, BeheerVerenigingDetailProjector.Apply);

public async Task Project(IEvent<VerenigingWerdVerwijderd> @event, IDocumentOperations ops)
=> await SoftDelete(@event.StreamKey, ops);

private async Task SoftDelete(string? streamKey, IDocumentOperations ops)
{
ops.Delete<BeheerVerenigingDetailDocument>(streamKey);

Check warning on line 142 in src/AssociationRegistry.Admin.ProjectionHost/Projections/Detail/BeheerVerenigingDetailProjection.cs

View workflow job for this annotation

GitHub Actions / Run Tests (test/AssociationRegistry.Test.Admin.Api)

Possible null reference argument for parameter 'id' in 'void IDocumentOperations.Delete<BeheerVerenigingDetailDocument>(string id)'.
}

private static async Task Update<T>(
IEvent<T> @event,
IDocumentOperations ops,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,9 @@ public async Task Project(IEvent<VerenigingWerdGestopt> @event, IDocumentOperati
public async Task Project(IEvent<EinddatumWerdGewijzigd> @event, IDocumentOperations ops)
=> await Update(@event, ops, BeheerVerenigingHistoriekProjector.Apply);

public async Task Project(IEvent<VerenigingWerdVerwijderd> @event, IDocumentOperations ops)
=> await Update(@event, ops, BeheerVerenigingHistoriekProjector.Apply);

public async Task Project(
IEvent<VertegenwoordigerWerdOvergenomenUitKBO> vertegenwoordigerWerdOvergenomenUitKbo,
IDocumentOperations ops)
Expand All @@ -139,6 +142,7 @@ private static async Task Update<T>(
Action<IEvent<T>, BeheerVerenigingHistoriekDocument> action) where T : notnull
=> await Update(@event.StreamKey!, @event, ops, action);


private static async Task Update<T>(
string vCode,
IEvent<T> @event,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,7 @@ public class BeheerVerenigingHistoriekProjector
public static BeheerVerenigingHistoriekDocument Create(
IEvent<FeitelijkeVerenigingWerdGeregistreerd> feitelijkeVerenigingWerdGeregistreerd)
{
var beheerVerenigingHistoriekDocument = new BeheerVerenigingHistoriekDocument
{
VCode = feitelijkeVerenigingWerdGeregistreerd.Data.VCode,
Gebeurtenissen = new List<BeheerVerenigingHistoriekGebeurtenis>(),
Metadata = new Metadata(Sequence: 0, Version: 0),
};
var beheerVerenigingHistoriekDocument = CreateNewDocument(feitelijkeVerenigingWerdGeregistreerd.Data.VCode);

AddHistoriekEntry(
feitelijkeVerenigingWerdGeregistreerd,
Expand All @@ -34,12 +29,7 @@ public static BeheerVerenigingHistoriekDocument Create(
public static BeheerVerenigingHistoriekDocument Create(
IEvent<VerenigingMetRechtspersoonlijkheidWerdGeregistreerd> verenigingMetRechtspersoonlijkheidWerdGeregistreerd)
{
var beheerVerenigingHistoriekDocument = new BeheerVerenigingHistoriekDocument
{
VCode = verenigingMetRechtspersoonlijkheidWerdGeregistreerd.Data.VCode,
Gebeurtenissen = new List<BeheerVerenigingHistoriekGebeurtenis>(),
Metadata = new Metadata(Sequence: 0, Version: 0),
};
var beheerVerenigingHistoriekDocument = CreateNewDocument(verenigingMetRechtspersoonlijkheidWerdGeregistreerd.Data.VCode);

AddHistoriekEntry(
verenigingMetRechtspersoonlijkheidWerdGeregistreerd,
Expand Down Expand Up @@ -388,4 +378,23 @@ public static void UpdateMetadata(IEvent @event, BeheerVerenigingHistoriekDocume
{
document.Metadata = new Metadata(@event.Sequence, @event.Version);
}

public static void Apply(IEvent<VerenigingWerdVerwijderd> verenigingWerdVerwijderd, BeheerVerenigingHistoriekDocument document)
{
document.Gebeurtenissen = new List<BeheerVerenigingHistoriekGebeurtenis>();

AddHistoriekEntry(
verenigingWerdVerwijderd,
document,
"Deze vereniging werd verwijderd."
);
}

private static BeheerVerenigingHistoriekDocument CreateNewDocument(string vCode)
=> new()
{
VCode = vCode,
Gebeurtenissen = new List<BeheerVerenigingHistoriekGebeurtenis>(),
Metadata = new Metadata(Sequence: 0, Version: 0),
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public async Task Handle(EventEnvelope<FeitelijkeVerenigingWerdGeregistreerd> me
Locaties = message.Data.Locaties.Select(Map).ToArray(),
HoofdactiviteitVerenigingsloket = MapHoofdactiviteitVerenigingsloket(message.Data.HoofdactiviteitenVerenigingsloket),
IsGestopt = false,
IsVerwijderd = false,
}
);

Expand All @@ -39,6 +40,7 @@ public async Task Handle(EventEnvelope<VerenigingMetRechtspersoonlijkheidWerdGer
Locaties = Array.Empty<DuplicateDetectionDocument.Locatie>(),
HoofdactiviteitVerenigingsloket = Array.Empty<string>(),
IsGestopt = false,
IsVerwijderd = false,
}
);

Expand Down Expand Up @@ -87,6 +89,15 @@ public async Task Handle(EventEnvelope<VerenigingWerdGestopt> message)
}
);

public async Task Handle(EventEnvelope<VerenigingWerdVerwijderd> message)
=> await _elasticRepository.UpdateAsync(
message.VCode,
new DuplicateDetectionDocument
{
IsVerwijderd = true,
}
);

public async Task Handle(EventEnvelope<MaatschappelijkeZetelWerdOvergenomenUitKbo> message)
=> await _elasticRepository.AppendLocatie<DuplicateDetectionDocument>(message.VCode, Map(message.Data.Locatie));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -223,4 +223,14 @@ await _elasticRepository.UpdateAsync(
Status = VerenigingStatus.Gestopt,
});
}

public async Task Handle(EventEnvelope<VerenigingWerdVerwijderd> message)
{
await _elasticRepository.UpdateAsync(
message.VCode,
new VerenigingZoekDocument
{
IsVerwijderd = true,
});
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
namespace AssociationRegistry.Admin.Schema.Detail;

using Marten.Metadata;
using Marten.Schema;

public record Doelgroep
Expand All @@ -8,7 +9,7 @@ public record Doelgroep
public int Maximumleeftijd { get; init; }
}

public record BeheerVerenigingDetailDocument : IVCode, IMetadata
public record BeheerVerenigingDetailDocument : IVCode, ISoftDeleted, IMetadata
{
public string Naam { get; set; } = null!;
public VerenigingsType Verenigingstype { get; init; } = null!;
Expand Down Expand Up @@ -107,6 +108,9 @@ public record GerelateerdeVereniging
public string Naam { get; init; } = null!;
}
}

public bool Deleted { get; set; }
public DateTimeOffset? DeletedAt { get; set; }
}

public class AdresId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public record DuplicateDetectionDocument
public string KorteNaam { get; set; } = null!;
public string[] HoofdactiviteitVerenigingsloket { get; set; } = Array.Empty<string>();
public bool IsGestopt { get; set; }
public bool IsVerwijderd { get; set; }

public record Locatie : ILocatie
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ public static TypeMappingDescriptor<DuplicateDetectionDocument> Get(TypeMappingD
.Boolean(
propertyDescriptor => propertyDescriptor
.Name(document => document.IsGestopt))
.Boolean(
propertyDescriptor => propertyDescriptor
.Name(document => document.IsVerwijderd))
.Nested<DuplicateDetectionDocument.Locatie>(
propertyDescriptor => propertyDescriptor
.Name(document => document.Locaties)
Expand Down
Loading
Loading