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

OZG-6991 don't create subCommands if vorgang is locked

parent 0d77c57b
Branches
No related tags found
No related merge requests found
...@@ -54,6 +54,7 @@ import de.ozgcloud.vorgang.callcontext.CurrentUserService; ...@@ -54,6 +54,7 @@ import de.ozgcloud.vorgang.callcontext.CurrentUserService;
import de.ozgcloud.vorgang.callcontext.User; import de.ozgcloud.vorgang.callcontext.User;
import de.ozgcloud.vorgang.common.errorhandling.NotFoundException; import de.ozgcloud.vorgang.common.errorhandling.NotFoundException;
import de.ozgcloud.vorgang.common.errorhandling.RevokeFailedException; import de.ozgcloud.vorgang.common.errorhandling.RevokeFailedException;
import de.ozgcloud.vorgang.vorgang.VorgangService;
import lombok.NonNull; import lombok.NonNull;
@Service @Service
...@@ -65,15 +66,24 @@ public class CommandService { ...@@ -65,15 +66,24 @@ public class CommandService {
@Autowired @Autowired
private ApplicationEventPublisher publisher; private ApplicationEventPublisher publisher;
@Autowired
private VorgangService vorgangService;
@Autowired @Autowired
private CurrentUserService userService; private CurrentUserService userService;
public Command createCommand(CreateCommandRequest request) { public Command createCommand(CreateCommandRequest request) {
validateVorgang(request.getVorgangId());
var persisted = saveCommand(buildCommand(request)); var persisted = saveCommand(buildCommand(request));
publisher.publishEvent(new CommandCreatedEvent(persisted)); publisher.publishEvent(new CommandCreatedEvent(persisted));
return persisted; return persisted;
} }
void validateVorgang(String vorgangId) {
if (vorgangService.isVorgangLocked(vorgangId)) {
throw new TechnicalException("Cannot create command. Vorgang %s is locked.".formatted(vorgangId));
}
}
private Command buildCommand(CreateCommandRequest request) { private Command buildCommand(CreateCommandRequest request) {
var builder = PersistedCommand.builder() var builder = PersistedCommand.builder()
.id(UUID.randomUUID().toString()) .id(UUID.randomUUID().toString())
......
...@@ -36,7 +36,6 @@ import org.springframework.context.ApplicationEventPublisher; ...@@ -36,7 +36,6 @@ import org.springframework.context.ApplicationEventPublisher;
import de.ozgcloud.command.Command; import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandExecutedEvent;
import de.ozgcloud.command.CommandStatus; import de.ozgcloud.command.CommandStatus;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.vorgang.command.CommandResponse.ResponseCode; import de.ozgcloud.vorgang.command.CommandResponse.ResponseCode;
import de.ozgcloud.vorgang.common.errorhandling.NotFoundException; import de.ozgcloud.vorgang.common.errorhandling.NotFoundException;
import de.ozgcloud.vorgang.common.security.PolicyService; import de.ozgcloud.vorgang.common.security.PolicyService;
...@@ -55,7 +54,6 @@ import de.ozgcloud.vorgang.grpc.command.GrpcGetPendingCommandsRequest; ...@@ -55,7 +54,6 @@ import de.ozgcloud.vorgang.grpc.command.GrpcGetPendingCommandsRequest;
import de.ozgcloud.vorgang.grpc.command.GrpcGetPendingCommandsResponse; import de.ozgcloud.vorgang.grpc.command.GrpcGetPendingCommandsResponse;
import de.ozgcloud.vorgang.grpc.command.GrpcRevokeCommandRequest; import de.ozgcloud.vorgang.grpc.command.GrpcRevokeCommandRequest;
import de.ozgcloud.vorgang.grpc.command.GrpcSetCommandExecutedRequest; import de.ozgcloud.vorgang.grpc.command.GrpcSetCommandExecutedRequest;
import de.ozgcloud.vorgang.vorgang.VorgangService;
import io.grpc.stub.StreamObserver; import io.grpc.stub.StreamObserver;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import net.devh.boot.grpc.server.service.GrpcService; import net.devh.boot.grpc.server.service.GrpcService;
...@@ -68,8 +66,6 @@ public class GrpcCommandService extends CommandServiceImplBase { ...@@ -68,8 +66,6 @@ public class GrpcCommandService extends CommandServiceImplBase {
private GrpcCreateCommandRequestMapper createCommandRequestMapper; private GrpcCreateCommandRequestMapper createCommandRequestMapper;
@Autowired @Autowired
private CommandService commandService; private CommandService commandService;
@Autowired
private VorgangService vorgangService;
@Autowired @Autowired
private GrpcCommandResponseMapper commandResponseMapper; private GrpcCommandResponseMapper commandResponseMapper;
...@@ -85,7 +81,6 @@ public class GrpcCommandService extends CommandServiceImplBase { ...@@ -85,7 +81,6 @@ public class GrpcCommandService extends CommandServiceImplBase {
@Override @Override
public void createCommand(GrpcCreateCommandRequest request, StreamObserver<GrpcCommandResponse> responseObserver) { public void createCommand(GrpcCreateCommandRequest request, StreamObserver<GrpcCommandResponse> responseObserver) {
validateVorgang(request.getVorgangId());
policyService.checkPermission(request.getVorgangId()); policyService.checkPermission(request.getVorgangId());
var mappedRequest = createCommandRequestMapper.fromGrpc(request); var mappedRequest = createCommandRequestMapper.fromGrpc(request);
...@@ -96,12 +91,6 @@ public class GrpcCommandService extends CommandServiceImplBase { ...@@ -96,12 +91,6 @@ public class GrpcCommandService extends CommandServiceImplBase {
responseObserver.onCompleted(); responseObserver.onCompleted();
} }
void validateVorgang(String vorgangId) {
if (vorgangService.isVorgangLocked(vorgangId)) {
throw new TechnicalException("Cannot create command. Vorgang %s is locked.".formatted(vorgangId));
}
}
@Override @Override
public void getCommand(GrpcGetCommandRequest request, StreamObserver<GrpcCommand> responseObserver) { public void getCommand(GrpcGetCommandRequest request, StreamObserver<GrpcCommand> responseObserver) {
policyService.checkPermissionByCommand(request.getId()); policyService.checkPermissionByCommand(request.getId());
......
...@@ -35,6 +35,7 @@ import java.util.Optional; ...@@ -35,6 +35,7 @@ import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
...@@ -59,6 +60,7 @@ import de.ozgcloud.vorgang.callcontext.CurrentUserService; ...@@ -59,6 +60,7 @@ import de.ozgcloud.vorgang.callcontext.CurrentUserService;
import de.ozgcloud.vorgang.callcontext.UserTestFactory; import de.ozgcloud.vorgang.callcontext.UserTestFactory;
import de.ozgcloud.vorgang.common.errorhandling.NotFoundException; import de.ozgcloud.vorgang.common.errorhandling.NotFoundException;
import de.ozgcloud.vorgang.common.errorhandling.RevokeFailedException; import de.ozgcloud.vorgang.common.errorhandling.RevokeFailedException;
import de.ozgcloud.vorgang.vorgang.VorgangService;
import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
class CommandServiceTest { class CommandServiceTest {
...@@ -73,6 +75,8 @@ class CommandServiceTest { ...@@ -73,6 +75,8 @@ class CommandServiceTest {
private ApplicationEventPublisher publisher; private ApplicationEventPublisher publisher;
@Mock @Mock
private CurrentUserService currentUserService; private CurrentUserService currentUserService;
@Mock
private VorgangService vorgangService;
@Nested @Nested
class TestCreateCommand { class TestCreateCommand {
...@@ -82,6 +86,13 @@ class CommandServiceTest { ...@@ -82,6 +86,13 @@ class CommandServiceTest {
@Captor @Captor
private ArgumentCaptor<Command> commandCaptor; private ArgumentCaptor<Command> commandCaptor;
@Test
void shouldCallValidateVorgang() {
service.createCommand(request);
verify(service).validateVorgang(VorgangTestFactory.ID);
}
@Test @Test
void shouldCallOperationRepository() { void shouldCallOperationRepository() {
service.createCommand(request); service.createCommand(request);
...@@ -166,6 +177,25 @@ class CommandServiceTest { ...@@ -166,6 +177,25 @@ class CommandServiceTest {
} }
} }
@Nested
class TestValidateVorgang {
@Test
void shouldCallIsVorgangLocked() {
service.validateVorgang(VorgangTestFactory.ID);
verify(vorgangService).isVorgangLocked(anyString());
}
@Test
void shouldThrowExceptionIfVorgangLocked() {
when(vorgangService.isVorgangLocked(anyString())).thenReturn(true);
Assertions.assertThrows(TechnicalException.class, () -> service.validateVorgang(VorgangTestFactory.ID));
}
}
@Nested @Nested
class TestGetVorgangCommand { class TestGetVorgangCommand {
......
...@@ -10,6 +10,7 @@ import java.util.HashMap; ...@@ -10,6 +10,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
...@@ -233,6 +234,14 @@ class GrpcCommandServiceITCase { ...@@ -233,6 +234,14 @@ class GrpcCommandServiceITCase {
}); });
} }
@Test
void shouldFailOnLockedVorgang() {
mongoOperations.save(vorgang.toBuilder().header(VorgangHeadTestFactory.createBuilder().lock(LockTestFactory.create()).build()).build());
var request = buildAddSubCommandsRequest(parentCommand.getId(), buildCreateCommand());
Assertions.assertThrows(StatusRuntimeException.class, () -> serviceBlockingStub.addSubCommands(request));
}
private GrpcCommand createParentCommand() { private GrpcCommand createParentCommand() {
var createParentCommandRequest = GrpcCreateCommandRequestTestFactory.createBuilder() var createParentCommandRequest = GrpcCreateCommandRequestTestFactory.createBuilder()
.setVorgangId(vorgang.getId()) .setVorgangId(vorgang.getId())
......
...@@ -32,7 +32,6 @@ import java.util.Optional; ...@@ -32,7 +32,6 @@ import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
...@@ -47,7 +46,6 @@ import org.springframework.context.ApplicationEventPublisher; ...@@ -47,7 +46,6 @@ import org.springframework.context.ApplicationEventPublisher;
import de.ozgcloud.command.Command; import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandExecutedEvent;
import de.ozgcloud.command.CommandStatus; import de.ozgcloud.command.CommandStatus;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.vorgang.common.security.PolicyService; import de.ozgcloud.vorgang.common.security.PolicyService;
import de.ozgcloud.vorgang.grpc.command.GrpcAddSubCommandsRequest; import de.ozgcloud.vorgang.grpc.command.GrpcAddSubCommandsRequest;
import de.ozgcloud.vorgang.grpc.command.GrpcCommand; import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
...@@ -63,7 +61,6 @@ import de.ozgcloud.vorgang.grpc.command.GrpcGetPendingCommandsRequest; ...@@ -63,7 +61,6 @@ import de.ozgcloud.vorgang.grpc.command.GrpcGetPendingCommandsRequest;
import de.ozgcloud.vorgang.grpc.command.GrpcGetPendingCommandsResponse; import de.ozgcloud.vorgang.grpc.command.GrpcGetPendingCommandsResponse;
import de.ozgcloud.vorgang.grpc.command.GrpcRevokeCommandRequest; import de.ozgcloud.vorgang.grpc.command.GrpcRevokeCommandRequest;
import de.ozgcloud.vorgang.grpc.command.GrpcSetCommandExecutedRequest; import de.ozgcloud.vorgang.grpc.command.GrpcSetCommandExecutedRequest;
import de.ozgcloud.vorgang.vorgang.VorgangService;
import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
import io.grpc.stub.StreamObserver; import io.grpc.stub.StreamObserver;
...@@ -76,8 +73,6 @@ class GrpcCommandServiceTest { ...@@ -76,8 +73,6 @@ class GrpcCommandServiceTest {
private GrpcCreateCommandRequestMapper createCommandRequestMapper; private GrpcCreateCommandRequestMapper createCommandRequestMapper;
@Mock @Mock
private CommandService commandService; private CommandService commandService;
@Mock
private VorgangService vorgangService;
@Mock @Mock
private GrpcCommandResponseMapper commandResponseMapper; private GrpcCommandResponseMapper commandResponseMapper;
...@@ -112,13 +107,6 @@ class GrpcCommandServiceTest { ...@@ -112,13 +107,6 @@ class GrpcCommandServiceTest {
when(commandResponseMapper.toGrpc(any(CommandResponse.class))).thenReturn(response); when(commandResponseMapper.toGrpc(any(CommandResponse.class))).thenReturn(response);
} }
@Test
void shouldCallValidateVorgang() {
callCreateCommand();
verify(service).validateVorgang(VorgangTestFactory.ID);
}
@Test @Test
void shouldCallPolicyService() { void shouldCallPolicyService() {
callCreateCommand(); callCreateCommand();
...@@ -156,25 +144,6 @@ class GrpcCommandServiceTest { ...@@ -156,25 +144,6 @@ class GrpcCommandServiceTest {
} }
} }
@Nested
class TestValidateVorgang {
@Test
void shouldCallIsVorgangLocked() {
service.validateVorgang(VorgangTestFactory.ID);
verify(vorgangService).isVorgangLocked(anyString());
}
@Test
void shouldThrowExceptionIfVorgangLocked() {
when(vorgangService.isVorgangLocked(anyString())).thenReturn(true);
Assertions.assertThrows(TechnicalException.class, () -> service.validateVorgang(VorgangTestFactory.ID));
}
}
@DisplayName("Get command") @DisplayName("Get command")
@Nested @Nested
class TestGetCommand { class TestGetCommand {
......
...@@ -4,8 +4,6 @@ import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory; ...@@ -4,8 +4,6 @@ import de.ozgcloud.vorgang.servicekonto.ServiceKontoTestFactory;
public class VorgangHeadTestFactory { public class VorgangHeadTestFactory {
public static final Lock LOCK = LockTestFactory.create();
public static VorgangHead create() { public static VorgangHead create() {
return createBuilder().build(); return createBuilder().build();
} }
......
...@@ -367,7 +367,7 @@ class VorgangRepositoryITCase { ...@@ -367,7 +367,7 @@ class VorgangRepositoryITCase {
@Test @Test
void shouldReturnTrue() { void shouldReturnTrue() {
var vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0) var vorgang = mongoOperations.save(VorgangTestFactory.createBuilder().id(null).version(0)
.header(VorgangHeadTestFactory.createBuilder().lock(VorgangHeadTestFactory.LOCK).build()) .header(VorgangHeadTestFactory.createBuilder().lock(LockTestFactory.create()).build())
.build()); .build());
var isLocked = repository.isVorgangLocked(vorgang.getId()); var isLocked = repository.isVorgangLocked(vorgang.getId());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment