Skip to content

Commit

Permalink
feat: OR-1217 allow vereniging to be removed and block further updates
Browse files Browse the repository at this point in the history
  • Loading branch information
Jan Lesage authored and janlesage committed Jan 12, 2024
1 parent e12198d commit ba71ce6
Show file tree
Hide file tree
Showing 64 changed files with 1,941 additions and 176 deletions.
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<VertegenwoordigerWerdOvergenomenUitKBO> @event,
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);
}

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

0 comments on commit ba71ce6

Please sign in to comment.