diff --git a/vorgang-manager-command/src/main/java/de/ozgcloud/command/VorgangLockedEvent.java b/vorgang-manager-command/src/main/java/de/ozgcloud/command/VorgangLockedEvent.java new file mode 100644 index 0000000000000000000000000000000000000000..e7c08bc4538b8cc2bc93d1489a1609ab927dc0b9 --- /dev/null +++ b/vorgang-manager-command/src/main/java/de/ozgcloud/command/VorgangLockedEvent.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.command; + +public class VorgangLockedEvent extends CommandExecutedEvent { + + public VorgangLockedEvent(Command command) { + super(command); + } +} diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/Order.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/Order.java index 7bdcc47b4fc18edd75dc50802ecc6a8c3a7ca980..a48af6f57e82f77afb0ad312262c0367449d6f86 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/Order.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/command/Order.java @@ -40,6 +40,7 @@ public enum Order { VORGANG_WIEDEREROEFFNEN, VORGANG_ZUM_LOESCHEN_MARKIEREN, VORGANG_LOESCHEN, + VORGANG_LOCK, ASSIGN_USER, diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangEventListener.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangEventListener.java index 4433839167a3ecf15dfe1667f920e6d2b2a38757..d8d18d10a35f0af062a13f6163c2322e432c8cef 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangEventListener.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangEventListener.java @@ -35,6 +35,8 @@ import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandCreatedEvent; import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.command.CommandRevokeFailedEvent; +import de.ozgcloud.command.RevokeCommandEvent; import de.ozgcloud.vorgang.command.CommandService; import de.ozgcloud.vorgang.command.Order; import de.ozgcloud.vorgang.files.FileService; @@ -54,6 +56,9 @@ public class VorgangEventListener { public static final Predicate<Command> IS_LOESCHEN_COMMAND = command -> Order.VORGANG_LOESCHEN.isMeant(command.getOrder()); public static final Predicate<Command> IS_SET_AKTENZEICHEN_COMMAND = command -> Order.SET_AKTENZEICHEN.isMeant(command.getOrder()); + private static final String IS_LOCK_VORGANG_COMMAND = "{T(de.ozgcloud.vorgang.vorgang.VorgangEventListener).IS_LOCK_VORGANG_ORDER.test(event.getSource())}"; + public static final Predicate<Command> IS_LOCK_VORGANG_ORDER = command -> Order.VORGANG_LOCK.isMeant(command.getOrder()); + @Autowired private StatusService statusService; @Autowired @@ -111,6 +116,28 @@ public class VorgangEventListener { } } + @EventListener(condition = IS_LOCK_VORGANG_COMMAND) + public void onLockVorgang(CommandCreatedEvent event) { + var command = event.getSource(); + try { + vorgangService.lockVorgang(command); + } catch (RuntimeException e) { + LOG.error("Error locking vorgang.", e); + publisher.publishEvent(new CommandFailedEvent(command.getId(), e.getMessage())); + } + } + + @EventListener(condition = IS_LOCK_VORGANG_COMMAND) + public void onRevokeLockVorgang(RevokeCommandEvent event) { + var command = event.getSource(); + try { + vorgangService.unlockVorgang(command); + } catch (RuntimeException e) { + LOG.error("Error unlocking vorgang.", e); + publisher.publishEvent(new CommandRevokeFailedEvent(command.getId(), e.getMessage())); + } + } + void publishEvent(CommandExecutedEvent event) { LOG.debug("Command {} executed", event.getSource()); publisher.publishEvent(event); diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java index 67678fb2648931db32733b0f3c113d43e0d87bc5..274e1945c40d174731604e4ab38dd291417d1e93 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/VorgangService.java @@ -44,6 +44,7 @@ import org.springframework.validation.annotation.Validated; import de.ozgcloud.command.Command; import de.ozgcloud.command.VorgangAssignedEvent; import de.ozgcloud.command.VorgangCreatedEvent; +import de.ozgcloud.command.VorgangLockedEvent; import de.ozgcloud.vorgang.clientattribute.ClientAttributeMap; import de.ozgcloud.vorgang.clientattribute.ClientAttributeReadPermitted; import de.ozgcloud.vorgang.clientattribute.ClientAttributesMap; @@ -223,4 +224,14 @@ public class VorgangService { Vorgang loadById(String vorgangId) { return repository.findById(vorgangId).orElseThrow(() -> new NotFoundException(Vorgang.class, vorgangId)); } + + public void lockVorgang(Command command) { + publisher.publishEvent(new VorgangLockedEvent(command)); + } + + public void unlockVorgang(Command command) { + // TODO wird implementiert in OZG-6992 + // publisher.publishEvent(new CommandRevokedEvent(command)); + throw new UnsupportedOperationException("Not yet implemented"); + } } \ No newline at end of file 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 8b81f437d748490a869bf45321ea8e73c02856ed..1777bbfa47376f46a96918f6ef76721d0e68b0b3 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 @@ -46,6 +46,8 @@ import com.thedeanda.lorem.LoremIpsum; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.command.CommandRevokeFailedEvent; +import de.ozgcloud.command.RevokeCommandEvent; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.vorgang.command.CommandCreatedEventTestFactory; import de.ozgcloud.vorgang.command.CommandService; @@ -231,4 +233,65 @@ class VorgangEventListenerTest { } } + @Nested + class TestLockVorgang { + + @Captor + private ArgumentCaptor<CommandFailedEvent> eventCaptor; + + @Test + void shouldCallLockVorgang() { + var command = CommandTestFactory.create(); + + listener.onLockVorgang(CommandCreatedEventTestFactory.create(command)); + + verify(service).lockVorgang(command); + } + + @Test + void shouldPublishCommandFailedEvent() { + var command = CommandTestFactory.create(); + var errorMessage = "error message"; + doThrow(new RuntimeException(errorMessage)).when(service).lockVorgang(command); + + listener.onLockVorgang(CommandCreatedEventTestFactory.create(command)); + + verify(publisher).publishEvent(eventCaptor.capture()); + assertThat(eventCaptor.getValue()).satisfies(event -> { + assertThat(event.getSource()).isEqualTo(CommandTestFactory.ID); + assertThat(event.getErrorMessage()).isEqualTo(errorMessage); + }); + } + } + + @Nested + class TestRevokeLockVorgang { + + @Captor + private ArgumentCaptor<CommandRevokeFailedEvent> eventCaptor; + + @Test + void shouldCallUnlockVorgang() { + var command = CommandTestFactory.create(); + + listener.onRevokeLockVorgang(new RevokeCommandEvent(command)); + + verify(service).unlockVorgang(command); + } + + @Test + void shouldPublishCommandFailedEvent() { + var command = CommandTestFactory.create(); + var errorMessage = "error message"; + doThrow(new RuntimeException(errorMessage)).when(service).unlockVorgang(command); + + listener.onRevokeLockVorgang(new RevokeCommandEvent(command)); + + verify(publisher).publishEvent(eventCaptor.capture()); + assertThat(eventCaptor.getValue()).satisfies(event -> { + assertThat(event.getSource()).isEqualTo(CommandTestFactory.ID); + assertThat(event.getErrorMessage()).isEqualTo(errorMessage); + }); + } + } } \ No newline at end of file