diff --git a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts index 6708cae6c7f1f88f6731bed39e7841c011927df2..97443528a9bf246bf26f24fceae2859787daf3ed 100644 --- a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts +++ b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts @@ -20,7 +20,7 @@ const routes: Routes = [ { path: '', component: VorgangListPageContainerComponent, - title: 'Vorgang Übersichtsseite | Alfa' + title: 'Vorgang-Liste | Alfa' }, { path: 'search/:search', @@ -35,12 +35,12 @@ const routes: Routes = [ { path: 'myVorgaenge/search/:search', component: VorgangListPageContainerComponent, - title: 'Suchergebniss in meine Vorgänge | Alfa' + title: 'Suchergebnis in meine Vorgänge | Alfa' }, { path: 'vorgang/:vorgangWithEingangUrl', loadChildren: () => import('@goofy-client/vorgang-detail').then(m => m.VorgangDetailModule), - title: 'Vorgangdetails | Alfa' + title: 'Vorgang-Detailseite | Alfa' }, ]; diff --git a/goofy-server/src/main/java/de/itvsh/goofy/RootController.java b/goofy-server/src/main/java/de/itvsh/goofy/RootController.java index 97b2c40373c78b5024cc55eb7c6b5d917240e935..a2ea4de838cd30a4e69ea22ededfe7d03ecd62b4 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/RootController.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/RootController.java @@ -5,7 +5,9 @@ import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.time.Instant; import java.util.Optional; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.info.BuildProperties; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; @@ -31,15 +33,22 @@ public class RootController { static final String REL_MY_VORGAENGE = "myVorgaenge"; static final String REL_SEARCH_MY_VORGAENGE = "searchMyVorgaenge"; static final String REL_DOWNLOAD_TOKEN = "downloadToken"; + static final String REL_CURRENT_USER = "currentUser"; @Autowired(required = false) public BuildProperties buildProperties; @Autowired private CurrentUserService currentUserService; + @Value("${kop.user-manager.url:}") + private String userManagerUrl; + + @Value("${kop.user-manager.profile-template:}") + private String userProfileTemplate; + @GetMapping public EntityModel<RootResource> getRootResource() { - return ModelBuilder.fromEntity(new RootResource()) + var model = ModelBuilder.fromEntity(new RootResource()) .ifMatch(this::hasRole).addLinks( linkTo(RootController.class).withSelfRel(), linkTo(VorgangController.class).withRel(REL_VORGAENGE), @@ -50,6 +59,12 @@ public class RootController { buildVorgangListByPageLink(REL_MY_VORGAENGE, Optional.of(currentUserService.getUserId())), buildVorgangListByPageLink(REL_SEARCH_MY_VORGAENGE, Optional.of(currentUserService.getUserId()))) .buildModel(); + + getUserProfilesUrl().ifPresent(urlTemplate -> { + model.add(Link.of(String.format(urlTemplate, currentUserService.getUserId()), REL_CURRENT_USER)); + }); + + return model; } boolean hasRole() { @@ -61,6 +76,14 @@ public class RootController { || currentUserService.hasRole(UserRole.VERWALTUNG_POSTSTELLE); } + Optional<String> getUserProfilesUrl() { + if (StringUtils.isNotEmpty(userManagerUrl) && StringUtils.isNotEmpty(userProfileTemplate)) { + return Optional.of(userManagerUrl + userProfileTemplate); + } + + return Optional.empty(); + } + private Link buildVorgangListByPageLink(String linkRel, Optional<UserId> assignedTo) { return linkTo(methodOn(VorgangController.class).getVorgangListByPage(0, null, null, assignedTo)).withRel(linkRel); } diff --git a/goofy-server/src/main/resources/application-local.yml b/goofy-server/src/main/resources/application-local.yml index d9fb15b0f488f337653c6a468491e4c7aa08929b..e31341b5373e35f978cca6e7c4c24d3ea2bab468 100644 --- a/goofy-server/src/main/resources/application-local.yml +++ b/goofy-server/src/main/resources/application-local.yml @@ -5,7 +5,7 @@ logging: goofy: production: false - + keycloak: auth-server-url: http://localhost:8088/auth realm: sh-kiel-dev @@ -13,4 +13,9 @@ keycloak: server: error: - include-stacktrace: always \ No newline at end of file + include-stacktrace: always + +kop: + user-manager: + url: http://localhost:9092 + profile-template: /api/userProfiles/%s \ No newline at end of file diff --git a/goofy-server/src/main/resources/application.yml b/goofy-server/src/main/resources/application.yml index c42fb1cb1c35ac8e8bde5b43a3ef01c5706dd391..2e89353325d25d232a366d0d5209fe1f7d28c75e 100644 --- a/goofy-server/src/main/resources/application.yml +++ b/goofy-server/src/main/resources/application.yml @@ -76,4 +76,6 @@ kop: upload: maxFileSize: postfachNachrichtAttachment: 3MB - wiedervorlageAttachment: 40MB \ No newline at end of file + wiedervorlageAttachment: 40MB + user-manager: + profile-template: /api/userProfiles/%s \ No newline at end of file diff --git a/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java b/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java index bd32012c381f870f397df66abc0485a793c5c0db..9507c845040141269402a1171358c235b62dad91 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/RootControllerTest.java @@ -1,5 +1,6 @@ package de.itvsh.goofy; +import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -7,6 +8,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -22,9 +24,8 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import static org.assertj.core.api.Assertions.*; - import de.itvsh.goofy.common.user.CurrentUserService; +import de.itvsh.goofy.common.user.GoofyUserTestFactory; import de.itvsh.goofy.common.user.UserRole; import de.itvsh.goofy.common.user.UserTestFactory; @@ -160,6 +161,39 @@ class RootControllerTest { assertThat(model.getLinks()).isEmpty(); } } + + @DisplayName("current user") + @Nested + class CurrentUser { + @DisplayName("when usermanager url is configured") + @Nested + class UsermanagerUrlConfigured { + @Test + void shouldHaveCurrentUserLink() { + when(controller.getUserProfilesUrl()).thenReturn(Optional.of("http://localhost:9092/api/userProfiles/%s")); + when(currentUserService.getUserId()).thenReturn(GoofyUserTestFactory.ID); + + var model = controller.getRootResource(); + + assertThat(model.getLink(RootController.REL_CURRENT_USER)).isPresent().get().extracting(Link::getHref) + .isEqualTo(Link.of("http://localhost:9092/api/userProfiles/" + GoofyUserTestFactory.ID, RootController.REL_CURRENT_USER) + .getHref()); + } + } + + @DisplayName("when usermanager url is not configured") + @Nested + class UsermanagerUrlNotConfigured { + + @Test + void shouldNotHaveCurrentUserLink() { + var model = controller.getRootResource(); + + assertThat(model.getLink(RootController.REL_CURRENT_USER)).isNotPresent(); + } + } + + } } @Test