diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java index 703a17d43d415bfcd5d39da8b002796399825f44..7941e9f30b61bb38e2a3abc93812fbc39639c62d 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java @@ -20,18 +20,12 @@ public interface CommandBodyMapper { final Predicate<Entry<Object, Object>> HAS_NOT_NULL_VALUE = entry -> Objects.nonNull(entry.getValue()); final Predicate<Entry<Object, Object>> IS_NOT_CLASS_VALUE = entry -> !StringUtils.equals("class", entry.getKey().toString()); + final Predicate<Entry<Object, Object>> IS_NOT_VERSION_VALUE = entry -> !StringUtils.equals("version", entry.getKey().toString()); static final String VORGANG_ID_PROPERTY = "vorgangId"; static final String ITEM_NAME_PROPERTY = "itemName"; static final String ITEM_PROPERTY = "item"; - default Map<String, Object> fromObjectToMap(Object object) { - return new BeanMap(object).entrySet().stream() - .filter(HAS_NOT_NULL_VALUE) - .filter(IS_NOT_CLASS_VALUE) - .collect(Collectors.toMap(entry -> entry.getKey().toString(), this::checkEnumValue)); - } - private Object checkEnumValue(Entry<Object, Object> entry) { if (entry.getValue() instanceof Enum<?> enumValue) { return enumValue.name(); @@ -82,6 +76,14 @@ public interface CommandBodyMapper { return Map.of( VORGANG_ID_PROPERTY, command.getVorgangId(), ITEM_NAME_PROPERTY, itemName, - ITEM_PROPERTY, new BeanMap(command.getBody())); + ITEM_PROPERTY, fromObjectToMap(command.getBody())); + } + + default Map<String, Object> fromObjectToMap(Object object) { + return new BeanMap(object).entrySet().stream() + .filter(HAS_NOT_NULL_VALUE) + .filter(IS_NOT_CLASS_VALUE) + .filter(IS_NOT_VERSION_VALUE) + .collect(Collectors.toMap(entry -> entry.getKey().toString(), this::checkEnumValue)); } } \ No newline at end of file diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java index d6c45c11a6021bddc0cb4cbb7ac6b89189c6200f..22ff718ba4814b519736975d6647ff2fd6cdccba 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandController.java @@ -78,13 +78,17 @@ public class CommandController { @PostMapping public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable String relationId, @PathVariable long relationVersion, @RequestBody CreateCommand command) { - command = command.toBuilder().vorgangId(vorgangId).relationId(relationId).build(); + command = command.toBuilder() + .vorgangId(vorgangId) + .relationId(relationId) + .relationVersion(relationVersion) + .build(); if (isSendPostfachMailOrder(command)) { command = prepareCommandForPostfachNachricht(command, vorgangId); } - var created = createCommand(command, relationVersion); + var created = createCommand(command); return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build(); } @@ -115,8 +119,8 @@ public class CommandController { return vorgangController.getVorgang(vorgangId); } - public Command createCommand(CreateCommand command, long version) { - return service.createCommand(command, version); + public Command createCommand(CreateCommand command) { + return service.createCommand(command); } public Command createCommand(CreateCommand command, String itemName) { diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java index ed04609df18439551e67e30709b9ccf3e3edda34..2e23b23ba4ac35cea37447aa882ce3d52b3f7f1c 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java @@ -32,8 +32,8 @@ public class CommandRemoteService { @Autowired private GrpcObjectMapper objectMapper; - public Command createCommand(CreateCommand command, long version) { - return doCreateCommand(buildCreateCommandRequest(command, version)); + public Command createCommand(CreateCommand command) { + return doCreateCommand(buildCreateCommandRequest(command)); } public Command createCommand(CreateCommand command, String itemName) { @@ -46,30 +46,30 @@ public class CommandRemoteService { return mapper.toCommand(response.getCommand()); } - GrpcCreateCommandRequest buildCreateCommandRequest(CreateCommand command, long version) { - var requestBuilder = GrpcCreateCommandRequest.newBuilder() - .setCallContext(contextService.createCallContext()) - .setVorgangId(command.getVorgangId()) - .setRelationId(command.getRelationId()) - .setRelationVersion(version) - .addAllBody(bodyMapper.mapToBodyFields(command.getBody())) + GrpcCreateCommandRequest buildCreateCommandRequest(CreateCommand command) { + return buildCreateRequestBuilder(command) .setBodyObj(objectMapper.fromMap(bodyMapper.fromObjectToMap(command.getBody()))) - .setOrderString(command.getOrder().name()); - - Optional.ofNullable(command.getRedirectRequest()).map(mapper::toGrpcRedirectRequest).ifPresent(requestBuilder::setRedirectRequest); - - return requestBuilder.build(); + .build(); } GrpcCreateCommandRequest buildCreateAttachedItemCommandRequest(CreateCommand command, String itemName) { - return GrpcCreateCommandRequest.newBuilder() + return buildCreateRequestBuilder(command) + .setBodyObj(objectMapper.fromMap(bodyMapper.mapToBodyMap(command, itemName))) + .build(); + } + + GrpcCreateCommandRequest.Builder buildCreateRequestBuilder(CreateCommand command) { + var requestBuilder = GrpcCreateCommandRequest.newBuilder() .setCallContext(contextService.createCallContext()) + .setVorgangId(command.getVorgangId()) .setRelationId(command.getRelationId()) .setRelationVersion(command.getRelationVersion()) - .setVorgangId(command.getVorgangId()) - .setOrder(GrpcOrder.valueOf(command.getOrder().name())) - .setBodyObj(objectMapper.fromMap(bodyMapper.mapToBodyMap(command, itemName))) - .build(); + .setOrderString(command.getOrder().name()) + .addAllBody(bodyMapper.mapToBodyFields(command.getBody())); + + Optional.ofNullable(command.getRedirectRequest()).map(mapper::toGrpcRedirectRequest).ifPresent(requestBuilder::setRedirectRequest); + + return requestBuilder; } public Command revokeCommand(String commandId) { diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandService.java index 5d27b7f6d9e16955e61eefbe3ffbfce0272e7740..c3254f8f432ec9fee52f983a7ab55570b00fc26e 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandService.java @@ -18,8 +18,8 @@ class CommandService { @Autowired private CommandRemoteService remoteService; - public Command createCommand(@Valid CreateCommand command, long version) { - return remoteService.createCommand(command, version); + public Command createCommand(@Valid CreateCommand command) { + return remoteService.createCommand(command); } public Command createCommand(@Valid CreateCommand command, String itemName) { diff --git a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java index 4bd0a32d73aa3817555633bbc1b936d2a80c6952..c295097dfb4d61ee615ed52ca17ee6c458b92669 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/postfach/PostfachMailController.java @@ -19,7 +19,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import de.itvsh.goofy.common.binaryfile.BinaryFileController; -import de.itvsh.goofy.common.command.Command; import de.itvsh.goofy.common.command.CommandController; import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; import de.itvsh.goofy.common.command.CreateCommand; @@ -82,6 +81,8 @@ public class PostfachMailController { static final String POSTFACH_MAIL_COMMAND_PATH = "/api/vorgangs/{vorgangId}/postfachMails/{postfachMailId}/commands"; // NOSONAR + static final long RELATION_ID_ON_CREATE = -1; + @Autowired private PostfachMailService service; @Autowired @@ -90,16 +91,16 @@ public class PostfachMailController { @PostMapping public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable String postfachMailId, @RequestBody CreateCommand command) { - command = command.toBuilder().vorgangId(vorgangId).relationId(postfachMailId).build(); - var created = createCommand(command); + command = command.toBuilder() + .vorgangId(vorgangId) + .relationId(postfachMailId) + .relationVersion(RELATION_ID_ON_CREATE) + .build(); + var created = commandByRelationController.createCommand(command); service.resendPostfachMail(created.getId(), postfachMailId); return ResponseEntity.created(linkTo(CommandController.class).slash(created.getId()).toUri()).build(); } - - Command createCommand(CreateCommand command) { - return commandByRelationController.createCommand(command, -1); - } } } \ No newline at end of file diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java index 13d0d22456f477f570a97c73bc50e1991d947272..08e007105034e6bfecd4bb5bedd94be1aae6d3e1 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java @@ -70,6 +70,15 @@ class CommandBodyMapperTest { .containsEntry("relationId", CommandTestFactory.RELATION_ID) .containsEntry("vorgangId", CommandTestFactory.VORGANG_ID); } + + @Test + void shouldNotMapVersion() { + var commandAsObject = WiedervorlageTestFactory.create(); + + var mappedMap = mapper.fromObjectToMap(commandAsObject); + + assertThat(mappedMap).hasSize(9).doesNotContainKey("version"); + } } @Nested diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java index 1d701b2269b468c4d63d4a3f13309c47d7e930af..f7792d08c6f0c4f255f9744f6a32f96c22e6290b 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandControllerTest.java @@ -146,7 +146,7 @@ class CommandControllerTest { @BeforeEach void initTest() { - when(service.createCommand(any(CreateCommand.class), anyLong())).thenReturn(CommandTestFactory.create()); + when(service.createCommand(any(CreateCommand.class))).thenReturn(CommandTestFactory.create()); } @DisplayName("should return CREATED") @@ -160,8 +160,11 @@ class CommandControllerTest { void callService() throws Exception { doRequest(); - verify(service).createCommand(createCommandCaptor.capture(), eq(VorgangHeaderTestFactory.VERSION)); + verify(service).createCommand(createCommandCaptor.capture()); assertThat(createCommandCaptor.getValue().getOrder()).isEqualTo(CommandTestFactory.ORDER); + assertThat(createCommandCaptor.getValue().getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID); + assertThat(createCommandCaptor.getValue().getRelationId()).isEqualTo(CommandTestFactory.RELATION_ID); + assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(CommandTestFactory.RELATION_VERSION); } @DisplayName("should have location header") diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandITCase.java index 19ffeb42ee405210ff0068d85ecde0f71a22d6a3..0aff0b1a2396b22a28acae4957f99cb21cc7ca37 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandITCase.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandITCase.java @@ -1,6 +1,5 @@ package de.itvsh.goofy.common.command; -import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -22,6 +21,8 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.common.ValidationMessageCodes; import de.itvsh.goofy.common.user.UserTestFactory; import de.itvsh.goofy.postfach.PostfachMailTestFactory; @@ -52,14 +53,14 @@ public class CommandITCase { @BeforeEach void initTests() { - when(commandRemoteService.createCommand(any(), anyLong())).thenReturn(CommandTestFactory.create()); + when(commandRemoteService.createCommand(any())).thenReturn(CommandTestFactory.create()); } @Test void shouldExtractUserId() throws Exception { createCommand(); - verify(commandRemoteService).createCommand(commandCaptor.capture(), anyLong()); + verify(commandRemoteService).createCommand(commandCaptor.capture()); assertThat(commandCaptor.getValue().getBody()).hasFieldOrPropertyWithValue("assignedTo", UserTestFactory.ID); } @@ -180,7 +181,7 @@ public class CommandITCase { @BeforeEach void initMockCommand() { - when(commandRemoteService.createCommand(any(CreateCommand.class), anyLong())).thenReturn(CommandTestFactory.create()); + when(commandRemoteService.createCommand(any(CreateCommand.class))).thenReturn(CommandTestFactory.create()); } @Test @@ -232,7 +233,7 @@ public class CommandITCase { @Test void shouldProceedOnValidInput() throws Exception { - when(commandRemoteService.createCommand(any(CreateCommand.class), anyLong())).thenReturn(CommandTestFactory.create()); + when(commandRemoteService.createCommand(any(CreateCommand.class))).thenReturn(CommandTestFactory.create()); var content = PostfachMailTestFactory.buildSendPostfachMailContent(); diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java index 93aebf51cf22e992d8b7c4ef0df93e0f604675b8..3e687d3a2c49b701a06b0547d922a4e57cb4a2fe 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java @@ -78,28 +78,28 @@ class CommandRemoteServiceTest { @BeforeEach void initTest() { - doReturn(request).when(service).buildCreateCommandRequest(any(), anyLong()); + doReturn(request).when(service).buildCreateCommandRequest(any()); when(commandServiceStub.createCommand(any())).thenReturn(GrpcCommandResponse.newBuilder().build()); when(mapper.toCommand(any())).thenReturn(resultCommand); } @Test void shouldCreateRequest() { - service.createCommand(createCommand, CommandTestFactory.RELATION_VERSION); + service.createCommand(createCommand); - verify(service).buildCreateCommandRequest(createCommand, CommandTestFactory.RELATION_VERSION); + verify(service).buildCreateCommandRequest(createCommand); } @Test void shouldCallServiceStub() { - service.createCommand(createCommand, CommandTestFactory.RELATION_VERSION); + service.createCommand(createCommand); verify(commandServiceStub).createCommand(request); } @Test void shouldReturnResultCommand() { - var result = service.createCommand(createCommand, CommandTestFactory.RELATION_VERSION); + var result = service.createCommand(createCommand); assertThat(result).isSameAs(resultCommand); } @@ -177,7 +177,7 @@ class CommandRemoteServiceTest { when(mapper.toGrpcRedirectRequest(any())).thenReturn(grpcRedirectRequest); var command = CommandTestFactory.createCreateCommandBuilder().redirectRequest(RedirectRequestTestFactory.create()).build(); - var request = service.buildCreateCommandRequest(command, CommandTestFactory.RELATION_VERSION); + var request = service.buildCreateCommandRequest(command); assertThat(request.getRedirectRequest()).isNotNull().isSameAs(grpcRedirectRequest); } @@ -185,16 +185,14 @@ class CommandRemoteServiceTest { @ParameterizedTest @EnumSource void shouldHaveOrder(CommandOrder order) { - var request = service.buildCreateCommandRequest(CommandTestFactory.createCreateCommandBuilder().order(order).build(), - CommandTestFactory.RELATION_VERSION); + var request = service.buildCreateCommandRequest(CommandTestFactory.createCreateCommandBuilder().order(order).build()); assertThat(request.getOrderString()).isEqualTo(order.name()); } private GrpcCreateCommandRequest buildRequest() { return service.buildCreateCommandRequest( - CommandTestFactory.createCreateCommandBuilder().body(RedirectRequestTestFactory.create()).build(), - CommandTestFactory.RELATION_VERSION); + CommandTestFactory.createCreateCommandBuilder().body(RedirectRequestTestFactory.create()).build()); } } } @@ -283,10 +281,10 @@ class CommandRemoteServiceTest { } @Test - void shouldContainsOrder() { + void shouldContainsOrderString() { var request = buildRequest(); - assertThat(request.getOrder()).isEqualTo(GrpcOrder.VORGANG_ANNEHMEN); + assertThat(request.getOrderString()).isEqualTo(GrpcOrder.VORGANG_ANNEHMEN.name()); } private GrpcCreateCommandRequest buildRequest() { diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandServiceTest.java index ca547c0a69309d0b28f0cd8e18a67cf482f923da..759269e308b7733181a6b4f2113288d7ffd29e72 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandServiceTest.java @@ -1,6 +1,5 @@ package de.itvsh.goofy.common.command; -import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -11,6 +10,8 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; class CommandServiceTest { @@ -30,24 +31,24 @@ class CommandServiceTest { @Test void shouldCallRemoteServiceWithVersion() { - service.createCommand(command, CommandTestFactory.RELATION_VERSION); + service.createCommand(command); - verify(remoteService).createCommand(command, CommandTestFactory.RELATION_VERSION); + verify(remoteService).createCommand(command); } @Test void shouldHaveVorgangId() { - service.createCommand(command, CommandTestFactory.RELATION_VERSION); + service.createCommand(command); - verify(remoteService).createCommand(createCommandCaptor.capture(), anyLong()); + verify(remoteService).createCommand(createCommandCaptor.capture()); assertThat(createCommandCaptor.getValue().getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID); } @Test void shouldHaveRelationId() { - service.createCommand(command, CommandTestFactory.RELATION_VERSION); + service.createCommand(command); - verify(remoteService).createCommand(createCommandCaptor.capture(), anyLong()); + verify(remoteService).createCommand(createCommandCaptor.capture()); assertThat(createCommandCaptor.getValue().getRelationId()).isEqualTo(CommandTestFactory.RELATION_ID); } } diff --git a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailCommandControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailCommandControllerTest.java index dc3c4932db2382e4713c473d9fbcdb2980fd1ed7..607cc4ada5037eb8aef73b6350b786ebe6837b86 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailCommandControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/postfach/PostfachMailCommandControllerTest.java @@ -8,6 +8,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; import org.springframework.http.MediaType; @@ -15,6 +17,8 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.common.command.CommandController.CommandByRelationController; import de.itvsh.goofy.common.command.CommandTestFactory; import de.itvsh.goofy.common.command.CreateCommand; @@ -40,9 +44,20 @@ class PostfachMailCommandControllerTest { @Nested class TestCreateCommand { + @Captor + private ArgumentCaptor<CreateCommand> createCommandCaptor; + @BeforeEach void mockController() { - when(commandByRelationController.createCommand(any(CreateCommand.class), anyLong())).thenReturn(CommandTestFactory.create()); + when(commandByRelationController.createCommand(any(CreateCommand.class))).thenReturn(CommandTestFactory.create()); + } + + @Test + void shouldCallCommandByRelationController() throws Exception { + doRequest(); + + verify(commandByRelationController).createCommand(createCommandCaptor.capture()); + assertThat(createCommandCaptor.getValue().getRelationVersion()).isEqualTo(PostfachMailCommandController.RELATION_ID_ON_CREATE); } @Test @@ -63,13 +78,4 @@ class PostfachMailCommandControllerTest { .content(PostfachMailTestFactory.buildResendPostfachMailContent())); } } - - @Test - void shouldCallCommandByRelationController() { - var createCommand = CommandTestFactory.createCreateCommand(); - - controller.createCommand(createCommand); - - verify(commandByRelationController).createCommand(createCommand, -1); - } } \ No newline at end of file