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

PRJ-42 load vorgang from vorgang manager

parent e0766ee9
No related branches found
No related tags found
No related merge requests found
Showing
with 441 additions and 1 deletion
...@@ -28,7 +28,23 @@ ...@@ -28,7 +28,23 @@
<artifactId>pluto-command</artifactId> <artifactId>pluto-command</artifactId>
<version>${pluto.version}</version> <version>${pluto.version}</version>
</dependency> </dependency>
<dependency>
<groupId>de.itvsh.ozg.pluto</groupId>
<artifactId>pluto-interface</artifactId>
<version>${pluto.version}</version>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<!--TEST-->
<dependency> <dependency>
<groupId>de.itvsh.ozg.pluto</groupId> <groupId>de.itvsh.ozg.pluto</groupId>
<artifactId>pluto-command</artifactId> <artifactId>pluto-command</artifactId>
......
package de.ozgcloud.bescheid;
public class Bescheid {
}
...@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; ...@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component;
import de.itvsh.ozg.pluto.command.Command; import de.itvsh.ozg.pluto.command.Command;
import de.itvsh.ozg.pluto.command.CommandCreatedEvent; import de.itvsh.ozg.pluto.command.CommandCreatedEvent;
import de.ozgcloud.bescheid.vorgang.VorgangId;
@Component @Component
class BescheidEventListener { class BescheidEventListener {
...@@ -21,6 +22,7 @@ class BescheidEventListener { ...@@ -21,6 +22,7 @@ class BescheidEventListener {
public static final Predicate<Command> IS_CREATE_BESCHEID_COMMAND = command -> command.getOrder().equals(ORDER); public static final Predicate<Command> IS_CREATE_BESCHEID_COMMAND = command -> command.getOrder().equals(ORDER);
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";
...@@ -35,6 +37,7 @@ class BescheidEventListener { ...@@ -35,6 +37,7 @@ class BescheidEventListener {
private BescheidRequest createRequest(Map<String, Object> eventBody) { private BescheidRequest createRequest(Map<String, Object> eventBody) {
var builder = BescheidRequest.builder(); var builder = BescheidRequest.builder();
Optional.ofNullable(eventBody.get(VORGANG_ID_BODYKEY)).map(String.class::cast).map(VorgangId::from).ifPresent(builder::vorgangId);
Optional.ofNullable(eventBody.get(BESCHEID_VOM_BODYKEY)).map(LocalDate.class::cast).ifPresent(builder::bescheidVom); Optional.ofNullable(eventBody.get(BESCHEID_VOM_BODYKEY)).map(LocalDate.class::cast).ifPresent(builder::bescheidVom);
Optional.ofNullable(eventBody.get(GENEHMIGT_BODYKEY)).map(Boolean.class::cast).ifPresent(builder::genehmigt); Optional.ofNullable(eventBody.get(GENEHMIGT_BODYKEY)).map(Boolean.class::cast).ifPresent(builder::genehmigt);
......
package de.ozgcloud.bescheid;
import de.ozgcloud.bescheid.vorgang.Vorgang;
public interface BescheidRemoteService {
Bescheid create(BescheidRequest request, Vorgang vorgang);
}
...@@ -2,6 +2,7 @@ package de.ozgcloud.bescheid; ...@@ -2,6 +2,7 @@ package de.ozgcloud.bescheid;
import java.time.LocalDate; import java.time.LocalDate;
import de.ozgcloud.bescheid.vorgang.VorgangId;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
...@@ -9,6 +10,8 @@ import lombok.Getter; ...@@ -9,6 +10,8 @@ import lombok.Getter;
@Getter @Getter
public class BescheidRequest { public class BescheidRequest {
private VorgangId vorgangId;
private LocalDate bescheidVom; private LocalDate bescheidVom;
private boolean genehmigt; private boolean genehmigt;
} }
package de.ozgcloud.bescheid; package de.ozgcloud.bescheid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import de.ozgcloud.bescheid.vorgang.VorgangService;
@Service @Service
class BescheidService { class BescheidService {
@Autowired
private VorgangService vorgangService;
public void createBescheid(BescheidRequest request) { public void createBescheid(BescheidRequest request) {
var vorgang = vorgangService.getById(request.getVorgangId());
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
......
package de.ozgcloud.bescheid.vorgang;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
import lombok.Singular;
public interface FormDataEntry {
String getName();
String getLabel();
default boolean isSubForm() {
return false;
}
default boolean isFormEntry() {
return false;
}
@Builder
@Getter
static class SubForm implements FormDataEntry {
private String name;
private String label;
@Singular
private List<FormDataEntry> entries;
@Override
public boolean isSubForm() {
return true;
}
}
@Builder
@Getter
static class FormField implements FormDataEntry {
private String name;
private String label;
private Object value;
@Override
public boolean isFormEntry() {
return true;
}
}
}
package de.ozgcloud.bescheid.vorgang;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;
import de.itvsh.ozg.pluto.vorgang.GrpcFormField;
import de.itvsh.ozg.pluto.vorgang.GrpcSubForm;
import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField;
import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm;
@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR)
public interface FormDataEntryMapper {
@Mapping(target = "entries", source = "fieldList")
@Mapping(target = "entry", ignore = true)
@Mapping(target = "name", source = "title")
SubForm fromGrpc(GrpcSubForm subForm);
FormField fromGrpc(GrpcFormField field);
}
package de.ozgcloud.bescheid.vorgang;
import java.util.List;
import lombok.Builder;
import lombok.Getter;
import lombok.Singular;
@Builder
@Getter
public class Vorgang {
private VorgangId id;
private String name;
private String vorgangNummer;
private String aktenzeichen;
private Eingang eingang;
@Builder
@Getter
static class Eingang {
private Antragsteller antragsteller;
private ZustaendigeStelle zustaendigeStelle;
@Singular
private List<FormDataEntry> formEntries;
}
@Builder
@Getter
static class Antragsteller {
private String anrede;
private String nachname;
private String vorname;
private String geburtsdatum;
private String geburtsort;
private String geburtsname;
private String email;
private String telefon;
private String strasse;
private String hausnummer;
private String plz;
private String ort;
}
@Builder
@Getter
static class ZustaendigeStelle {
private String organisationseinheitenId;
private String email;
}
}
package de.ozgcloud.bescheid.vorgang;
import de.itvsh.kop.common.datatype.StringBasedValue;
public class VorgangId extends StringBasedValue {
VorgangId(String vorgangId) {
super(vorgangId);
}
public static VorgangId from(String vorgangId) {
return new VorgangId(vorgangId);
}
}
package de.ozgcloud.bescheid.vorgang;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;
import org.mapstruct.factory.Mappers;
import de.itvsh.ozg.pluto.vorgang.GrpcEingang;
import de.itvsh.ozg.pluto.vorgang.GrpcFormData;
import de.itvsh.ozg.pluto.vorgang.GrpcVorgangWithEingang;
@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, //
uses = FormDataEntryMapper.class)
interface VorgangMapper {
@Mapping(target = "vorgangNummer", source = "nummer")
Vorgang mapVorgang(GrpcVorgangWithEingang vorgang);
VorgangId mapVorgangId(String vorgangId);
@Mapping(target = "formEntries", source = "formData")
@Mapping(target = "formEntry", ignore = true)
Vorgang.Eingang mapEingang(GrpcEingang eingang);
default Collection<FormDataEntry> mapFormData(GrpcFormData value) {
var result = new ArrayList<FormDataEntry>();
var entryMapper = Mappers.getMapper(FormDataEntryMapper.class);
result.addAll(value.getFieldList().stream().map(entryMapper::fromGrpc).toList());
result.addAll(value.getFormList().stream().map(entryMapper::fromGrpc).toList());
return Collections.unmodifiableList(result);
}
}
package de.ozgcloud.bescheid.vorgang;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.itvsh.ozg.pluto.vorgang.GrpcFindVorgangWithEingangRequest;
import de.itvsh.ozg.pluto.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
import lombok.NonNull;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
class VorgangRemoteService {
@GrpcClient("pluto")
private VorgangServiceBlockingStub vorgangServiceStub;
@Autowired
private VorgangMapper mapper;
public Vorgang getById(@NonNull VorgangId vorgangId) {
var request = GrpcFindVorgangWithEingangRequest.newBuilder().setId(vorgangId.toString()).build();
var response = vorgangServiceStub.findVorgangWithEingang(request);
return mapper.mapVorgang(response.getVorgangWithEingang());
}
}
package de.ozgcloud.bescheid.vorgang;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class VorgangService {
@Autowired
public VorgangRemoteService remoteService;
public Vorgang getById(VorgangId id) {
return remoteService.getById(id);
}
}
...@@ -32,7 +32,10 @@ class BescheidEventListenerTest { ...@@ -32,7 +32,10 @@ class BescheidEventListenerTest {
@Captor @Captor
private ArgumentCaptor<BescheidRequest> requestCaptor; private ArgumentCaptor<BescheidRequest> requestCaptor;
private Command command = CommandTestFactory.createBuilder() private Command command = CommandTestFactory.createBuilder()
.bodyObject(Map.of(BESCHEID_VOM_BODYKEY, BESCHEID_VOM, GENEHMIGT_BODYKEY, GENEHMIGT)) .bodyObject(
Map.of(VORGANG_ID_BODYKEY, VORGANG_ID.toString(),
BESCHEID_VOM_BODYKEY, BESCHEID_VOM,
GENEHMIGT_BODYKEY, GENEHMIGT))
.build(); .build();
@Test @Test
......
...@@ -2,8 +2,12 @@ package de.ozgcloud.bescheid; ...@@ -2,8 +2,12 @@ package de.ozgcloud.bescheid;
import java.time.LocalDate; import java.time.LocalDate;
import de.ozgcloud.bescheid.vorgang.VorgangId;
import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
public class BescheidRequestTestFactory { public class BescheidRequestTestFactory {
static final VorgangId VORGANG_ID = VorgangTestFactory.ID;
static final String BESCHEID_VOM_STRING = "2023-01-04"; static final String BESCHEID_VOM_STRING = "2023-01-04";
static final LocalDate BESCHEID_VOM = LocalDate.parse(BESCHEID_VOM_STRING); static final LocalDate BESCHEID_VOM = LocalDate.parse(BESCHEID_VOM_STRING);
static final boolean GENEHMIGT = true; static final boolean GENEHMIGT = true;
...@@ -14,6 +18,7 @@ public class BescheidRequestTestFactory { ...@@ -14,6 +18,7 @@ public class BescheidRequestTestFactory {
static BescheidRequest.BescheidRequestBuilder createBuilder() { static BescheidRequest.BescheidRequestBuilder createBuilder() {
return BescheidRequest.builder() return BescheidRequest.builder()
.vorgangId(VORGANG_ID)
.bescheidVom(BESCHEID_VOM) .bescheidVom(BESCHEID_VOM)
.genehmigt(GENEHMIGT); .genehmigt(GENEHMIGT);
......
package de.ozgcloud.bescheid;
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 de.ozgcloud.bescheid.vorgang.VorgangService;
import de.ozgcloud.bescheid.vorgang.VorgangTestFactory;
class BescheidServiceTest {
@InjectMocks
private BescheidService service;
@Mock
private VorgangService vorgangService;
@Nested
class TestCreateBescheid {
@Test
void shouldLoadVorgang() {
service.createBescheid(BescheidRequestTestFactory.create());
verify(vorgangService).getById(VorgangTestFactory.ID);
}
}
}
package de.ozgcloud.bescheid.vorgang;
import de.itvsh.ozg.pluto.vorgang.GrpcEingang;
public class GrpcEingangTestFactory {
static GrpcEingang create() {
return createBuilder().build();
}
static GrpcEingang.Builder createBuilder() {
return GrpcEingang.newBuilder();
}
}
package de.ozgcloud.bescheid.vorgang;
import static de.ozgcloud.bescheid.vorgang.VorgangTestFactory.*;
import de.itvsh.ozg.pluto.vorgang.GrpcFindVorgangWithEingangResponse;
import de.itvsh.ozg.pluto.vorgang.GrpcVorgangWithEingang;
class GrpcVorgangWithEingangTestFactory {
static GrpcVorgangWithEingang create() {
return createBuilder().build();
}
static GrpcVorgangWithEingang.Builder createBuilder() {
return GrpcVorgangWithEingang.newBuilder()
.setId(ID.toString())
.setEingang(GrpcEingangTestFactory.create());
}
static GrpcFindVorgangWithEingangResponse createResponse() {
return GrpcFindVorgangWithEingangResponse.newBuilder()
.setVorgangWithEingang(create())
.build();
}
}
package de.ozgcloud.bescheid.vorgang;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
class VorgangMapperTest {
@InjectMocks
private VorgangMapperImpl mapper;
@Nested
class TestMapVorgang {
@Test
void shouldMapEingang() {
var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create());
assertThat(result.getEingang()).isNotNull();
}
@Test
void shouldMapVorgangId() {
var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create());
assertThat(result.getId()).isEqualTo(VorgangTestFactory.ID);
}
}
}
package de.ozgcloud.bescheid.vorgang;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import de.itvsh.ozg.pluto.vorgang.GrpcFindVorgangWithEingangRequest;
import de.itvsh.ozg.pluto.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub;
class VorgangRemoteServiceTest {
@Spy
@InjectMocks
private VorgangRemoteService service;
@Mock
private VorgangServiceBlockingStub serviceStub;
@Mock
private VorgangMapper mapper;
@Nested
class TestGetById {
@Captor
private ArgumentCaptor<GrpcFindVorgangWithEingangRequest> requestCaptor;
@BeforeEach
void init() {
when(mapper.mapVorgang(any())).thenReturn(VorgangTestFactory.create());
when(serviceStub.findVorgangWithEingang(any())).thenReturn(GrpcVorgangWithEingangTestFactory.createResponse());
}
@Test
void shouldCallStubWithId() {
service.getById(VorgangTestFactory.ID);
verify(serviceStub).findVorgangWithEingang(requestCaptor.capture());
assertThat(requestCaptor.getValue()).extracting(GrpcFindVorgangWithEingangRequest::getId).isEqualTo(VorgangTestFactory.ID.toString());
}
@Test
void shouldCallMapper() {
service.getById(VorgangTestFactory.ID);
verify(mapper).mapVorgang(any());
}
@Test
void shouldReturnVorgang() {
var vorgang = service.getById(VorgangTestFactory.ID);
assertThat(vorgang).usingRecursiveComparison().isEqualTo(VorgangTestFactory.create());
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment