Skip to content
Snippets Groups Projects
Commit 500f430c authored by OZGCloud's avatar OZGCloud
Browse files

Merge pull request 'OZG-5988 Bescheid: SEND_BESCHEID als subCommand umsetzen'...

Merge pull request 'OZG-5988 Bescheid: SEND_BESCHEID als subCommand umsetzen' (#25) from OZG-5988-Bescheid-SEND_BESCHEID-als-subCommand-umsetzen into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-lib/api-lib/pulls/25


Reviewed-by: default avatarOZGCloud <ozgcloud@mgm-tp.com>
parents 22be31c9 84d6b5aa
No related branches found
No related tags found
No related merge requests found
Showing
with 299 additions and 15 deletions
package de.ozgcloud.apilib.common.command; package de.ozgcloud.apilib.common.command;
import java.util.List;
public interface OzgCloudCommandService { public interface OzgCloudCommandService {
public OzgCloudCommand create(OzgCloudCommand commandToCreate); OzgCloudCommand create(OzgCloudCommand commandToCreate);
OzgCloudCommand createAndWaitUntilDone(OzgCloudCommand commandToCreate);
public OzgCloudCommand createAndWaitUntilDone(OzgCloudCommand commandToCreate); List<OzgCloudCommand> addSubCommands(OzgCloudCreateSubCommandsRequest request);
} }
package de.ozgcloud.apilib.common.command;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
import lombok.NonNull;
import lombok.Singular;
@Builder
@Getter
public class OzgCloudCreateSubCommandsRequest {
@NonNull
private String parentId;
private String executionMode;
private boolean completedIfSubsCompleted;
@Singular
private List<OzgCloudCommand> subCommands;
}
package de.ozgcloud.apilib.common.command.grpc; package de.ozgcloud.apilib.common.command.grpc;
import java.time.ZonedDateTime; import java.time.ZonedDateTime;
import java.util.List;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
...@@ -11,17 +12,25 @@ import org.mapstruct.NullValueCheckStrategy; ...@@ -11,17 +12,25 @@ import org.mapstruct.NullValueCheckStrategy;
import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandId; import de.ozgcloud.apilib.common.command.OzgCloudCommandId;
import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus; import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest;
import de.ozgcloud.apilib.common.datatypes.GenericId; import de.ozgcloud.apilib.common.datatypes.GenericId;
import de.ozgcloud.apilib.user.OzgCloudUserId; import de.ozgcloud.apilib.user.OzgCloudUserId;
import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
import de.ozgcloud.common.datatype.StringBasedValue; import de.ozgcloud.common.datatype.StringBasedValue;
import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
import de.ozgcloud.vorgang.grpc.command.GrpcAddSubCommandsRequest;
import de.ozgcloud.vorgang.grpc.command.GrpcCommand; import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommand;
import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommandRequest; import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommandRequest;
@Mapper(uses = { GrpcObjectMapper.class }, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) @Mapper(uses = { GrpcObjectMapper.class }, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface CommandMapper { public interface CommandMapper {
@Mapping(target = "redirectRequestOrBuilder", ignore = true)
@Mapping(target = "orderStringBytes", ignore = true)
@Mapping(target = "defaultInstanceForType", ignore = true)
@Mapping(target = "callContextOrBuilder", ignore = true)
@Mapping(target = "bodyObjOrBuilder", ignore = true)
@Mapping(target = "mergeFrom", ignore = true) @Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "clearField", ignore = true) @Mapping(target = "clearField", ignore = true)
@Mapping(target = "clearOneof", ignore = true) @Mapping(target = "clearOneof", ignore = true)
...@@ -31,9 +40,6 @@ public interface CommandMapper { ...@@ -31,9 +40,6 @@ public interface CommandMapper {
@Mapping(target = "mergeUnknownFields", ignore = true) @Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "removeBody", ignore = true) @Mapping(target = "removeBody", ignore = true)
@Mapping(target = "callContext", ignore = true) @Mapping(target = "callContext", ignore = true)
@Mapping(target = "order", ignore = true)
@Mapping(target = "orderStringBytes", ignore = true)
@Mapping(target = "orderValue", ignore = true)
@Mapping(target = "redirectRequest", ignore = true) @Mapping(target = "redirectRequest", ignore = true)
@Mapping(target = "relationIdBytes", ignore = true) @Mapping(target = "relationIdBytes", ignore = true)
@Mapping(target = "unknownFields", ignore = true) @Mapping(target = "unknownFields", ignore = true)
...@@ -84,4 +90,44 @@ public interface CommandMapper { ...@@ -84,4 +90,44 @@ public interface CommandMapper {
default String valueToString(StringBasedValue value) { default String valueToString(StringBasedValue value) {
return value.toString(); return value.toString();
} }
default GrpcAddSubCommandsRequest toAddSubCommandsRequest(OzgCloudCreateSubCommandsRequest createSubCommandsRequest) {
return toAddSubCommandsRequestWithoutSubCommands(createSubCommandsRequest).toBuilder()
.addAllSubCommands(toCreateCommands(createSubCommandsRequest.getSubCommands())).build();
}
@Mapping(target = "subCommandsList", ignore = true)
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "subCommandsOrBuilderList", ignore = true)
@Mapping(target = "subCommandsBuilderList", ignore = true)
@Mapping(target = "removeSubCommands", ignore = true)
@Mapping(target = "parentIdBytes", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "executionModeBytes", ignore = true)
@Mapping(target = "defaultInstanceForType", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "clearField", ignore = true)
@Mapping(target = "allFields", ignore = true)
GrpcAddSubCommandsRequest toAddSubCommandsRequestWithoutSubCommands(OzgCloudCreateSubCommandsRequest command);
default List<GrpcCreateCommand> toCreateCommands(List<OzgCloudCommand> subCommands) {
return subCommands.stream().map(this::toCreateCommand).toList();
}
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "relationIdBytes", ignore = true)
@Mapping(target = "orderBytes", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "mergeBodyObj", ignore = true)
@Mapping(target = "defaultInstanceForType", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "clearField", ignore = true)
@Mapping(target = "bodyObjOrBuilder", ignore = true)
@Mapping(target = "allFields", ignore = true)
@Mapping(target = "bodyObj", source = "bodyObject")
GrpcCreateCommand toCreateCommand(OzgCloudCommand commands);
} }
package de.ozgcloud.apilib.common.command.grpc; package de.ozgcloud.apilib.common.command.grpc;
import java.util.List;
import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor; import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider; import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandId; import de.ozgcloud.apilib.common.command.OzgCloudCommandId;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus; import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest;
import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub; import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.command.GrpcGetCommandRequest; import de.ozgcloud.vorgang.grpc.command.GrpcGetCommandRequest;
...@@ -60,13 +63,18 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService { ...@@ -60,13 +63,18 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService {
return mapper.fromGrpc(getCommandServiceStub().getCommand(request)); return mapper.fromGrpc(getCommandServiceStub().getCommand(request));
} }
CommandServiceBlockingStub getCommandServiceStub() {
return commandServiceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
}
void verifyCommand(OzgCloudCommand command) { void verifyCommand(OzgCloudCommand command) {
if (OzgCloudCommandStatus.ERROR.equals(command.getStatus())) { if (OzgCloudCommandStatus.ERROR.equals(command.getStatus())) {
throw new TechnicalException("Command (id=%s) failed: %s".formatted(command.getId(), command.getErrorMessage())); throw new TechnicalException("Command (id=%s) failed: %s".formatted(command.getId(), command.getErrorMessage()));
} }
} }
public List<OzgCloudCommand> addSubCommands(OzgCloudCreateSubCommandsRequest request) {
var response = getCommandServiceStub().addSubCommands(mapper.toAddSubCommandsRequest(request));
return response.getCommandList().stream().map(mapper::fromGrpc).toList();
}
CommandServiceBlockingStub getCommandServiceStub() {
return commandServiceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
}
} }
...@@ -25,9 +25,6 @@ public interface OzgCloudCommandMapper { ...@@ -25,9 +25,6 @@ public interface OzgCloudCommandMapper {
@Mapping(target = "removeBody", ignore = true) @Mapping(target = "removeBody", ignore = true)
@Mapping(target = "callContext", ignore = true) @Mapping(target = "callContext", ignore = true)
@Mapping(target = "orderStringBytes", ignore = true)
@Mapping(target = "order", ignore = true)
@Mapping(target = "orderValue", ignore = true)
@Mapping(target = "redirectRequest", ignore = true) @Mapping(target = "redirectRequest", ignore = true)
@Mapping(target = "relationIdBytes", ignore = true) @Mapping(target = "relationIdBytes", ignore = true)
@Mapping(target = "unknownFields", ignore = true) @Mapping(target = "unknownFields", ignore = true)
......
package de.ozgcloud.apilib.common.command;
import de.ozgcloud.apilib.common.command.grpc.OzgCloudCommandTestFactory;
import de.ozgcloud.vorgang.common.GrpcObject;
import de.ozgcloud.vorgang.common.GrpcProperty;
import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommand;
public class GrpcCreateCommandTestFactory {
public static final GrpcObject BODY_OBJ = GrpcObject.newBuilder().addProperty(
GrpcProperty.newBuilder().setName(OzgCloudCommandTestFactory.BODY_FIELD_NAME).addValue(OzgCloudCommandTestFactory.BODY_FIELD_VALUE)).build();
public static GrpcCreateCommand creatio() {
return createBuilder().build();
}
public static GrpcCreateCommand.Builder createBuilder() {
return GrpcCreateCommand.newBuilder()
.setOrder(OzgCloudCommandTestFactory.ORDER)
.setRelationId(OzgCloudCommandTestFactory.RELATION_ID.toString())
.setRelationVersion(OzgCloudCommandTestFactory.RELATION_VERSION)
.setBodyObj(BODY_OBJ);
}
}
package de.ozgcloud.apilib.common.command;
import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest.OzgCloudCreateSubCommandsRequestBuilder;
import de.ozgcloud.apilib.common.command.grpc.OzgCloudCommandTestFactory;
public class OzgCloudCreateSubCommandsRequestTestFactory {
public static final String PARENT_ID = "parent-id";
public static final String EXECUTION_MODE = "PARALLEL";
public static final boolean COMPLETED_IF_SUBS_COMPLETED = true;
public static OzgCloudCreateSubCommandsRequest create() {
return createBuilder().build();
}
public static OzgCloudCreateSubCommandsRequestBuilder createBuilder() {
return OzgCloudCreateSubCommandsRequest.builder()
.parentId(PARENT_ID)
.executionMode(EXECUTION_MODE)
.completedIfSubsCompleted(COMPLETED_IF_SUBS_COMPLETED)
.subCommand(OzgCloudCommandTestFactory.create());
}
}
package de.ozgcloud.apilib.common.command.grpc; package de.ozgcloud.apilib.common.command.grpc;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import java.util.List;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import de.ozgcloud.apilib.common.command.GrpcCreateCommandTestFactory;
import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequestTestFactory;
import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommand;
class CommandMapperTest { class CommandMapperTest {
@Spy
@InjectMocks @InjectMocks
private CommandMapper mapper = Mappers.getMapper(CommandMapper.class); private CommandMapper mapper = Mappers.getMapper(CommandMapper.class);
...@@ -34,4 +47,83 @@ class CommandMapperTest { ...@@ -34,4 +47,83 @@ class CommandMapperTest {
} }
} }
@Nested
class TestToAddSubCommandsRequest {
@Captor
private ArgumentCaptor<List<OzgCloudCommand>> subCommandsCaptor;
@Test
void shouldMapParentId() {
var request = mapper.toAddSubCommandsRequest(OzgCloudCreateSubCommandsRequestTestFactory.create());
assertThat(request.getParentId()).isEqualTo(OzgCloudCreateSubCommandsRequestTestFactory.PARENT_ID);
}
@Test
void shouldMapExecutionMode() {
var request = mapper.toAddSubCommandsRequest(OzgCloudCreateSubCommandsRequestTestFactory.create());
assertThat(request.getExecutionMode()).isEqualTo(OzgCloudCreateSubCommandsRequestTestFactory.EXECUTION_MODE);
}
@Test
void shouldMapCompletedIfSubsCompleted() {
var request = mapper.toAddSubCommandsRequest(OzgCloudCreateSubCommandsRequestTestFactory.create());
assertThat(request.getCompletedIfSubsCompleted()).isEqualTo(OzgCloudCreateSubCommandsRequestTestFactory.COMPLETED_IF_SUBS_COMPLETED);
}
@Test
void shouldCallMapSubCommands() {
var subCommand = OzgCloudCommandTestFactory.create();
var createSubCommandsRequest = OzgCloudCreateSubCommandsRequestTestFactory.createBuilder().clearSubCommands().subCommand(subCommand)
.build();
mapper.toAddSubCommandsRequest(createSubCommandsRequest);
verify(mapper).toCreateCommands(subCommandsCaptor.capture());
assertThat(subCommandsCaptor.getValue()).containsExactly(subCommand);
}
}
@Nested
class TestToCreateCommands {
@Mock
private GrpcCreateCommand createCommand;
@Test
void shouldCallToCreateCommandRequest() {
var subCommand = OzgCloudCommandTestFactory.create();
mapper.toCreateCommands(List.of(subCommand));
verify(mapper).toCreateCommand(subCommand);
}
@Test
void shouldReturnResult() {
var subCommand = OzgCloudCommandTestFactory.create();
doReturn(createCommand).when(mapper).toCreateCommand(subCommand);
var result = mapper.toCreateCommands(List.of(subCommand));
assertThat(result).containsExactly(createCommand);
}
}
@Nested
class TestToCreateCommand {
@Test
void shouldMap() {
var command = OzgCloudCommandTestFactory.create();
var result = mapper.toCreateCommand(command);
assertThat(result).usingRecursiveComparison().isEqualTo(GrpcCreateCommandTestFactory.creatio());
}
}
} }
...@@ -5,6 +5,8 @@ import static org.junit.jupiter.api.Assertions.*; ...@@ -5,6 +5,8 @@ import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import java.util.List;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
...@@ -14,8 +16,12 @@ import org.mockito.Mockito; ...@@ -14,8 +16,12 @@ import org.mockito.Mockito;
import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider; import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus; import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequestTestFactory;
import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub; import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.command.GrpcAddSubCommandsRequest;
import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
import de.ozgcloud.vorgang.grpc.command.GrpcCommandsResponse;
class GrpcOzgCloudCommandServiceTest { class GrpcOzgCloudCommandServiceTest {
...@@ -130,4 +136,68 @@ class GrpcOzgCloudCommandServiceTest { ...@@ -130,4 +136,68 @@ class GrpcOzgCloudCommandServiceTest {
} }
} }
@Nested
class TestAddSubCommands {
private static final GrpcCommand GRPC_COMMAND = GrpcCommandTestFactory.create();
@Mock
private GrpcCommandsResponse commandsResponse;
@Mock
private GrpcAddSubCommandsRequest grpcAddSubCommandsRequest;
@BeforeEach
void init() {
doReturn(serviceStub).when(service).getCommandServiceStub();
when(serviceStub.addSubCommands(any())).thenReturn(commandsResponse);
when(commandsResponse.getCommandList()).thenReturn(List.of(GRPC_COMMAND));
}
@Test
void shouldCallGetCommandServiceStub() {
addSubCommands();
verify(service).getCommandServiceStub();
}
@Test
void shouldCallMapToAddSubcommandsRequest() {
var request = OzgCloudCreateSubCommandsRequestTestFactory.create();
service.addSubCommands(request);
verify(mapper).toAddSubCommandsRequest(request);
}
@Test
void shouldCallAddSubCommands() {
when(mapper.toAddSubCommandsRequest(any())).thenReturn(grpcAddSubCommandsRequest);
addSubCommands();
verify(serviceStub).addSubCommands(grpcAddSubCommandsRequest);
}
@Test
void shouldCallMapFromGrpc() {
addSubCommands();
verify(mapper).fromGrpc(GRPC_COMMAND);
}
@Test
void shouldReturnResult() {
var createdCommand = OzgCloudCommandTestFactory.create();
when(mapper.fromGrpc(any())).thenReturn(createdCommand);
var result = addSubCommands();
assertThat(result).containsExactly(createdCommand);
}
private List<OzgCloudCommand> addSubCommands() {
return service.addSubCommands(OzgCloudCreateSubCommandsRequestTestFactory.create());
}
}
} }
\ No newline at end of file
...@@ -31,7 +31,7 @@ public class OzgCloudCommandTestFactory { ...@@ -31,7 +31,7 @@ public class OzgCloudCommandTestFactory {
public static final String BODY_FIELD_NAME = "FIELD"; public static final String BODY_FIELD_NAME = "FIELD";
public static final String BODY_FIELD_VALUE = "42"; public static final String BODY_FIELD_VALUE = "42";
private static final Map<String, Object> BODY = Map.of(BODY_FIELD_NAME, BODY_FIELD_VALUE); public static final Map<String, Object> BODY = Map.of(BODY_FIELD_NAME, BODY_FIELD_VALUE);
public static final String CREATED_RESOURCE = UUID.randomUUID().toString(); public static final String CREATED_RESOURCE = UUID.randomUUID().toString();
public static final OzgCloudUserId CREATED_BY = OzgCloudUserId.from(UUID.randomUUID().toString()); public static final OzgCloudUserId CREATED_BY = OzgCloudUserId.from(UUID.randomUUID().toString());
public static final String CREATED_BY_NAME = "Dorothea Dow"; public static final String CREATED_BY_NAME = "Dorothea Dow";
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
<parent> <parent>
<groupId>de.ozgcloud.common</groupId> <groupId>de.ozgcloud.common</groupId>
<artifactId>ozgcloud-common-dependencies</artifactId> <artifactId>ozgcloud-common-dependencies</artifactId>
<version>4.2.0</version> <version>4.3.0</version>
<relativePath /> <!-- lookup parent from repository --> <relativePath /> <!-- lookup parent from repository -->
</parent> </parent>
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
<failsafe-plugin.version>3.2.2</failsafe-plugin.version> <failsafe-plugin.version>3.2.2</failsafe-plugin.version>
<maven-jar-plugin.version>3.3.0</maven-jar-plugin.version> <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
<vorgang-manager.version>2.5.0</vorgang-manager.version> <vorgang-manager.version>2.11.0-SNAPSHOT</vorgang-manager.version>
<user-manager.version>2.1.0</user-manager.version> <user-manager.version>2.1.0</user-manager.version>
</properties> </properties>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment