Skip to content

Commit

Permalink
feat: or-2335 implement retry mechanism for weigering dubbel
Browse files Browse the repository at this point in the history
  • Loading branch information
emalfroy committed Dec 24, 2024
1 parent 25a0d17 commit 43664bf
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,37 @@

using EventStore;
using Framework;
using Microsoft.Extensions.Logging;
using NodaTime;
using Notifications;
using Notifications.Messages;
using Polly;
using Vereniging;

public class VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(IVerenigingsRepository repository)
public class VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(
IVerenigingsRepository repository,
INotifier notifier,
ILogger<VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler> logger)
{
public async Task Handle(VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommand command, CancellationToken cancellationToken)
{
var retryCount = 4;

await Policy
.Handle<Exception>()
.WaitAndRetryAsync(
retryCount,
sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(x: 2, retryAttempt < retryCount ? retryAttempt : retryCount)),
onRetryAsync: async (exception, _) =>
{
logger.LogError(exception, $"{nameof(VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler)} failed");
await notifier.Notify(new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingGefaald(exception, command.VCode, command.VCodeAuthentiekeVereniging));

})
.ExecuteAsync(() => VerwerkWeigeringDubbelDoorAuthentiekeVereniging(command, cancellationToken));
}

private async Task VerwerkWeigeringDubbelDoorAuthentiekeVereniging(VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommand command, CancellationToken cancellationToken)
{
var vereniging = await repository.Load<Vereniging>(command.VCode, allowDubbeleVereniging:true, allowVerwijderdeVereniging:true);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
namespace AssociationRegistry.Notifications.Messages;

using Notifications;
using Vereniging;

public class VerwerkWeigeringDubbelDoorAuthentiekeVerenigingGefaald : IMessage
{
private readonly Exception _exception;
private readonly VCode _vCode;
private readonly VCode _authentiekeVerenging;

public VerwerkWeigeringDubbelDoorAuthentiekeVerenigingGefaald(Exception exception, VCode vCode, VCode authentiekeVerenging)
{
_exception = exception;
_vCode = vCode;
_authentiekeVerenging = authentiekeVerenging;
}

public string Value => $"Dubbel ({_vCode}) werd geweigerd door authentieke vereniging({_authentiekeVerenging}): {_exception.Message}.";
public NotifyType Type => NotifyType.Failure;
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
namespace AssociationRegistry.Test.Dubbels.When_Verwerk_Weigering_Dubbel_Door_Authentieke_Vereniging;

using AssociationRegistry.Acties.VerwerkWeigeringDubbelDoorAuthentiekeVereniging;
using AssociationRegistry.Events;
using AssociationRegistry.Test.Common.Framework;
using AssociationRegistry.Test.Common.Scenarios.CommandHandling;
using Acties.VerwerkWeigeringDubbelDoorAuthentiekeVereniging;
using Common.Framework;
using Common.Scenarios.CommandHandling;
using Events;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using Notifications;
using Vereniging;
using Xunit;

Expand All @@ -20,7 +23,10 @@ public async Task Then_WeigeringDubbelDoorAuthentiekeVerenigingWerdVerwerkt_Even
VCode: scenario.VCode,
VCodeAuthentiekeVereniging: vCodeAuthentiekeVereniging);

var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(repositoryMock);
var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(
repositoryMock,
Mock.Of<INotifier>(),
new NullLogger<VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler>());

await sut.Handle(command, CancellationToken.None);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ namespace AssociationRegistry.Test.Dubbels.When_Verwerk_Weigering_Dubbel_Door_Au
using Common.Framework;
using Common.Scenarios.CommandHandling;
using Events;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using Notifications;
using Vereniging;
using Xunit;

Expand All @@ -21,7 +23,10 @@ public async Task Then_WeigeringDubbelDoorAuthentiekeVerenigingWerdVerwerkt_Even
VCode: scenario.VCode,
VCodeAuthentiekeVereniging: vCodeAuthentiekeVereniging);

var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(repositoryMock);
var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(
repositoryMock,
Mock.Of<INotifier>(),
new NullLogger<VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler>());

await sut.Handle(command, CancellationToken.None);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
namespace AssociationRegistry.Test.Dubbels.When_Verwerk_Weigering_Dubbel_Door_Authentieke_Vereniging;

using Acties.VerwerkWeigeringDubbelDoorAuthentiekeVereniging;
using Common.Scenarios.CommandHandling;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using Notifications;
using Notifications.Messages;
using Vereniging;
using Xunit;

public class Given_An_Exception
{
[Fact]
public async Task Then_It_Retries()
{
var scenario = new VerenigingWerdGemarkeerdAlsDubbelVanScenario();
var repositoryMock = new Mock<IVerenigingsRepository>();
var notifier = new Mock<INotifier>();
var vCodeAuthentiekeVereniging = VCode.Create(scenario.VerenigingWerdGemarkeerdAlsDubbelVan.VCodeAuthentiekeVereniging);

var command = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommand(
VCode: scenario.VCode,
VCodeAuthentiekeVereniging: vCodeAuthentiekeVereniging);

var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(
repositoryMock.Object,
notifier.Object,
new NullLogger<VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler>());

// ignore the assert throw, only interested in the veryfies
await Assert.ThrowsAsync<NullReferenceException>(async () => await sut.Handle(command, CancellationToken.None));

repositoryMock.Verify(x => x.Load<Vereniging>(It.IsAny<VCode>(), It.IsAny<int?>(), true, true), times: Times.Exactly(5));
notifier.Verify(x => x.Notify(It.IsAny<VerwerkWeigeringDubbelDoorAuthentiekeVerenigingGefaald>()), times: Times.Exactly(4));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ namespace AssociationRegistry.Test.Dubbels.When_Verwerk_Weigering_Dubbel_Door_Au
using Common.AutoFixture;
using Common.Framework;
using Common.Scenarios.CommandHandling;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using Notifications;
using Vereniging;
using Xunit;

Expand All @@ -19,7 +22,10 @@ public async Task Then_WeigeringDubbelDoorAuthentiekeVerenigingWerdVerwerkt_Even

var command = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommand(VCode: scenario.VCode, fixture.Create<VCode>());

var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(repositoryMock);
var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(
repositoryMock,
Mock.Of<INotifier>(),
new NullLogger<VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler>());

await sut.Handle(command, CancellationToken.None);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ namespace AssociationRegistry.Test.Dubbels.When_Verwerk_Weigering_Dubbel_Door_Au
using Common.AutoFixture;
using Common.Framework;
using Common.Scenarios.CommandHandling;
using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using Notifications;
using Vereniging;
using Xunit;

Expand All @@ -18,7 +21,10 @@ public async Task Then_ShouldNotHaveAnySaves()
var repositoryMock = new VerenigingRepositoryMock(scenario.GetVerenigingState());
var command = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommand(VCode: scenario.VCode, fixture.Create<VCode>());

var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(repositoryMock);
var sut = new VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler(
repositoryMock,
Mock.Of<INotifier>(),
new NullLogger<VerwerkWeigeringDubbelDoorAuthentiekeVerenigingCommandHandler>());

await sut.Handle(command, CancellationToken.None);

Expand Down

0 comments on commit 43664bf

Please sign in to comment.