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

OZG-1513 create and handle command for sending postfach nachricht;

Refactoring: allow order als string in grpc endpoint
parent 2bb6e3a9
No related branches found
No related tags found
No related merge requests found
Showing
with 129 additions and 33 deletions
package de.itvsh.kop.notification.antragsteller;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import de.itvsh.kop.notification.vorgang.Vorgang;
import de.itvsh.kop.notification.vorgang.VorgangId;
import de.itvsh.kop.notification.vorgang.VorgangService;
import de.itvsh.ozg.pluto.command.VorgangCreatedEvent;
import lombok.extern.log4j.Log4j2;
@Log4j2
@Component
public class AntragstellerNotificationEventListener {
......@@ -20,7 +24,14 @@ public class AntragstellerNotificationEventListener {
public void onVorgangCreated(VorgangCreatedEvent event) {
var vorgang = vorgangService.getVorgang(VorgangId.from(event.getSource()));
service.sendNotification(vorgang);
sendIfWithPostfach(vorgang);
}
private void sendIfWithPostfach(Vorgang vorgang) {
if (StringUtils.isBlank(vorgang.getPostfachId())) {
LOG.info("No PostfachId present on Vorgang '{}'.", vorgang.getId());
} else {
service.sendNotification(vorgang);
}
}
}
package de.itvsh.kop.notification.command;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.itvsh.ozg.pluto.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
class CommandRemoteService {
@GrpcClient("pluto")
......
......@@ -13,22 +13,23 @@ import org.springframework.stereotype.Service;
import de.itvsh.kop.notification.command.Command.CommandOrder;
import de.itvsh.kop.notification.postfach.PostfachNachricht;
@Service
@Service("notificationCommandService")
public class CommandService {
@Autowired
private CommandRemoteService commandRemoteService;
public void createSendPostfachNachrichtCommand(PostfachNachricht nachricht) {
buildCommand(nachricht);
commandRemoteService.createCommand(buildCommand(nachricht));
}
private void buildCommand(PostfachNachricht nachricht) {
Command.builder()
Command buildCommand(PostfachNachricht nachricht) {
return Command.builder()
.vorgangId(nachricht.getVorgangId())
.relationId(nachricht.getVorgangId().toString())
.order(CommandOrder.SEND_POSTFACH_NACHRICHT)
.body(toMap(nachricht));
.body(toMap(nachricht))
.build();
}
Map<String, Object> toMap(PostfachNachricht nachricht) {
......@@ -37,9 +38,7 @@ public class CommandService {
new BeanMap(nachricht).entrySet().stream()
.filter(entry -> Objects.nonNull(entry.getValue()))
.filter(entry -> !StringUtils.equals(entry.getKey().toString(), "class"))
.forEach(entry -> {
result.put(entry.getKey().toString(), entry.getValue());
});
.forEach(entry -> result.put(entry.getKey().toString(), entry.getValue()));
return Collections.unmodifiableMap(result);
}
......
......@@ -23,4 +23,8 @@ public class PostfachNachricht implements CommandBody {
private String subject;
private String message;
public String getReplyOption() {
return DEFAULT_REPLY_OPTION;
}
}
......@@ -3,7 +3,7 @@ package de.itvsh.kop.notification.vorgang;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@Service("notificationVorgangService")
public class VorgangService {
@Autowired
......
......@@ -48,5 +48,14 @@ class AntragstellerNotificationEventListenerTest {
verify(service).sendNotification(same(VORGANG));
}
@Test
void shouldNOTCallServiceOnMissingPostfach() {
when(vorgangService.getVorgang(any())).thenReturn(VorgangTestFactory.createBuilder().postfachId(null).build());
eventListener.onVorgangCreated(EVENT);
verify(service, never()).sendNotification(any());
}
}
}
package de.itvsh.kop.notification.command;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
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;
import org.mockito.Spy;
import de.itvsh.kop.notification.postfach.PostfachNachrichtTestFactory;
class CommandServiceTest {
@Spy
@InjectMocks
private CommandService service;
@Mock
private CommandRemoteService remoteService;
@Nested
class TestCreateSendPostfachNachrichtCommnad {
@Test
void shouldBuildCommand() {
service.createSendPostfachNachrichtCommand(PostfachNachrichtTestFactory.create());
verify(service).buildCommand(notNull());
}
@Test
void shouldCallRemoteService() {
var command = CommandTestFactory.create();
doReturn(command).when(service).buildCommand(any());
service.createSendPostfachNachrichtCommand(PostfachNachrichtTestFactory.create());
verify(remoteService).createCommand(command);
}
}
@Nested
class TestToMap {
......
......@@ -26,7 +26,8 @@ public class PostfachNachrichtTestFactory {
PostfachNachricht.FIELD_VORGANG_ID, VorgangTestFactory.ID,
PostfachNachricht.FIELD_POSTFACH_ID, VorgangTestFactory.POSTFACH_ID,
PostfachNachricht.FIELD_SUBJECT, SUBJECT,
PostfachNachricht.FIELD_MESSAGE, MESSAGE);
PostfachNachricht.FIELD_MESSAGE, MESSAGE,
PostfachNachricht.FIELD_REPLY_OPTION, PostfachNachricht.DEFAULT_REPLY_OPTION);
}
......
......@@ -4,7 +4,7 @@
<parent>
<groupId>de.itvsh.kop.common</groupId>
<artifactId>kop-common-dependencies</artifactId>
<version>1.1.2</version>
<version>1.1.3-SNAPSHOT</version>
<relativePath />
</parent>
......
......@@ -49,6 +49,12 @@
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>de.itvsh.kop.notification</groupId>
<artifactId>notification-manager</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
</dependency>
<!-- Spring -->
<dependency>
......
......@@ -16,8 +16,8 @@ class VorgangAttachedItemEventListener {
private static final String IS_CREATE_ITEM_ORDER_CONDITION = "{T(de.itvsh.ozg.pluto.attached_item.VorgangAttachedItemEventListener).IS_CREATE_ITEM_ORDER.test(event.getSource())}";
private static final String IS_UPDATE_ITEM_ORDER_CONDITION = "{T(de.itvsh.ozg.pluto.attached_item.VorgangAttachedItemEventListener).IS_UPDATE_ITEM_ORDER.test(event.getSource())}";
public static final Predicate<Command> IS_CREATE_ITEM_ORDER = command -> command.getOrder() == Order.CREATE_ATTACHED_ITEM;
public static final Predicate<Command> IS_UPDATE_ITEM_ORDER = command -> command.getOrder() == Order.UPDATE_ATTACHED_ITEM;
public static final Predicate<Command> IS_CREATE_ITEM_ORDER = command -> Order.CREATE_ATTACHED_ITEM.isMeant(command.getOrder());
public static final Predicate<Command> IS_UPDATE_ITEM_ORDER = command -> Order.UPDATE_ATTACHED_ITEM.isMeant(command.getOrder());
@Autowired
private VorgangAttachedItemService service;
......
......@@ -37,7 +37,7 @@ public class Command {
private String relationId;
private long relationVersion;
private Order order;
private String order;
private Status previousStatus;
private String errorMessage;
......
......@@ -12,6 +12,8 @@ import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import de.itvsh.ozg.pluto.common.callcontext.CallContextUser;
import de.itvsh.ozg.pluto.common.callcontext.CurrentUserService;
import de.itvsh.ozg.pluto.vorgang.Vorgang.Status;
@Service
......@@ -23,6 +25,9 @@ public class CommandService {
@Autowired
private ApplicationEventPublisher publisher;
@Autowired
private CurrentUserService userService;
public Command createCommand(CreateCommandRequest request) {
return createCommand(request, Optional.empty());
}
......@@ -48,11 +53,15 @@ public class CommandService {
currentVorgangStatus.ifPresent(builder::previousStatus);
builder = addUserIfExists(builder, Optional.ofNullable(request.getCallContext().getUser()));
builder = addUserIfExists(builder, Optional.ofNullable(request.getCallContext()).map(CallContext::getUser), userService.findUser());
return builder.build();
}
private Command.CommandBuilder addUserIfExists(Command.CommandBuilder builder, Optional<User> user) {
private Command.CommandBuilder addUserIfExists(Command.CommandBuilder builder, Optional<User> user, Optional<CallContextUser> contextUser) {
if (contextUser.isPresent()) {
return builder.createdBy(contextUser.get().getUserId().orElse(null)).createdByName(contextUser.get().getUserName().orElse(null));
}
return user.map(u -> builder.createdBy(u.getId()).createdByName(u.getName())).orElse(builder);
}
......
......@@ -27,7 +27,7 @@ public class CreateCommandRequest {
private Long relationVersion;
@NotNull
private Order order;
private String order;
private RedirectRequest redirectRequest;
......
......@@ -24,7 +24,14 @@ public interface GrpcCommandResponseMapper {
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "allFields", ignore = true)
@Mapping(target = "messageParametersList", source = "messageParameters")
@Mapping(target = "command.orderString", source = "command.order")
GrpcCommandResponse toGrpc(CommandResponse response);
GrpcOrder orderMapping(Order order);
default GrpcOrder orderMapping(String order) {
try {
return GrpcOrder.valueOf(order);
} catch (IllegalArgumentException e) {
return GrpcOrder.UNDEFINED;
}
};
}
......@@ -58,26 +58,24 @@ public class GrpcCommandService extends CommandServiceImplBase {
}
private Optional<Status> getActualStatus(CreateCommandRequest request) {
if (isRelatedToVorgang(request.getOrder())) {
if (isStatusChangeOrder(request.getOrder())) {
return Optional.of(getVorgang(request.getRelationId()).getStatus());
} else {
return Optional.empty();
}
}
boolean isRelatedToVorgang(Order order) {
return order != Order.FORWARD_SUCCESSFULL
&& order != Order.FORWARD_FAILED
&& order != Order.RESEND_POSTFACH_MAIL
&& order != Order.UPDATE_ATTACHED_ITEM;
boolean isStatusChangeOrder(String order) {
return order.startsWith("VORGANG");
}
private Vorgang getVorgang(String vorgangId) {
return vorgangService.getById(vorgangId);
}
// TODO implement event/listener system
void executeOrder(Command command) {
Optional.ofNullable(StatusOrder.getOrderMethod(command.getOrder()))
StatusOrder.getOrderMethod(command.getOrder())
.ifPresent(orderMethod -> orderMethod.executeOrder(vorgangService, command));
}
......@@ -146,7 +144,7 @@ public class GrpcCommandService extends CommandServiceImplBase {
return GrpcGetPendingCommandsResponse.newBuilder()
.addAllCommand(pendingCommands.stream()
.map(grpcCommandMapper::toGrpc)
.collect(Collectors.toList()))
.toList())
.build();
}
......
......@@ -27,8 +27,17 @@ public interface GrpcCreateCommandRequestMapper {
@Mapping(target = "bodyObject", source = "bodyObj")
@Mapping(target = "body", source = "bodyList")
@Mapping(target = "order", expression = "java(mapOrder(grpcRequest))")
CreateCommandRequest fromGrpc(GrpcCreateCommandRequest grpcRequest);
default String mapOrder(GrpcCreateCommandRequest request) {
if (StringUtils.isBlank(request.getOrderString())) {
return map(request.getOrder()).name();
} else {
return request.getOrderString();
}
}
@ValueMapping(source = "UNRECOGNIZED", target = MappingConstants.NULL)
@ValueMapping(source = "UNDEFINED", target = MappingConstants.NULL)
Order map(GrpcOrder grpcOrder);
......
package de.itvsh.ozg.pluto.command;
import org.apache.commons.lang3.StringUtils;
public enum Order {
VORGANG_ANNEHMEN,
......@@ -30,4 +32,8 @@ public enum Order {
CREATE_ATTACHED_ITEM,
UPDATE_ATTACHED_ITEM;
public boolean isMeant(String orderString) {
return StringUtils.equals(name(), orderString);
}
}
\ No newline at end of file
......@@ -62,7 +62,7 @@ class PersistPostfachMailByCommandService implements PersistPostfachMailService
.callContext(buildCallContext(userId))
.vorgangId(mail.getVorgangId())
.relationId(mail.getVorgangId()).relationVersion(-1L)
.order(Order.CREATE_ATTACHED_ITEM)
.order(Order.CREATE_ATTACHED_ITEM.name())
.bodyObject(buildItem(mail))
.build());
}
......
package de.itvsh.ozg.pluto.command;
import java.util.Optional;
import de.itvsh.ozg.pluto.vorgang.Vorgang;
import de.itvsh.ozg.pluto.vorgang.VorgangService;
import lombok.AllArgsConstructor;
......@@ -39,7 +41,13 @@ enum StatusOrder {
private OrderMethod method;
static OrderMethod getOrderMethod(Order order) {
return StatusOrder.valueOf(order.name()).method;
/** @deprecated please implement event/listener */
@Deprecated
static Optional<OrderMethod> getOrderMethod(String order) {
try {
return Optional.ofNullable(StatusOrder.valueOf(order).method);
} catch (IllegalArgumentException e) {
return Optional.empty();
}
}
}
\ 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