Skip to content
Snippets Groups Projects
Commit a27cf1a1 authored by Krzysztof Witukiewicz's avatar Krzysztof Witukiewicz
Browse files

OZG-7501 OZG-7899 Lock Vorgang and update status

parent 8d3e9d70
Branches
Tags
1 merge request!22Ozg 7501 weiterleitung vorbereiten
Showing
with 119 additions and 43 deletions
......@@ -29,7 +29,6 @@ import java.util.Objects;
import java.util.Optional;
import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
......@@ -41,18 +40,17 @@ import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.vorgang.command.PersistedCommand;
import de.ozgcloud.vorgang.vorgang.Vorgang;
import de.ozgcloud.vorgang.vorgang.Vorgang.Status;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Service
@RequiredArgsConstructor
@Log4j2
public class StatusService {
private static final String CONCURRENT_MODIFICATION_ERROR_CODE = "concurrent_modification";
@Autowired
private ApplicationEventPublisher publisher;
@Autowired
private StatusRepository repository;
private final ApplicationEventPublisher publisher;
private final StatusRepository repository;
void setStatusNeu(Command command) {
executeStatusChangeCommand(command, Status.NEU);
......@@ -100,6 +98,10 @@ public class StatusService {
doUpdateStatus(vorgangId, version, Status.IN_BEARBEITUNG.name());
}
public void setStatusToWeitergeleitet(String vorgangId, long version) {
doUpdateStatus(vorgangId, version, Status.WEITERGELEITET.name());
}
public void revokeStatusChange(Command command) {
try {
doUpdateStatus(command.getRelationId(), command.getRelationVersion() + 1,
......
......@@ -29,7 +29,7 @@ import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Getter;
@Builder
@Builder(toBuilder = true)
@Getter
public class Lock {
......
......@@ -35,7 +35,7 @@ import org.mapstruct.Mapping;
import de.ozgcloud.command.Command;
@Mapper
interface LockMapper {
public interface LockMapper {
@Mapping(target = "clientName", source = "createdByClientName")
@Mapping(target = "lockedSince", expression = "java(getLockedSince())")
......
......@@ -33,10 +33,13 @@ import org.springframework.stereotype.Component;
import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandCreatedEvent;
import de.ozgcloud.command.CommandFailedEvent;
import de.ozgcloud.command.VorgangLockedEvent;
import de.ozgcloud.nachrichten.email.MailSendErrorEvent;
import de.ozgcloud.nachrichten.email.MailSendRequest;
import de.ozgcloud.nachrichten.email.MailSentEvent;
import de.ozgcloud.vorgang.command.Order;
import de.ozgcloud.vorgang.vorgang.LockMapper;
import de.ozgcloud.vorgang.vorgang.VorgangService;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
......@@ -60,6 +63,8 @@ public class ForwardingEventListener {
private final ForwardingService service;
private final ApplicationEventPublisher publisher;
private final ForwardingRequestMapper forwardingRequestMapper;
private final VorgangService vorgangService;
private final LockMapper lockMapper;
@EventListener(condition = IS_FORWARD_ORDER_CONDITION)
public void onForwardOrder(CommandCreatedEvent event) {
......@@ -92,7 +97,14 @@ public class ForwardingEventListener {
@EventListener(condition = IS_FORWARD_VORGANG_ORDER_CONDITION)
public void onForwardVorgangOrder(CommandCreatedEvent event) {
lockVorgangOnForwarding(event.getSource());
service.forward(forwardingRequestMapper.fromCommand(event.getSource()));
publisher.publishEvent(new VorgangLockedEvent(event.getSource()));
}
private void lockVorgangOnForwarding(Command command) {
var lock = lockMapper.fromCommand(command).toBuilder().reason("Vorgang is being forwarded").build();
vorgangService.lockVorgang(lock, command.getVorgangId(), command.getRelationVersion());
}
private void handleException(Runnable runnable, String commandId) {
......
......@@ -331,6 +331,6 @@ public class ForwardingService {
}
public void forward(ForwardingRequest request) {
statusService.setStatusToWeitergeleitet(request.getVorgangId(), request.getVersion());
}
}
\ No newline at end of file
......@@ -39,6 +39,8 @@ import org.mockito.Mock;
import org.mockito.Spy;
import org.springframework.context.ApplicationEventPublisher;
import com.thedeanda.lorem.LoremIpsum;
import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandFailedEvent;
import de.ozgcloud.command.CommandRevokedEvent;
......@@ -52,19 +54,18 @@ import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
class StatusServiceTest {
@DisplayName("Test handling vorgang status changes")
@Nested
class TestVorgangStatusChanges {
@Spy
@InjectMocks
private StatusService service;
@Mock
private StatusRepository repository;
@Mock
private ApplicationEventPublisher publisher;
@DisplayName("Test handling vorgang status changes")
@Nested
class TestVorgangStatusChanges {
private PersistedCommand command = CommandTestFactory.create();
@DisplayName("Test Vorgang ABSCHLIESSEN events")
......@@ -261,15 +262,6 @@ class StatusServiceTest {
@DisplayName("Test status changes when a Vorgang is forwarded")
@Nested
class TestVorgangWeiterleiten {
@Spy
@InjectMocks
private StatusService service;
@Mock
private StatusRepository repository;
@Mock
private ApplicationEventPublisher publisher;
@Mock
private PersistedCommand command;
......@@ -299,15 +291,6 @@ class StatusServiceTest {
@DisplayName("Test handling revoke command status changes")
@Nested
class TestRevokeStatusChanges {
@Spy
@InjectMocks
private StatusService service;
@Mock
private StatusRepository repository;
@Mock
private ApplicationEventPublisher publisher;
private static final String PREVIOUS_STATUS = Vorgang.Status.BESCHIEDEN.name();
private PersistedCommand command = CommandTestFactory.createBuilder()
......@@ -381,4 +364,28 @@ class StatusServiceTest {
}
}
}
@Nested
class TestSetStatusToWeitergeleitet {
@Test
void shouldUpdateStatus() {
service.setStatusToWeitergeleitet(VorgangTestFactory.ID, VorgangTestFactory.VERSION);
verify(service).doUpdateStatus(VorgangTestFactory.ID, VorgangTestFactory.VERSION, Status.WEITERGELEITET.name());
}
}
@Nested
class TestDoUpdateStatus {
@Test
void shouldPatchVorgangWithNewStatus() {
var statusName = LoremIpsum.getInstance().getWords(1);
service.doUpdateStatus(VorgangTestFactory.ID, VorgangTestFactory.VERSION, statusName);
verify(repository).patch(VorgangTestFactory.ID, VorgangTestFactory.VERSION, Map.of(Vorgang.MONGODB_FIELDNAME_STATUS, statusName));
}
}
}
......@@ -269,7 +269,7 @@ class VorgangEventListenerTest {
}
@Test
void shouldCallPublishEvent() {
void shouldPublishVorgangLockedEvent() {
onLockVorgang();
verify(publisher).publishEvent(lockedEventCaptor.capture());
......
......@@ -44,10 +44,16 @@ import com.thedeanda.lorem.LoremIpsum;
import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandCreatedEvent;
import de.ozgcloud.command.CommandFailedEvent;
import de.ozgcloud.command.VorgangLockedEvent;
import de.ozgcloud.nachrichten.email.MailSentEventTestFactory;
import de.ozgcloud.vorgang.command.CommandCreatedEventTestFactory;
import de.ozgcloud.vorgang.command.CommandTestFactory;
import de.ozgcloud.vorgang.command.Order;
import de.ozgcloud.vorgang.vorgang.Lock;
import de.ozgcloud.vorgang.vorgang.LockMapper;
import de.ozgcloud.vorgang.vorgang.LockTestFactory;
import de.ozgcloud.vorgang.vorgang.VorgangService;
import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
class ForwardingEventListenerTest {
......@@ -60,6 +66,10 @@ class ForwardingEventListenerTest {
private ApplicationEventPublisher publisher;
@Mock
private ForwardingRequestMapper forwardingRequestMapper;
@Mock
private VorgangService vorgangService;
@Mock
private LockMapper lockMapper;
@Nested
class OnForwardOrderCommand {
......@@ -99,29 +109,63 @@ class ForwardingEventListenerTest {
class TestOnForwardVorgangOrder {
private final CommandCreatedEvent event = event();
private final Lock lock = LockTestFactory.create();
@Captor
private ArgumentCaptor<Lock> lockCaptor;
@Captor
private ArgumentCaptor<ForwardingRequest> forwardingRequestCaptor;
@Captor
private ArgumentCaptor<VorgangLockedEvent> lockedEventCaptor;
@BeforeEach
void init() {
when(forwardingRequestMapper.fromCommand(event.getSource())).thenReturn(ForwardingRequestTestFactory.create());
when(forwardingRequestMapper.fromCommand(any())).thenReturn(ForwardingRequestTestFactory.create());
when(lockMapper.fromCommand(any())).thenReturn(lock);
}
@Test
void shouldMapLock() {
onForwardVorgangOrder();
verify(lockMapper).fromCommand(event.getSource());
}
@Test
void shouldLockVorgang() {
onForwardVorgangOrder();
verify(vorgangService).lockVorgang(lockCaptor.capture(), eq(VorgangTestFactory.ID), eq(CommandTestFactory.RELATION_VERSION));
assertThat(lockCaptor.getValue()).usingRecursiveComparison()
.isEqualTo(LockTestFactory.createBuilder().reason("Vorgang is being forwarded").build());
}
@Test
void shouldMapCommandForwardingRequest() {
listener.onForwardVorgangOrder(event);
onForwardVorgangOrder();
verify(forwardingRequestMapper).fromCommand(event.getSource());
}
@Test
void shouldCallForwardingService() {
listener.onForwardVorgangOrder(event);
onForwardVorgangOrder();
verify(forwardingService).forward(forwardingRequestCaptor.capture());
assertThat(forwardingRequestCaptor.getValue()).usingRecursiveComparison().isEqualTo(ForwardingRequestTestFactory.create());
}
@Test
void shouldPublishVorgangLockedEvent() {
onForwardVorgangOrder();
verify(publisher).publishEvent(lockedEventCaptor.capture());
assertThat(lockedEventCaptor.getValue().getCommand()).isSameAs(event.getSource());
}
private void onForwardVorgangOrder() {
listener.onForwardVorgangOrder(event);
}
private static CommandCreatedEvent event() {
return CommandCreatedEventTestFactory.create(CommandTestFactory.createBuilder().bodyObject(commandBody()).build());
}
......
......@@ -622,4 +622,15 @@ class ForwardingServiceTest {
}
}
@Nested
class TestForward {
@Test
void shouldSetStatusToWeitergeleitet() {
service.forward(ForwardingRequestTestFactory.create());
verify(statusService).setStatusToWeitergeleitet(VorgangTestFactory.ID, VorgangTestFactory.VERSION);
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment