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
Branches
Tags
No related merge requests found
Showing
with 299 additions and 15 deletions
package de.ozgcloud.apilib.common.command;
import java.util.List;
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;
import java.time.ZonedDateTime;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.Mapper;
......@@ -11,17 +12,25 @@ import org.mapstruct.NullValueCheckStrategy;
import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandId;
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.user.OzgCloudUserId;
import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId;
import de.ozgcloud.common.datatype.StringBasedValue;
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.GrpcCreateCommand;
import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommandRequest;
@Mapper(uses = { GrpcObjectMapper.class }, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
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 = "clearField", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
......@@ -31,9 +40,6 @@ public interface CommandMapper {
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "removeBody", 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 = "relationIdBytes", ignore = true)
@Mapping(target = "unknownFields", ignore = true)
......@@ -84,4 +90,44 @@ public interface CommandMapper {
default String valueToString(StringBasedValue value) {
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;
import java.util.List;
import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor;
import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandId;
import de.ozgcloud.apilib.common.command.OzgCloudCommandService;
import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.command.GrpcGetCommandRequest;
......@@ -60,13 +63,18 @@ public class GrpcOzgCloudCommandService implements OzgCloudCommandService {
return mapper.fromGrpc(getCommandServiceStub().getCommand(request));
}
CommandServiceBlockingStub getCommandServiceStub() {
return commandServiceStub.withInterceptors(new OzgCloudCallContextAttachingInterceptor(contextProvider));
}
void verifyCommand(OzgCloudCommand command) {
if (OzgCloudCommandStatus.ERROR.equals(command.getStatus())) {
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 {
@Mapping(target = "removeBody", 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 = "relationIdBytes", 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;
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.Test;
import org.mapstruct.factory.Mappers;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
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 {
@Spy
@InjectMocks
private CommandMapper mapper = Mappers.getMapper(CommandMapper.class);
......@@ -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.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
......@@ -14,8 +16,12 @@ import org.mockito.Mockito;
import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider;
import de.ozgcloud.apilib.common.command.OzgCloudCommand;
import de.ozgcloud.apilib.common.command.OzgCloudCommandStatus;
import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequestTestFactory;
import de.ozgcloud.common.errorhandling.TechnicalException;
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 {
......@@ -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 {
public static final String BODY_FIELD_NAME = "FIELD";
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 OzgCloudUserId CREATED_BY = OzgCloudUserId.from(UUID.randomUUID().toString());
public static final String CREATED_BY_NAME = "Dorothea Dow";
......
......@@ -7,7 +7,7 @@
<parent>
<groupId>de.ozgcloud.common</groupId>
<artifactId>ozgcloud-common-dependencies</artifactId>
<version>4.2.0</version>
<version>4.3.0</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
......@@ -28,7 +28,7 @@
<failsafe-plugin.version>3.2.2</failsafe-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>
</properties>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment