diff --git a/pluto-command/src/main/java/de/itvsh/ozg/pluto/command/CommandExecutedEvent.java b/pluto-command/src/main/java/de/itvsh/ozg/pluto/command/CommandExecutedEvent.java index 9a4a5c2419e1b0b7e62f601b4414c8c5539eb35d..70ea98930c6f3008ac00c8f277b04c2fee0337a3 100644 --- a/pluto-command/src/main/java/de/itvsh/ozg/pluto/command/CommandExecutedEvent.java +++ b/pluto-command/src/main/java/de/itvsh/ozg/pluto/command/CommandExecutedEvent.java @@ -29,12 +29,27 @@ public class CommandExecutedEvent extends ApplicationEvent { private static final long serialVersionUID = 1L; + private final Command command; + + @Deprecated protected CommandExecutedEvent(String commandId) { super(commandId); + + command = null; + } + + protected CommandExecutedEvent(Command command) { + super(command.getId()); + + this.command = command; } @Override public String getSource() { return (String) super.getSource(); } + + public Command getCommand() { + return command; + } } \ No newline at end of file diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml index ee1b81450616b19997325e598cc9d64faef76ea0..e980babe2ce81cf110b3e03ca1039a316bf4b274 100644 --- a/pluto-server/pom.xml +++ b/pluto-server/pom.xml @@ -77,6 +77,11 @@ <artifactId>pluto-utils</artifactId> <version>${project.version}</version> </dependency> + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-command</artifactId> + <version>${project.version}</version> + </dependency> <dependency> <groupId>de.itvsh.kop.notification</groupId> diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandEventListener.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandEventListener.java index 39655dd16a0e31abd128ad158900fe4d02cdff59..d22aeb044bdad08562ff570c044eec59d26272df 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandEventListener.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandEventListener.java @@ -23,19 +23,43 @@ */ package de.itvsh.ozg.pluto.command; +import java.util.Objects; +import java.util.function.Predicate; + +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; +import lombok.extern.log4j.Log4j2; + @Component +@Log4j2 public class CommandEventListener { + private static final String DELETION_ORDER = "VORGANG_LOESCHEN"; + + private static final Predicate<Command> IS_DELETION_COMMAND = command -> Objects.nonNull(command) && + (StringUtils.equals(command.getOrder(), DELETION_ORDER)); + @Autowired private CommandService commandService; @EventListener public void setStatusFinished(CommandExecutedEvent event) { commandService.setCommandFinished(event.getSource()); + + handleVorgangDeleted(event.getCommand()); + } + + void handleVorgangDeleted(Command command) { + if (IS_DELETION_COMMAND.test(command)) { + try { + commandService.deleteAllByVorgang(command.getVorgangId()); + } catch (RuntimeException e) { + LOG.error("Error on deleting Commands of Vorgang " + command.getVorgangId(), e); + } + } } @EventListener diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandRepository.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandRepository.java index 61ce4f9ac10434ed25b04653eeec04bb637760aa..6568052aa5b1931a0723ce84f6520468f13cf409 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandRepository.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandRepository.java @@ -140,4 +140,8 @@ class CommandRepository { } return update; } + + public void deleteAllByVorgang(String vorgangId) { + mongoOperations.remove(query(where(PersistedCommand.FIELD_VORGANG_ID).is(vorgangId)), PersistedCommand.COLLECTION_NAME); + } } diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandService.java index 7fd65a282305a9f6cab73ae432e65e85b9b791e8..28d84f431fe5114a45fb3c4f915e125bab60c6a2 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandService.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/command/CommandService.java @@ -155,4 +155,8 @@ public class CommandService { public void setPreviousState(String commandId, Map<String, Object> previousState) { repository.patch(commandId, previousState); } + + public void deleteAllByVorgang(String vorgangId) { + repository.deleteAllByVorgang(vorgangId); + } } \ No newline at end of file diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/search/SearchEventListener.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/search/SearchEventListener.java index 5570f9620f1a5ec6e69d52c27454a185c26e71b4..c990d40b52afb4f5006346913fc9f04a6a69ad74 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/search/SearchEventListener.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/common/search/SearchEventListener.java @@ -80,10 +80,11 @@ public class SearchEventListener { @EventListener public void onVorgangDeleted(VorgangDeletedEvent event) { + String vorgangId = event.getCommand().getVorgangId(); try { - searchService.deleteVorgang(event.getVorgangId()); + searchService.deleteVorgang(vorgangId); } catch (RuntimeException e) { - LOG.error("Error on deleting Vorgang (" + event.getVorgangId() + ") from search index.", e); + LOG.error("Error on deleting Vorgang (" + vorgangId + ") from search index.", e); } } diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangDeletedEvent.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangDeletedEvent.java index e9ca562cdbff7fac09c07893a3c4d40c05e9e4a0..80d79bcacfdb5845c1c7ff59fb8b535383dda60c 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangDeletedEvent.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangDeletedEvent.java @@ -1,17 +1,14 @@ package de.itvsh.ozg.pluto.vorgang; +import de.itvsh.ozg.pluto.command.Command; import de.itvsh.ozg.pluto.command.CommandExecutedEvent; import lombok.Getter; @Getter public class VorgangDeletedEvent extends CommandExecutedEvent { - private final String vorgangId; - - protected VorgangDeletedEvent(String commandId, String vorgangId) { - super(commandId); - - this.vorgangId = vorgangId; + protected VorgangDeletedEvent(Command command) { + super(command); } } diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListener.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListener.java index aca3865efd287c342cc383e8e7e2cebff76e26d9..ede095cbdcc9a7ae1c63b626220ed3bdbe966e9b 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListener.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangEventListener.java @@ -85,7 +85,7 @@ public class VorgangEventListener { vorgangService.deleteVorgang(vorgangId); fileService.deleteAllByVorgang(vorgangId); - publishEvent(new VorgangDeletedEvent(command.getId(), vorgangId)); + publishEvent(new VorgangDeletedEvent(command)); } catch (RuntimeException e) { LOG.error("Unexpected Error on deleting Vorgang.", e); publisher.publishEvent(new CommandFailedEvent(command.getId(), e.getMessage())); diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangService.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangService.java index 7a4ecceae5bfd74262683a010809c313ea2904c7..03c884b59c6304e4e31a3ad41e3acfdb2c46a131 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangService.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangService.java @@ -191,6 +191,7 @@ public class VorgangService { } public void deleteVorgang(String vorgangId) { +//TODO check version var stub = stubMapper.fromVorgang(loadById(vorgangId)); repository.saveStub(stub); diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandEventListenerTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandEventListenerTest.java index 1a95b88791ab52661b10c865aee0d75e68f39032..d21243d7dbcb2cfb112762d4e68ac2a328168f6b 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandEventListenerTest.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandEventListenerTest.java @@ -23,6 +23,8 @@ */ package de.itvsh.ozg.pluto.command; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import org.junit.jupiter.api.Nested; @@ -30,6 +32,8 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory; + class CommandEventListenerTest { @InjectMocks // NOSONAR @@ -48,6 +52,33 @@ class CommandEventListenerTest { verify(commandService).setCommandFinished(CommandTestFactory.ID); } + + @Nested + class HandleVorgangDelete { + + @Test + void shouldIgnoreNull() { + assertThatCode(() -> listener.handleVorgangDeleted(null)).doesNotThrowAnyException(); + } + + @Test + void shouldDeleteCommandsOnVorgangDeletion() { + listener.handleVorgangDeleted(buildDeletionCommand()); + + verify(commandService).deleteAllByVorgang(VorgangTestFactory.ID); + } + + @Test + void shouldHandleExcpetion() { + doThrow(RuntimeException.class).when(commandService).deleteAllByVorgang(any()); + + assertThatCode(() -> listener.handleVorgangDeleted(buildDeletionCommand())).doesNotThrowAnyException(); + } + + private Command buildDeletionCommand() { + return CommandTestFactory.createBuilder().order("VORGANG_LOESCHEN").build(); + } + } } @Nested diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandRepositoryITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandRepositoryITCase.java index b4f0356a181ea35ea8b3edae0f4ac553e9877060..d42ac8e3100bbe5ee626f8cce2b1844fd3caff82 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandRepositoryITCase.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandRepositoryITCase.java @@ -24,6 +24,7 @@ package de.itvsh.ozg.pluto.command; import static org.assertj.core.api.Assertions.*; +import static org.springframework.data.mongodb.core.query.Query.*; import java.util.Collections; import java.util.Map; @@ -39,6 +40,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.query.Criteria; import de.itvsh.kop.common.test.DataITCase; import de.itvsh.ozg.pluto.vorgang.Vorgang; @@ -196,7 +198,7 @@ class CommandRepositoryITCase { @BeforeEach void init() { - command = repository.save(command); + command = mongoOperations.save(command); } @Test @@ -211,4 +213,25 @@ class CommandRepositoryITCase { PREVIOUS_STATE_STATUS_VALUE); } } + + @Nested + class TestDeleteAllByVorgang { + @Test + void shouldDeleteCommand() { + mongoOperations.save(CommandTestFactory.create()); + + repository.deleteAllByVorgang(VorgangTestFactory.ID); + + assertThat(mongoOperations.count(query(new Criteria()), Command.COLLECTION_NAME)).isZero(); + } + + @Test + void shouldNotDeleteOther() { + mongoOperations.save(CommandTestFactory.create()); + + repository.deleteAllByVorgang("other"); + + assertThat(mongoOperations.count(query(new Criteria()), Command.COLLECTION_NAME)).isOne(); + } + } } \ No newline at end of file diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandServiceTest.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandServiceTest.java index a4b1a702240676102f2eb79912f1474eb403c211..08fb20daccfa923cb97ff9c27015ad62f6ad0e8d 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandServiceTest.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/command/CommandServiceTest.java @@ -309,4 +309,14 @@ class CommandServiceTest { verify(repository).patch(anyString(), any()); } } + + @Nested + class TestDeleteAllByVorgang { + @Test + void shouldCallRepository() { + service.deleteAllByVorgang(VorgangTestFactory.ID); + + verify(repository).deleteAllByVorgang(VorgangTestFactory.ID); + } + } } \ No newline at end of file