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

OZG-5093 [wip] save bescheid draft

parent 07107594
Branches
Tags
No related merge requests found
Showing with 272 additions and 8 deletions
package de.ozgcloud.bescheid; package de.ozgcloud.bescheid;
import static java.util.Objects.*;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.function.Predicate; import java.util.function.Predicate;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContext;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import de.ozgcloud.bescheid.attacheditem.VorgangAttachedItemService; import de.ozgcloud.bescheid.attacheditem.BescheidItemService;
import de.ozgcloud.bescheid.attacheditem.OzgCloudCommandService;
import de.ozgcloud.bescheid.binaryfile.BinaryFileService; import de.ozgcloud.bescheid.binaryfile.BinaryFileService;
import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
import de.ozgcloud.bescheid.nachricht.NachrichtService; import de.ozgcloud.bescheid.nachricht.NachrichtService;
...@@ -20,6 +24,7 @@ import de.ozgcloud.bescheid.vorgang.VorgangId; ...@@ -20,6 +24,7 @@ import de.ozgcloud.bescheid.vorgang.VorgangId;
import de.ozgcloud.command.Command; import de.ozgcloud.command.Command;
import de.ozgcloud.command.CommandCreatedEvent; import de.ozgcloud.command.CommandCreatedEvent;
import de.ozgcloud.command.CommandFailedEvent; import de.ozgcloud.command.CommandFailedEvent;
import de.ozgcloud.command.VorgangAttachedItemCreatedEvent;
import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.common.errorhandling.TechnicalException;
import lombok.NonNull; import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -34,19 +39,25 @@ class BescheidEventListener { ...@@ -34,19 +39,25 @@ class BescheidEventListener {
private static final String IS_CREATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_COMMAND.test(event.getSource())}"; private static final String IS_CREATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_COMMAND.test(event.getSource())}";
public static final Predicate<Command> IS_CREATE_BESCHEID_COMMAND = command -> command.getOrder().equals(ORDER); public static final Predicate<Command> IS_CREATE_BESCHEID_DRAFT_COMMAND = command ->
OzgCloudCommandService.CREATE_ATTACHED_ITEM_ORDER.equals(command.getOrder())
|| OzgCloudCommandService.UPDATE_ATTACHED_ITEM_ORDER.equals(command.getOrder());
private static final String IS_CREATE_BESCHEID_DRAFT_FAILED = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_DRAFT_COMMAND.test(event.getSource())}";
private static final String TEMPLATE_GROUP_KIEL = "Kiel"; private static final String TEMPLATE_GROUP_KIEL = "Kiel";
static final String VORGANG_ID_BODYKEY = "vorgangId"; static final String VORGANG_ID_BODYKEY = "vorgangId";
static final String BESCHEID_VOM_BODYKEY = "bescheidVom"; static final String BESCHEID_VOM_BODYKEY = "bescheidVom";
static final String GENEHMIGT_BODYKEY = "genehmigt"; static final String GENEHMIGT_BODYKEY = "genehmigt";
static final String FIELD_RELATED_COMMAND_ID = "relatedCommandId";
private static final String ERROR_MESSAGE = "Error on executing Create Bescheid Command."; private static final String ERROR_MESSAGE = "Error on executing Create Bescheid Command.";
private final BescheidService service; private final BescheidService service;
private final BinaryFileService fileService; private final BinaryFileService fileService;
private final NachrichtService nachrichtService; private final NachrichtService nachrichtService;
private final VorgangAttachedItemService vorgangAttachedItemService; private final BescheidItemService bescheidItemService;
private final OzgCloudCommandService commandService;
private final ApplicationEventPublisher eventPublisher; private final ApplicationEventPublisher eventPublisher;
private final CurrentUserService userService; private final CurrentUserService userService;
...@@ -68,7 +79,7 @@ class BescheidEventListener { ...@@ -68,7 +79,7 @@ class BescheidEventListener {
eventPublisher.publishEvent(new BescheidCreatedEvent(command)); eventPublisher.publishEvent(new BescheidCreatedEvent(command));
return; return;
} }
vorgangAttachedItemService.createBescheidDraft(command); bescheidItemService.createBescheidDraft(command);
} catch (Exception e) { } catch (Exception e) {
LOG.error("Error on executing Create Bescheid Command. Command failed.", e); LOG.error("Error on executing Create Bescheid Command. Command failed.", e);
eventPublisher.publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(e))); eventPublisher.publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(e)));
...@@ -123,4 +134,25 @@ class BescheidEventListener { ...@@ -123,4 +134,25 @@ class BescheidEventListener {
} }
} }
@EventListener
public void onAttachedItemCreated(VorgangAttachedItemCreatedEvent event) {
var createBescheidCommandId = MapUtils.getString(event.getCommand().getBodyObject(), BescheidItemService.FIELD_RELATED_COMMAND_ID);
if (isNull(createBescheidCommandId)) {
return;
}
var createBescheidCommand = commandService.getCommand(createBescheidCommandId);
eventPublisher.publishEvent(new BescheidCreatedEvent(createBescheidCommand));
}
@EventListener(condition = IS_CREATE_BESCHEID_DRAFT_FAILED)
public void onCreateBescheidDraftFailed(CommandFailedEvent event) {
var objectBody = commandService.getCommand(event.getSource()).getBodyObject();
var createBescheidCommandId = MapUtils.getString(objectBody, BescheidItemService.FIELD_RELATED_COMMAND_ID);
if (isNull(createBescheidCommandId)) {
return;
}
var createBescheidCommand = commandService.getCommand(createBescheidCommandId);
eventPublisher.publishEvent(new CommandFailedEvent(createBescheidCommand.getId(), event.getErrorMessage()));
}
} }
package de.ozgcloud.bescheid.attacheditem;
import java.util.Map;
import lombok.Builder;
import lombok.Getter;
@Builder(toBuilder = true)
@Getter
public class BescheidItem {
// TODO
static final String[] SEND_BY_VALUES = { "POSTFACH", "MANUAL" };
public static final String FIELD_STATUS = "status";
public static final String FIELD_BESCHIEDEN_AM = "beschiedenAm";
public static final String FIELD_BEWILLIGT = "bewilligt";
public static final String FIELD_BESCHEID_DOCUMENT = "bescheidDocument";
public static final String FIELD_ATTACHMENTS = "attachments";
public static final String FIELD_SEND_BY = "sendBy";
public static final String FIELD_NACHRICHT_TEXT = "nachrichtText";
public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject";
private String id;
@Builder.Default
private long version = 0L;
private String client;
private String vorgangId;
private String itemName;
private Map<String, Object> bescheidData;
}
package de.ozgcloud.bescheid.attacheditem;
import static java.util.Objects.*;
import java.time.LocalDate;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Stream;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import de.ozgcloud.vorgang.common.GrpcObject;
import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse;
import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem;
@Component
public class BescheidMapper {
@Autowired
private GrpcObjectMapper grpcObjectMapper;
public Stream<BescheidItem> fromFindVorgangAttachedItemResponse(GrpcFindVorgangAttachedItemResponse grpcResponse) {
return grpcResponse.getVorgangAttachedItemsList().stream()
.map(this::mapFromVorgangAttachedItem);
}
BescheidItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item) {
return BescheidItem.builder()
.id(item.getId())
.version(item.getVersion())
.client(item.getClient())
.vorgangId(item.getVorgangId())
.itemName(item.getItemName())
.bescheidData(grpcObjectMapper.mapFromGrpc(item.getItem()))
.build();
}
List<FieldId> mapFromCollection(Collection<?> collection) {
return collection.stream().map(String::valueOf).map(this::mapFromString).toList();
}
FieldId mapFromString(String fieldId) {
return isNull(fieldId) ? null : FieldId.builder().id(fieldId).build();
}
}
package de.ozgcloud.bescheid.attacheditem;
import lombok.Builder;
import lombok.Getter;
@Builder
@Getter
class FieldId {
private String id;
}
package de.ozgcloud.bescheid.attacheditem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
import de.ozgcloud.vorgang.grpc.command.GrpcCallContext;
import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommandRequest;
import de.ozgcloud.vorgang.grpc.command.GrpcUser;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
class OzgCloudCommandRemoteService {
@GrpcClient("vorgang-manager")
private CommandServiceBlockingStub commandServiceStub;
@Autowired
private CurrentUserService userService;
@Autowired
private GrpcObjectMapper grpcObjectMapper;
public void createCommand(BescheidItem bescheid, String order) {
commandServiceStub.createCommand(buildCreateCommandRequest(bescheid, order));
}
GrpcCreateCommandRequest buildCreateCommandRequest(BescheidItem bescheid, String order) {
return GrpcCreateCommandRequest.newBuilder()
.setBodyObj(grpcObjectMapper.fromMap(bescheid.getBescheidData()))
.setCallContext(buildGrpcCallContext(bescheid.getClient()))
.setVorgangId(bescheid.getVorgangId())
.setRelationId(bescheid.getVorgangId())
.setRelationVersion(bescheid.getVersion())
.setOrderString(order)
.build();
}
GrpcCallContext buildGrpcCallContext(String client) {
return GrpcCallContext.newBuilder()
.setClient(client)
.setUser(buildUser())
.build();
}
GrpcUser buildUser() {
var user = userService.getUser();
return GrpcUser.newBuilder()
.setId(user.getUserId().toString())
.setName(user.getName())
.build();
}
}
package de.ozgcloud.bescheid.attacheditem;
import org.springframework.stereotype.Service;
import de.ozgcloud.command.Command;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class OzgCloudCommandService {
public static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM";
public static final String UPDATE_ATTACHED_ITEM_ORDER = "UPDATE_ATTACHED_ITEM";
private final OzgCloudCommandRemoteService remoteService;
public void createBescheidDraft(BescheidItem bescheid) {
remoteService.createCommand(bescheid, CREATE_ATTACHED_ITEM_ORDER);
}
public void updateBescheidDraft(BescheidItem bescheid) {
remoteService.createCommand(bescheid, UPDATE_ATTACHED_ITEM_ORDER);
}
public Command getCommand(String commandId) {
return null;
}
}
package de.ozgcloud.bescheid.attacheditem;
import static de.ozgcloud.bescheid.attacheditem.BescheidItemService.*;
import java.time.LocalDate;
import java.util.Comparator;
import java.util.Optional;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemRequest;
import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub;
import io.grpc.ClientInterceptor;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
@Log4j2
//@RequiredArgsConstructor
class VorgangAttachedItemRemoteService {
private static final Comparator<BescheidItem> BY_BESCHIEDEN_AM_DESC = (bescheid1, bescheid2) -> {
var beschiedenAm1 = LocalDate.parse(MapUtils.getString(bescheid1.getBescheidData(), BescheidItem.FIELD_BESCHIEDEN_AM));
var beschiedenAm2 = LocalDate.parse(MapUtils.getString(bescheid2.getBescheidData(), BescheidItem.FIELD_BESCHIEDEN_AM));
return beschiedenAm2.compareTo(beschiedenAm1);
};
@GrpcClient("vorgang-manager")
private VorgangAttachedItemServiceBlockingStub serviceStub;
@Autowired
private ClientInterceptor bescheidCallContextInterceptor;
@Autowired
private BescheidMapper bescheidMapper;
public Optional<BescheidItem> getBescheidDraft(String vorgangId) {
var grpcResponse = serviceStub.withInterceptors(bescheidCallContextInterceptor).find(buildFindRequest(vorgangId));
var bescheidItems = bescheidMapper.fromFindVorgangAttachedItemResponse(grpcResponse)
.filter(item -> BESCHEID_DRAFT_STATUS.equals(MapUtils.getString(item.getBescheidData(), BescheidItem.FIELD_STATUS)))
.sorted(BY_BESCHIEDEN_AM_DESC).toList();
if (bescheidItems.size() > 1) {
LOG.warn("Found more than one ({}) draft bescheid for vorgangId: {}. Return one with last beschiedenAm date", bescheidItems.size(),
vorgangId);
}
return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.get(0));
}
GrpcFindVorgangAttachedItemRequest buildFindRequest(String vorgangId) {
return GrpcFindVorgangAttachedItemRequest.newBuilder()
.setVorgangId(vorgangId)
.setItemName(BESCHEID_ITEM_NAME)
.build();
}
}
...@@ -21,7 +21,7 @@ import org.springframework.context.ApplicationEventPublisher; ...@@ -21,7 +21,7 @@ import org.springframework.context.ApplicationEventPublisher;
import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContext;
import org.springframework.test.util.ReflectionTestUtils; import org.springframework.test.util.ReflectionTestUtils;
import de.ozgcloud.bescheid.attacheditem.VorgangAttachedItemService; import de.ozgcloud.bescheid.attacheditem.BescheidItemService;
import de.ozgcloud.bescheid.binaryfile.BinaryFileService; import de.ozgcloud.bescheid.binaryfile.BinaryFileService;
import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService;
import de.ozgcloud.bescheid.common.callcontext.UserProfile; import de.ozgcloud.bescheid.common.callcontext.UserProfile;
...@@ -47,7 +47,7 @@ class BescheidEventListenerTest { ...@@ -47,7 +47,7 @@ class BescheidEventListenerTest {
@Mock @Mock
private NachrichtService nachrichtService; private NachrichtService nachrichtService;
@Mock @Mock
private VorgangAttachedItemService vorgangAttachedItemService; private BescheidItemService bescheidItemService;
@Mock @Mock
private ApplicationEventPublisher eventPublisher; private ApplicationEventPublisher eventPublisher;
...@@ -74,7 +74,7 @@ class BescheidEventListenerTest { ...@@ -74,7 +74,7 @@ class BescheidEventListenerTest {
listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command));
verify(listener).doCreateBescheidBiz(command); verify(listener).doCreateBescheidBiz(command);
verify(vorgangAttachedItemService, never()).createBescheidDraft(any()); verify(bescheidItemService, never()).createBescheidDraft(any());
} }
@Test @Test
...@@ -92,7 +92,7 @@ class BescheidEventListenerTest { ...@@ -92,7 +92,7 @@ class BescheidEventListenerTest {
listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command));
verify(vorgangAttachedItemService).createBescheidDraft(command); verify(bescheidItemService).createBescheidDraft(command);
} }
@Test @Test
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment