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

OZG-532 refactor: use event to finish command

parent 68736e03
Branches
Tags
No related merge requests found
Showing
with 177 additions and 52 deletions
...@@ -65,6 +65,6 @@ class EMailService { ...@@ -65,6 +65,6 @@ class EMailService {
void send(MimeMessage message, MailSendRequest request) { void send(MimeMessage message, MailSendRequest request) {
sender.send(message); sender.send(message);
publisher.publishEvent(new MailSendEvent(request)); publisher.publishEvent(new MailSentEvent(request));
} }
} }
...@@ -2,11 +2,11 @@ package de.itvsh.ozg.mail; ...@@ -2,11 +2,11 @@ package de.itvsh.ozg.mail;
import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEvent;
public class MailSendEvent extends ApplicationEvent { public class MailSentEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public MailSendEvent(MailSendRequest source) { public MailSentEvent(MailSendRequest source) {
super(source); super(source);
} }
......
...@@ -136,7 +136,7 @@ class EMailServiceTest { ...@@ -136,7 +136,7 @@ class EMailServiceTest {
void shouldTriggerEvent() { void shouldTriggerEvent() {
service.send(message, request); service.send(message, request);
verify(publisher).publishEvent(any(MailSendEvent.class)); verify(publisher).publishEvent(any(MailSentEvent.class));
} }
} }
} }
......
...@@ -180,6 +180,11 @@ ...@@ -180,6 +180,11 @@
</executions> </executions>
</plugin> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId> <artifactId>maven-failsafe-plugin</artifactId>
......
...@@ -6,6 +6,7 @@ import org.springframework.data.annotation.Id; ...@@ -6,6 +6,7 @@ import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Document;
import de.itvsh.ozg.pluto.vorgang.Vorgang.Status; import de.itvsh.ozg.pluto.vorgang.Vorgang.Status;
import de.itvsh.ozg.pluto.vorgang.redirect.RedirectRequest;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -29,7 +30,6 @@ public class Command { ...@@ -29,7 +30,6 @@ public class Command {
private CommandStatus status; private CommandStatus status;
private String relationId; private String relationId;
private long relationVersion; private long relationVersion;
private Order order; private Order order;
...@@ -38,5 +38,7 @@ public class Command { ...@@ -38,5 +38,7 @@ public class Command {
private Wiedervorlage wiedervorlage; private Wiedervorlage wiedervorlage;
private RedirectRequest redirectRequest;
private Kommentar kommentar; private Kommentar kommentar;
} }
package de.itvsh.ozg.pluto.command;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
public class CommandEventListener {
@Autowired
private CommandService commandService;
@EventListener
public void setStatusFinished(CommandExecutedEvent event) {
commandService.setCommandFinished(event.getSource().getId());
}
}
package de.itvsh.ozg.pluto.command;
import org.springframework.context.ApplicationEvent;
public class CommandExecutedEvent extends ApplicationEvent {
private static final long serialVersionUID = 1L;
protected CommandExecutedEvent(Command source) {
super(source);
}
@Override
public Command getSource() {
return (Command) super.getSource();
}
public Order getOrder() {
return getSource().getOrder();
}
}
...@@ -36,12 +36,12 @@ class CommandRepository { ...@@ -36,12 +36,12 @@ class CommandRepository {
Command.class); Command.class);
} }
void updateCommandStatusAndVersion(String commandId, CommandStatus status, long commandVersion) { void updateCommandStatusAndVersion(String commandId, CommandStatus status, long relationVersion) {
mongoOperations.updateFirst( mongoOperations.updateFirst(
query(where(MONGODB_ID).is(commandId)), query(where(MONGODB_ID).is(commandId)),
new Update() new Update()
.set(MONDODB_STATUS, status) .set(MONDODB_STATUS, status)
.set(MONDODB_RELATION_VERSION, commandVersion), .set(MONDODB_RELATION_VERSION, relationVersion),
Command.class); Command.class);
} }
......
...@@ -48,8 +48,8 @@ public class CommandService { ...@@ -48,8 +48,8 @@ public class CommandService {
return command; return command;
} }
public void setCommandFinished(String commandId, long version) { public void setCommandFinished(String commandId, long relationVersion) {
repository.updateCommandStatusAndVersion(commandId, CommandStatus.FINISHED, version); repository.updateCommandStatusAndVersion(commandId, CommandStatus.FINISHED, relationVersion);
} }
public Optional<Command> findCommand(String commandId) { public Optional<Command> findCommand(String commandId) {
......
...@@ -3,6 +3,7 @@ package de.itvsh.ozg.pluto.command; ...@@ -3,6 +3,7 @@ package de.itvsh.ozg.pluto.command;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import de.itvsh.ozg.pluto.vorgang.redirect.RedirectRequest;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;
...@@ -25,5 +26,7 @@ public class CreateCommandRequest { ...@@ -25,5 +26,7 @@ public class CreateCommandRequest {
private Wiedervorlage wiedervorlage; private Wiedervorlage wiedervorlage;
private RedirectRequest redirectRequest;
private Kommentar kommentar; private Kommentar kommentar;
} }
...@@ -16,9 +16,11 @@ import de.itvsh.ozg.pluto.grpc.command.GrpcCreateCommandRequest; ...@@ -16,9 +16,11 @@ import de.itvsh.ozg.pluto.grpc.command.GrpcCreateCommandRequest;
import de.itvsh.ozg.pluto.grpc.command.GrpcOrder; import de.itvsh.ozg.pluto.grpc.command.GrpcOrder;
import de.itvsh.ozg.pluto.grpc.command.GrpcUser; import de.itvsh.ozg.pluto.grpc.command.GrpcUser;
import de.itvsh.ozg.pluto.kommentar.GrpcKommentar; import de.itvsh.ozg.pluto.kommentar.GrpcKommentar;
import de.itvsh.ozg.pluto.vorgang.redirect.RedirectRequestMapper;
import de.itvsh.ozg.pluto.wiedervorlage.GrpcWiedervorlage; import de.itvsh.ozg.pluto.wiedervorlage.GrpcWiedervorlage;
@Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // @Mapper(uses = RedirectRequestMapper.class, //
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, //
nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, // nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, //
collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
public interface GrpcCreateCommandRequestMapper { public interface GrpcCreateCommandRequestMapper {
......
...@@ -12,7 +12,6 @@ import de.itvsh.ozg.pluto.command.CommandService; ...@@ -12,7 +12,6 @@ import de.itvsh.ozg.pluto.command.CommandService;
import de.itvsh.ozg.pluto.command.CreateCommandRequest; import de.itvsh.ozg.pluto.command.CreateCommandRequest;
import de.itvsh.ozg.pluto.command.GrpcCommandResponseMapper; import de.itvsh.ozg.pluto.command.GrpcCommandResponseMapper;
import de.itvsh.ozg.pluto.command.GrpcCreateCommandRequestMapper; import de.itvsh.ozg.pluto.command.GrpcCreateCommandRequestMapper;
import de.itvsh.ozg.pluto.command.Order;
import de.itvsh.ozg.pluto.common.errorhandling.NotFoundException; import de.itvsh.ozg.pluto.common.errorhandling.NotFoundException;
import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceImplBase; import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceImplBase;
import de.itvsh.ozg.pluto.grpc.command.GrpcCommand; import de.itvsh.ozg.pluto.grpc.command.GrpcCommand;
...@@ -37,16 +36,14 @@ class GrpcVorgangCommandService extends CommandServiceImplBase { ...@@ -37,16 +36,14 @@ class GrpcVorgangCommandService extends CommandServiceImplBase {
@Autowired @Autowired
private CommandService commandService; private CommandService commandService;
@Autowired
private VorgangService vorgangService;
@Autowired @Autowired
private GrpcCommandResponseMapper commandResponseMapper; private GrpcCommandResponseMapper commandResponseMapper;
@Autowired @Autowired
private GrpcCommandMapper grpcCommandMapper; private GrpcCommandMapper grpcCommandMapper;
@Autowired
private VorgangService vorgangService;
@Override @Override
public void createCommand(GrpcCreateCommandRequest grpcRequest, StreamObserver<GrpcCommandResponse> responseObserver) { public void createCommand(GrpcCreateCommandRequest grpcRequest, StreamObserver<GrpcCommandResponse> responseObserver) {
CreateCommandRequest request = createCommandRequestMapper.fromGrpc(grpcRequest); CreateCommandRequest request = createCommandRequestMapper.fromGrpc(grpcRequest);
...@@ -54,28 +51,19 @@ class GrpcVorgangCommandService extends CommandServiceImplBase { ...@@ -54,28 +51,19 @@ class GrpcVorgangCommandService extends CommandServiceImplBase {
Vorgang vorgang = vorgangService.getById(request.getRelationId()); Vorgang vorgang = vorgangService.getById(request.getRelationId());
Command command = commandService.persistCommand(request, vorgang.getStatus()); Command command = commandService.persistCommand(request, vorgang.getStatus());
Vorgang updatedVorgang = executeOrder(request); executeOrder(command);
setCommandFinished(request.getOrder(), command, updatedVorgang);
responseObserver.onNext(mapToGrpcResponse(findCommand(command.getId()))); responseObserver.onNext(mapToGrpcResponse(getCommand(command.getId())));
responseObserver.onCompleted(); responseObserver.onCompleted();
} }
Vorgang executeOrder(CreateCommandRequest request) { Vorgang executeOrder(Command command) {
return StatusOrder.getOrderMethod(request.getOrder()).executeOrder(vorgangService, request.getRelationId(), return StatusOrder.getOrderMethod(command.getOrder()).executeOrder(vorgangService, command);
request.getRelationVersion());
}
void setCommandFinished(Order requestOrder, Command command, Vorgang vorgang) {
if (requestOrder != Order.REDIRECT_VORGANG) {
commandService.setCommandFinished(command.getId(), vorgang.getVersion());
}
} }
@Override @Override
public void getCommand(GrpcGetCommandRequest request, StreamObserver<GrpcCommand> responseObserver) { public void getCommand(GrpcGetCommandRequest request, StreamObserver<GrpcCommand> responseObserver) {
Command command = findCommand(request.getId()); Command command = getCommand(request.getId());
responseObserver.onNext(grpcCommandMapper.toGrpc(command)); responseObserver.onNext(grpcCommandMapper.toGrpc(command));
responseObserver.onCompleted(); responseObserver.onCompleted();
...@@ -88,21 +76,21 @@ class GrpcVorgangCommandService extends CommandServiceImplBase { ...@@ -88,21 +76,21 @@ class GrpcVorgangCommandService extends CommandServiceImplBase {
proceedRevokeCommand(commandId); proceedRevokeCommand(commandId);
Command updatedCommand = findCommand(commandId); Command updatedCommand = getCommand(commandId);
responseObserver.onNext(mapToGrpcResponse(updatedCommand)); responseObserver.onNext(mapToGrpcResponse(updatedCommand));
responseObserver.onCompleted(); responseObserver.onCompleted();
} }
private void proceedRevokeCommand(String commandId) { void proceedRevokeCommand(String commandId) {
Command command = findCommand(commandId); Command command = getCommand(commandId);
vorgangService.updateStatus(command.getRelationId(), command.getRelationVersion(), command.getPreviousStatus()); vorgangService.revokeStatusChange(command);
commandService.setCommandRevoked(commandId); commandService.setCommandRevoked(commandId);
} }
private Command findCommand(String commandId) { Command getCommand(String commandId) {
return commandService.findCommand(commandId).orElseThrow(() -> new NotFoundException(Command.class, commandId)); return commandService.findCommand(commandId).orElseThrow(() -> new NotFoundException(Command.class, commandId));
} }
......
package de.itvsh.ozg.pluto.command.status; package de.itvsh.ozg.pluto.command.status;
import de.itvsh.ozg.pluto.command.Command;
import de.itvsh.ozg.pluto.command.Order; import de.itvsh.ozg.pluto.command.Order;
import de.itvsh.ozg.pluto.vorgang.Vorgang; import de.itvsh.ozg.pluto.vorgang.Vorgang;
import de.itvsh.ozg.pluto.vorgang.VorgangService; import de.itvsh.ozg.pluto.vorgang.VorgangService;
...@@ -23,7 +24,7 @@ enum StatusOrder { ...@@ -23,7 +24,7 @@ enum StatusOrder {
REDIRECT_VORGANG(VorgangService::redirect); REDIRECT_VORGANG(VorgangService::redirect);
interface OrderMethod { interface OrderMethod {
Vorgang executeOrder(VorgangService service, String vorgangId, long version); Vorgang executeOrder(VorgangService service, Command command);
} }
private OrderMethod method; private OrderMethod method;
......
package de.itvsh.ozg.pluto.vorgang;
import de.itvsh.ozg.pluto.command.Command;
import de.itvsh.ozg.pluto.command.CommandExecutedEvent;
public class StatusChangedEvent extends CommandExecutedEvent {
private static final long serialVersionUID = 1L;
StatusChangedEvent(Command source) {
super(source);
}
}
package de.itvsh.ozg.pluto.vorgang; package de.itvsh.ozg.pluto.vorgang;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import de.itvsh.ozg.pluto.command.Command;
import de.itvsh.ozg.pluto.common.errorhandling.NotFoundException; import de.itvsh.ozg.pluto.common.errorhandling.NotFoundException;
import de.itvsh.ozg.pluto.vorgang.Vorgang.Status; import de.itvsh.ozg.pluto.vorgang.Vorgang.Status;
...@@ -11,6 +13,8 @@ public class VorgangService { ...@@ -11,6 +13,8 @@ public class VorgangService {
@Autowired @Autowired
private VorgangRepository repository; private VorgangRepository repository;
@Autowired
private ApplicationEventPublisher publisher;
public void createVorgang(Eingang eingang) { public void createVorgang(Eingang eingang) {
repository.save(Vorgang.builder() repository.save(Vorgang.builder()
...@@ -19,39 +23,51 @@ public class VorgangService { ...@@ -19,39 +23,51 @@ public class VorgangService {
.build()); .build());
} }
public Vorgang setStatusNeu(String vorgangId, long version) { public Vorgang setStatusNeu(Command command) {
return updateStatus(vorgangId, version, Status.NEU); return executeStatusChangeCommand(command, Status.NEU);
}
public Vorgang annehmen(Command command) {
return executeStatusChangeCommand(command, Status.ANGENOMMEN);
} }
public Vorgang annehmen(String vorgangId, long version) { public Vorgang verwerfen(Command command) {
return updateStatus(vorgangId, version, Status.ANGENOMMEN); return executeStatusChangeCommand(command, Status.VERWORFEN);
} }
public Vorgang verwerfen(String vorgangId, long version) { public Vorgang bescheiden(Command command) {
return updateStatus(vorgangId, version, Status.VERWORFEN); return executeStatusChangeCommand(command, Status.BESCHIEDEN);
} }
public Vorgang bescheiden(String vorgangId, long version) { public Vorgang abschliessen(Command command) {
return updateStatus(vorgangId, version, Status.BESCHIEDEN); return executeStatusChangeCommand(command, Status.ABGESCHLOSSEN);
} }
public Vorgang abschliessen(String vorgangId, long version) { public Vorgang wiedereroeffnen(Command command) {
return updateStatus(vorgangId, version, Status.ABGESCHLOSSEN); return bearbeiten(command);
} }
public Vorgang wiedereroeffnen(String vorgangId, long version) { public Vorgang bearbeiten(Command command) {
return bearbeiten(vorgangId, version); return executeStatusChangeCommand(command, Status.IN_BEARBEITUNG);
} }
public Vorgang bearbeiten(String vorgangId, long version) { public Vorgang redirect(Command command) {
return updateStatus(vorgangId, version, Status.IN_BEARBEITUNG); return doUpdateStatus(command.getRelationId(), command.getRelationVersion(), Status.REDIRECT);
} }
public Vorgang redirect(String vorgangId, long version) { public Vorgang revokeStatusChange(Command command) {
return updateStatus(vorgangId, version, Status.REDIRECT); return doUpdateStatus(command.getRelationId(), command.getRelationVersion() + 1, command.getPreviousStatus());
}
Vorgang executeStatusChangeCommand(Command command, Status status) {
var vorgang = doUpdateStatus(command.getRelationId(), command.getRelationVersion(), status);
publisher.publishEvent(new StatusChangedEvent(command));
return vorgang;
} }
public Vorgang updateStatus(String vorgangId, long version, Status status) { Vorgang doUpdateStatus(String vorgangId, long version, Status status) {
repository.updateStatus(vorgangId, version, status); repository.updateStatus(vorgangId, version, status);
return getById(vorgangId); return getById(vorgangId);
......
package de.itvsh.ozg.pluto.vorgang.redirect; package de.itvsh.ozg.pluto.vorgang.redirect;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter @Getter
@Builder @Builder
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
public class RedirectRequest { public class RedirectRequest {
private String email; private String email;
......
package de.itvsh.ozg.pluto.vorgang.redirect;
import org.mapstruct.Mapper;
import de.itvsh.ozg.pluto.grpc.command.GrpcRedirectRequest;
@Mapper
public interface RedirectRequestMapper {
RedirectRequest fromGrpc(GrpcRedirectRequest request);
}
package de.itvsh.ozg.pluto.command;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
class CommandEventListenerTest {
@InjectMocks // NOSONAR
private CommandEventListener listener;
@Mock
private CommandService commandService;
@Nested
class TestCommandExecutedEventListener {
@Test
void shouldSetStatusFinished() {
listener.setStatusFinished(
CommandExecutedEventTestFactory.createFor(CommandTestFactory.create()));
verify(commandService).setCommandFinished(CommandTestFactory.ID);
}
}
}
package de.itvsh.ozg.pluto.command;
public class CommandExecutedEventTestFactory {
public static CommandExecutedEvent createFor(Command command) {
return new CommandExecutedEvent(command);
}
}
...@@ -14,8 +14,10 @@ public class CommandTestFactory { ...@@ -14,8 +14,10 @@ public class CommandTestFactory {
public static final String CREATED_BY = UserTestFactory.ID; public static final String CREATED_BY = UserTestFactory.ID;
public static final String CREATED_BY_NAME = UserTestFactory.NAME; public static final String CREATED_BY_NAME = UserTestFactory.NAME;
public static final CommandStatus STATUS = CommandStatus.PENDING; public static final CommandStatus STATUS = CommandStatus.PENDING;
public static final String RELATION_ID = VorgangTestFactory.ID; public static final String RELATION_ID = VorgangTestFactory.ID;
public static final long RELATION_VERSION = VorgangTestFactory.VERSION; public static final long RELATION_VERSION = VorgangTestFactory.VERSION;
public static final Order ORDER = Order.VORGANG_ANNEHMEN; public static final Order ORDER = Order.VORGANG_ANNEHMEN;
public static final Status PREV_STATUS = Status.NEU; public static final Status PREV_STATUS = Status.NEU;
public static final Wiedervorlage WIEDERVORLAGE = WiedervorlageTestFactory.create(); public static final Wiedervorlage WIEDERVORLAGE = WiedervorlageTestFactory.create();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment