diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/status/StatusService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/status/StatusService.java index a87a9901cf0418b8a55306b51c878b4902800888..055826fd9d9598f5f9abcd34f1df4ea0e51ce8c4 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/status/StatusService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/status/StatusService.java @@ -29,7 +29,6 @@ import java.util.Objects; import java.util.Optional; import org.apache.commons.collections4.MapUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; @@ -41,18 +40,17 @@ import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.vorgang.command.PersistedCommand; import de.ozgcloud.vorgang.vorgang.Vorgang; import de.ozgcloud.vorgang.vorgang.Vorgang.Status; +import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Service +@RequiredArgsConstructor @Log4j2 public class StatusService { private static final String CONCURRENT_MODIFICATION_ERROR_CODE = "concurrent_modification"; - @Autowired - private ApplicationEventPublisher publisher; - - @Autowired - private StatusRepository repository; + private final ApplicationEventPublisher publisher; + private final StatusRepository repository; void setStatusNeu(Command command) { executeStatusChangeCommand(command, Status.NEU); @@ -100,6 +98,10 @@ public class StatusService { doUpdateStatus(vorgangId, version, Status.IN_BEARBEITUNG.name()); } + public void setStatusToWeitergeleitet(String vorgangId, long version) { + doUpdateStatus(vorgangId, version, Status.WEITERGELEITET.name()); + } + public void revokeStatusChange(Command command) { try { doUpdateStatus(command.getRelationId(), command.getRelationVersion() + 1, diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Lock.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Lock.java index 336a0335d93e27f781b0e1e119f9adbd383cdbe6..51060326c1bad411cfa98d93886bdf33576c7d8e 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Lock.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/Lock.java @@ -29,7 +29,7 @@ import jakarta.validation.constraints.NotNull; import lombok.Builder; import lombok.Getter; -@Builder +@Builder(toBuilder = true) @Getter public class Lock { diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/LockMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/LockMapper.java index c94e7b76508223828c076c1873e39386a1972a99..668cccff498c4a5d312783623ae8bd9ce7989237 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/LockMapper.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/LockMapper.java @@ -35,7 +35,7 @@ import org.mapstruct.Mapping; import de.ozgcloud.command.Command; @Mapper -interface LockMapper { +public interface LockMapper { @Mapping(target = "clientName", source = "createdByClientName") @Mapping(target = "lockedSince", expression = "java(getLockedSince())") diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListener.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListener.java index 7f25cf25bf14f9ed44eee288bb9fdda44f43c90a..b8aab024e7464c3371e9647b506f58611d0d0f95 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListener.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListener.java @@ -33,10 +33,13 @@ import org.springframework.stereotype.Component; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandCreatedEvent; import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.command.VorgangLockedEvent; import de.ozgcloud.nachrichten.email.MailSendErrorEvent; import de.ozgcloud.nachrichten.email.MailSendRequest; import de.ozgcloud.nachrichten.email.MailSentEvent; import de.ozgcloud.vorgang.command.Order; +import de.ozgcloud.vorgang.vorgang.LockMapper; +import de.ozgcloud.vorgang.vorgang.VorgangService; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -60,6 +63,8 @@ public class ForwardingEventListener { private final ForwardingService service; private final ApplicationEventPublisher publisher; private final ForwardingRequestMapper forwardingRequestMapper; + private final VorgangService vorgangService; + private final LockMapper lockMapper; @EventListener(condition = IS_FORWARD_ORDER_CONDITION) public void onForwardOrder(CommandCreatedEvent event) { @@ -92,7 +97,14 @@ public class ForwardingEventListener { @EventListener(condition = IS_FORWARD_VORGANG_ORDER_CONDITION) public void onForwardVorgangOrder(CommandCreatedEvent event) { + lockVorgangOnForwarding(event.getSource()); service.forward(forwardingRequestMapper.fromCommand(event.getSource())); + publisher.publishEvent(new VorgangLockedEvent(event.getSource())); + } + + private void lockVorgangOnForwarding(Command command) { + var lock = lockMapper.fromCommand(command).toBuilder().reason("Vorgang is being forwarded").build(); + vorgangService.lockVorgang(lock, command.getVorgangId(), command.getRelationVersion()); } private void handleException(Runnable runnable, String commandId) { diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingService.java index a38f6fcf7b6ea3d663ba5e097f8675e6a64bfd77..ed26c9e9850a1361531b70b36699b5ca92c08596 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingService.java @@ -331,6 +331,6 @@ public class ForwardingService { } public void forward(ForwardingRequest request) { - + statusService.setStatusToWeitergeleitet(request.getVorgangId(), request.getVersion()); } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusServiceTest.java index 17e4694ec99c33cd92c2a8f61a07e36d3d26045e..eb96cbe9536c70f7a2a5ced05407b3c311d4d840 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/status/StatusServiceTest.java @@ -39,6 +39,8 @@ import org.mockito.Mock; import org.mockito.Spy; import org.springframework.context.ApplicationEventPublisher; +import com.thedeanda.lorem.LoremIpsum; + import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandFailedEvent; import de.ozgcloud.command.CommandRevokedEvent; @@ -52,18 +54,17 @@ import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; class StatusServiceTest { + @Spy + @InjectMocks + private StatusService service; + @Mock + private StatusRepository repository; + @Mock + private ApplicationEventPublisher publisher; + @DisplayName("Test handling vorgang status changes") @Nested class TestVorgangStatusChanges { - @Spy - @InjectMocks - private StatusService service; - - @Mock - private StatusRepository repository; - - @Mock - private ApplicationEventPublisher publisher; private PersistedCommand command = CommandTestFactory.create(); @@ -261,15 +262,6 @@ class StatusServiceTest { @DisplayName("Test status changes when a Vorgang is forwarded") @Nested class TestVorgangWeiterleiten { - @Spy - @InjectMocks - private StatusService service; - - @Mock - private StatusRepository repository; - - @Mock - private ApplicationEventPublisher publisher; @Mock private PersistedCommand command; @@ -299,15 +291,6 @@ class StatusServiceTest { @DisplayName("Test handling revoke command status changes") @Nested class TestRevokeStatusChanges { - @Spy - @InjectMocks - private StatusService service; - - @Mock - private StatusRepository repository; - - @Mock - private ApplicationEventPublisher publisher; private static final String PREVIOUS_STATUS = Vorgang.Status.BESCHIEDEN.name(); private PersistedCommand command = CommandTestFactory.createBuilder() @@ -381,4 +364,28 @@ class StatusServiceTest { } } } + + @Nested + class TestSetStatusToWeitergeleitet { + + @Test + void shouldUpdateStatus() { + service.setStatusToWeitergeleitet(VorgangTestFactory.ID, VorgangTestFactory.VERSION); + + verify(service).doUpdateStatus(VorgangTestFactory.ID, VorgangTestFactory.VERSION, Status.WEITERGELEITET.name()); + } + } + + @Nested + class TestDoUpdateStatus { + + @Test + void shouldPatchVorgangWithNewStatus() { + var statusName = LoremIpsum.getInstance().getWords(1); + + service.doUpdateStatus(VorgangTestFactory.ID, VorgangTestFactory.VERSION, statusName); + + verify(repository).patch(VorgangTestFactory.ID, VorgangTestFactory.VERSION, Map.of(Vorgang.MONGODB_FIELDNAME_STATUS, statusName)); + } + } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerTest.java index dc3152d7860268d0c1554f4bdfb1127363718722..68c76516d74789d6b7dd2a287e39f6fd6a89767b 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/VorgangEventListenerTest.java @@ -269,7 +269,7 @@ class VorgangEventListenerTest { } @Test - void shouldCallPublishEvent() { + void shouldPublishVorgangLockedEvent() { onLockVorgang(); verify(publisher).publishEvent(lockedEventCaptor.capture()); diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListenerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListenerTest.java index 364aa21a99328cbf1050ff04a39b7883ad0c6535..4ca29c2ac342679a09903dba8d8855699d7bdd1a 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListenerTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingEventListenerTest.java @@ -44,10 +44,16 @@ import com.thedeanda.lorem.LoremIpsum; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandCreatedEvent; import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.command.VorgangLockedEvent; import de.ozgcloud.nachrichten.email.MailSentEventTestFactory; import de.ozgcloud.vorgang.command.CommandCreatedEventTestFactory; import de.ozgcloud.vorgang.command.CommandTestFactory; import de.ozgcloud.vorgang.command.Order; +import de.ozgcloud.vorgang.vorgang.Lock; +import de.ozgcloud.vorgang.vorgang.LockMapper; +import de.ozgcloud.vorgang.vorgang.LockTestFactory; +import de.ozgcloud.vorgang.vorgang.VorgangService; +import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; class ForwardingEventListenerTest { @@ -60,6 +66,10 @@ class ForwardingEventListenerTest { private ApplicationEventPublisher publisher; @Mock private ForwardingRequestMapper forwardingRequestMapper; + @Mock + private VorgangService vorgangService; + @Mock + private LockMapper lockMapper; @Nested class OnForwardOrderCommand { @@ -74,9 +84,9 @@ class ForwardingEventListenerTest { @Test void shouldPublishFailedEventOnError() { when(forwardingService.forwardByCommand(any())).thenThrow(ConcurrentModificationException.class); - + listener.onForwardOrder(CommandCreatedEventTestFactory.create()); - + verify(publisher).publishEvent(any(CommandFailedEvent.class)); } } @@ -99,29 +109,63 @@ class ForwardingEventListenerTest { class TestOnForwardVorgangOrder { private final CommandCreatedEvent event = event(); + private final Lock lock = LockTestFactory.create(); + @Captor + private ArgumentCaptor<Lock> lockCaptor; @Captor private ArgumentCaptor<ForwardingRequest> forwardingRequestCaptor; + @Captor + private ArgumentCaptor<VorgangLockedEvent> lockedEventCaptor; @BeforeEach void init() { - when(forwardingRequestMapper.fromCommand(event.getSource())).thenReturn(ForwardingRequestTestFactory.create()); + when(forwardingRequestMapper.fromCommand(any())).thenReturn(ForwardingRequestTestFactory.create()); + when(lockMapper.fromCommand(any())).thenReturn(lock); + } + + @Test + void shouldMapLock() { + onForwardVorgangOrder(); + + verify(lockMapper).fromCommand(event.getSource()); + } + + @Test + void shouldLockVorgang() { + onForwardVorgangOrder(); + + verify(vorgangService).lockVorgang(lockCaptor.capture(), eq(VorgangTestFactory.ID), eq(CommandTestFactory.RELATION_VERSION)); + assertThat(lockCaptor.getValue()).usingRecursiveComparison() + .isEqualTo(LockTestFactory.createBuilder().reason("Vorgang is being forwarded").build()); } @Test void shouldMapCommandForwardingRequest() { - listener.onForwardVorgangOrder(event); + onForwardVorgangOrder(); verify(forwardingRequestMapper).fromCommand(event.getSource()); } @Test void shouldCallForwardingService() { - listener.onForwardVorgangOrder(event); + onForwardVorgangOrder(); verify(forwardingService).forward(forwardingRequestCaptor.capture()); assertThat(forwardingRequestCaptor.getValue()).usingRecursiveComparison().isEqualTo(ForwardingRequestTestFactory.create()); } + @Test + void shouldPublishVorgangLockedEvent() { + onForwardVorgangOrder(); + + verify(publisher).publishEvent(lockedEventCaptor.capture()); + assertThat(lockedEventCaptor.getValue().getCommand()).isSameAs(event.getSource()); + } + + private void onForwardVorgangOrder() { + listener.onForwardVorgangOrder(event); + } + private static CommandCreatedEvent event() { return CommandCreatedEventTestFactory.create(CommandTestFactory.createBuilder().bodyObject(commandBody()).build()); } @@ -129,7 +173,7 @@ class ForwardingEventListenerTest { private static Map<String, Object> commandBody() { return Map.of(LoremIpsum.getInstance().getWords(1), LoremIpsum.getInstance().getWords(1)); } - } + } @Nested class TestMarkAsSuccessfull { diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingServiceTest.java index ac84ad8b780ed2655318ee1c05a5129b5e24b4a4..1b864c7a9ab50c247178efd8d1346e87aff1e4f5 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingServiceTest.java @@ -622,4 +622,15 @@ class ForwardingServiceTest { } } + + @Nested + class TestForward { + + @Test + void shouldSetStatusToWeitergeleitet() { + service.forward(ForwardingRequestTestFactory.create()); + + verify(statusService).setStatusToWeitergeleitet(VorgangTestFactory.ID, VorgangTestFactory.VERSION); + } + } } \ No newline at end of file