diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 26c000e1094ffed947886cb79662f6da2d0870fd..3a7f1d844cfada590c8071c687c29b02e4d63a18 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -16,9 +16,11 @@ <properties> <vorgang-manager.version>2.0.0-SNAPSHOT</vorgang-manager.version> + <api-lib.version>0.4.0-SNAPSHOT</api-lib.version> </properties> <dependencies> + <!-- ozg-cloud --> <dependency> <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager-interface</artifactId> @@ -39,36 +41,47 @@ <groupId>de.itvsh.kop.common</groupId> <artifactId>kop-common-lib</artifactId> </dependency> + <dependency> + <groupId>de.ozgcloud.api-lib</groupId> + <artifactId>api-lib-core</artifactId> + <version>${api-lib.version}</version> + </dependency> + + + <!-- spring --> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-freemarker</artifactId> + <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>net.devh</groupId> <artifactId>grpc-client-spring-boot-starter</artifactId> </dependency> - <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-webflux</artifactId> + <artifactId>spring-boot-starter-freemarker</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> </dependency> + <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-validation</artifactId> + <artifactId>spring-boot-configuration-processor</artifactId> + <optional>true</optional> </dependency> + + <!--dev tools--> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> </dependency> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-configuration-processor</artifactId> - <optional>true</optional> - </dependency> <!--TEST--> <dependency> diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java index 21f21a390743263028cb3e99d9071d4bf0348105..37273bd95c9f5bef775253353febdcac5ec351e3 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java @@ -6,7 +6,6 @@ import java.util.Optional; import java.util.function.Predicate; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.event.EventListener; import org.springframework.security.core.context.SecurityContext; @@ -21,10 +20,12 @@ import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandCreatedEvent; import de.ozgcloud.command.CommandFailedEvent; import lombok.NonNull; +import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @Log4j2 @Component +@RequiredArgsConstructor class BescheidEventListener { public static final String ORDER = "CREATE_BESCHEID"; @@ -39,17 +40,12 @@ class BescheidEventListener { private static final String ERROR_MESSAGE = "Error on executing Create Bescheid Command."; - @Autowired - private BescheidService service; - @Autowired - private BinaryFileService fileService; - @Autowired - private NachrichtService nachrichtService; + private final BescheidService service; + private final BinaryFileService fileService; + private final NachrichtService nachrichtService; - @Autowired - private ApplicationEventPublisher eventPublisher; - @Autowired - private CurrentUserService userService; + private final ApplicationEventPublisher eventPublisher; + private final CurrentUserService userService; @EventListener(condition = IS_CREATE_BESCHEID) public void onCreateBescheidCommand(CommandCreatedEvent event) { @@ -79,7 +75,7 @@ class BescheidEventListener { nachrichtService.createNachrichtDraft(bescheid); } - private BescheidRequest createRequest(Command command) { + BescheidRequest createRequest(Command command) { var eventBody = command.getBodyObject(); var builder = BescheidRequest.builder(); @@ -89,7 +85,7 @@ class BescheidEventListener { Optional.ofNullable(eventBody.get(GENEHMIGT_BODYKEY)) .map(Object::toString).map(Boolean::valueOf) .ifPresentOrElse(builder::genehmigt, () -> builder.genehmigt(true)); - builder.createFor(UserId.from(command.getCreatedBy())); + builder.createFor(userService.getUserProfile()); return builder.build(); } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java index 81b8750a77d9947c80ea10ed7938e844572fb670..26d88f90e6d56eec4f4727487e26cf9597107024 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java @@ -2,6 +2,7 @@ package de.ozgcloud.bescheid; import java.time.LocalDate; +import de.ozgcloud.bescheid.common.callcontext.UserProfile; import de.ozgcloud.bescheid.vorgang.VorgangId; import lombok.Builder; import lombok.Getter; @@ -15,5 +16,5 @@ public class BescheidRequest { private LocalDate bescheidVom; private boolean genehmigt; - private UserId createFor; + private UserProfile createFor; } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java index d84eeba12e80b461066147bb9afcf7b97c67d4dd..e8e788f37a11bd93ffabf17951377ed2cc16c76a 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java @@ -28,7 +28,6 @@ import java.util.Optional; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationTrustResolver; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -36,18 +35,30 @@ import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import de.itvsh.kop.common.errorhandling.TechnicalException; +import de.ozgcloud.apilib.user.OzgCloudUserId; +import de.ozgcloud.apilib.user.OzgCloudUserProfileService; import de.ozgcloud.command.Command; +import lombok.RequiredArgsConstructor; +@RequiredArgsConstructor @Service("bescheid_currentUserService") public class CurrentUserService { - @Autowired - private AuthenticationTrustResolver trustResolver; + private final AuthenticationTrustResolver trustResolver; + private final OzgCloudUserProfileService userProfileService; + private final UserProfileMapper mapper; public CallContextUser getUser() { return findUser().orElseThrow(() -> new IllegalStateException("No authenticated User found")); } + public UserProfile getUserProfile() { + return getUser().getUserId().map(OzgCloudUserId::from) + .map(userProfileService::getById) + .map(mapper::mapProfile).orElseThrow(() -> new TechnicalException("Unkown UserId or cannot load user profile.")); + } + public Optional<CallContextUser> findUser() { return findTrustedAuthentication() .map(this::mapToCallContextUser) diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfile.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfile.java new file mode 100644 index 0000000000000000000000000000000000000000..1cd483d3afedb2b08408fa9d1035394e01db604b --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfile.java @@ -0,0 +1,15 @@ +package de.ozgcloud.bescheid.common.callcontext; + +import de.ozgcloud.bescheid.UserId; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class UserProfile { + + private UserId id; + private String firstName; + private String lastName; + private String email; +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfileMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfileMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..7563fe9d5b54622db946ac118073d618a40ded92 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfileMapper.java @@ -0,0 +1,17 @@ +package de.ozgcloud.bescheid.common.callcontext; + +import org.mapstruct.Mapper; + +import de.ozgcloud.apilib.user.OzgCloudUserId; +import de.ozgcloud.apilib.user.OzgCloudUserProfile; +import de.ozgcloud.bescheid.UserId; + +@Mapper +public interface UserProfileMapper { + + UserProfile mapProfile(OzgCloudUserProfile userProfile); + + default UserId mapUserId(OzgCloudUserId id) { + return UserId.from(id.toString()); + } +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfileTestFactory.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfileTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..6c3af38e8d5b766849f6e0f46091609dfe3bfcb5 --- /dev/null +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/UserProfileTestFactory.java @@ -0,0 +1,30 @@ +package de.ozgcloud.bescheid.common.callcontext; + +import java.util.UUID; + +import com.thedeanda.lorem.LoremIpsum; + +import de.ozgcloud.bescheid.UserId; + +public class UserProfileTestFactory { + + private static final LoremIpsum LOREM_IPSUM = LoremIpsum.getInstance(); + + public static final UserId ID = UserId.from(UUID.randomUUID().toString()); + + public static final String FIRST_NAME = LOREM_IPSUM.getFirstName(); + public static final String LAST_NAME = LOREM_IPSUM.getLastName(); + public static final String EMAIL = "test-email@local"; + + public static UserProfile create() { + return createBuilder().build(); + } + + public static UserProfile.UserProfileBuilder createBuilder() { + return UserProfile.builder() + .id(ID) + .firstName(FIRST_NAME) + .lastName(LAST_NAME) + .email(EMAIL); + } +} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java index f23cac9489d4c17821a943889bbe6f2b24a76760..2a1c28171db8ca6b6b8abf88f1f5524b2247168b 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java @@ -18,8 +18,10 @@ import de.itvsh.kop.common.binaryfile.FileDataDeserializer; import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.BescheidRemoteService; import de.ozgcloud.bescheid.BescheidRequest; +import de.ozgcloud.bescheid.common.callcontext.UserProfile; import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData; import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.BescheidData; +import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData; import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.SmartDocument.Selection; import de.ozgcloud.bescheid.vorgang.Vorgang; import lombok.AllArgsConstructor; @@ -62,7 +64,7 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { .size(smartDocumentsFile.getDocument().getData().length()) .contentType(MediaType.APPLICATION_PDF_VALUE) .genehmigt(request.isGenehmigt()) - .createdBy(request.getCreateFor()) + .createdBy(request.getCreateFor().getId()) .vorgangId(request.getVorgangId()) .build(); } @@ -73,18 +75,27 @@ class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { .findAny().orElseThrow(() -> new IllegalStateException("No PDF File in SmartDocuments Response found.")); } - private SmartDocumentsRequest createRequest(BescheidRequest request, Vorgang vorgang) { + SmartDocumentsRequest createRequest(BescheidRequest request, Vorgang vorgang) { return logRequest(SmartDocumentsRequest.builder() .smartDocument(buildSDSection(vorgang)) .customerData( CustomerData.builder() .vorgang(vorgang) + .userData(buildUserData(request.getCreateFor())) .bescheid(BescheidData.builder().bescheidVom(request.getBescheidVom()).genehmigt(request.isGenehmigt()).build()) .build()) .build()); } + private UserData buildUserData(UserProfile userProfile) { + return UserData.builder() + .firstName(userProfile.getFirstName()) + .lastName(userProfile.getLastName()) + .email(userProfile.getEmail()) + .build(); + } + private SmartDocumentsRequest.SmartDocument buildSDSection(Vorgang vorgang) { return SmartDocumentsRequest.SmartDocument.builder().selection(Selection.builder() .templateGroup(properties.getTemplateGroup()) diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java index 099b2b68db23502fc0ad8d3243ebbd594eaab5fc..d842134f98b72ab6a3961ecef0f6aad924d90637 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java @@ -41,6 +41,7 @@ class SmartDocumentsRequest { static class UserData { private String firstName; private String lastName; + private String email; } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java index 1cc73bddcfd3c711907afbe5a949ae52b9567b8d..af8c9e728d73e8cd69c1a018cf8136a7392d39e1 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java @@ -21,6 +21,8 @@ import org.springframework.security.core.context.SecurityContext; import de.ozgcloud.bescheid.binaryfile.BinaryFileService; import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; +import de.ozgcloud.bescheid.common.callcontext.UserProfile; +import de.ozgcloud.bescheid.common.callcontext.UserProfileTestFactory; import de.ozgcloud.bescheid.nachricht.NachrichtService; import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.command.Command; @@ -107,6 +109,19 @@ class BescheidEventListenerTest { } } + @Nested + class CreateBescheidRequest { + @Test + void shouldContainUserProfile() { + UserProfile user = UserProfileTestFactory.create(); + when(userService.getUserProfile()).thenReturn(user); + + var request = listener.createRequest(command); + + assertThat(request.getCreateFor()).isSameAs(user); + } + } + @Nested class CreateBescheid { @@ -120,6 +135,7 @@ class BescheidEventListenerTest { void init() { when(service.createBescheid(any())).thenReturn(bescheid); when(fileService.uploadBescheidFile(any())).thenReturn(bescheidWithFileId); + when(userService.getUserProfile()).thenReturn(UserProfileTestFactory.create()); } @Test diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java index f26dfb8fc26b362af02f5616e254572c4feb650c..adbf4523c29c4d37128a2d484876a045d078762a 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java @@ -2,9 +2,9 @@ package de.ozgcloud.bescheid; import java.time.LocalDate; +import de.ozgcloud.bescheid.common.callcontext.UserProfileTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.command.CommandTestFactory; public class BescheidRequestTestFactory { @@ -22,7 +22,7 @@ public class BescheidRequestTestFactory { .vorgangId(VORGANG_ID) .bescheidVom(BESCHEID_VOM) .genehmigt(GENEHMIGT) - .createFor(UserId.from(CommandTestFactory.CREATED_BY)); + .createFor(UserProfileTestFactory.create()); } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java index 9dc6516cf33e6e1be8884f24345103b98f0c8b05..f8d6209b2ba488c27091ad796824407452bfd272 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java @@ -5,13 +5,13 @@ import java.io.File; import org.springframework.http.MediaType; import de.itvsh.kop.common.binaryfile.TempFileUtils; +import de.ozgcloud.bescheid.common.callcontext.UserProfileTestFactory; import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.command.CommandTestFactory; public class BescheidTestFactory { - public static final UserId CREATED_BY = UserId.from(CommandTestFactory.CREATED_BY); + public static final UserId CREATED_BY = UserProfileTestFactory.ID; public static final String FILE_NAME = "bescheid.pdf"; public static final byte[] TEST_BESCHEID = "testbescheid".getBytes(); diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java index d32357f1f42d50930781b0b49a1168979d603c5d..964102489b23ab66aedcad3409cf1e00075fa643 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java @@ -5,15 +5,22 @@ import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; +import org.mockito.Mock; import de.ozgcloud.bescheid.BescheidRequestTestFactory; import de.ozgcloud.bescheid.BescheidTestFactory; +import de.ozgcloud.bescheid.common.callcontext.UserProfileTestFactory; +import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData; +import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; class SmartDocumentsBescheidRemoteServiceTest { @InjectMocks private SmartDocumentsBescheidRemoteService service; + @Mock + private SmartDocumentsProperties properties; + @Nested class TestBuildBescheid { @@ -25,4 +32,15 @@ class SmartDocumentsBescheidRemoteServiceTest { } } + @Nested + class TestCreateRequest { + + @Test + void shouldFillUserData() { + var request = service.createRequest(BescheidRequestTestFactory.create(), VorgangTestFactory.create()); + + assertThat(request.getCustomerData().getUserData()).isNotNull() + .extracting(UserData::getEmail).isEqualTo(UserProfileTestFactory.EMAIL); + } + } }