diff --git a/Jenkinsfile b/Jenkinsfile index c1c240d05ef207061c0d3c6de725f2a7609ac9e8..0a5f73bb61823ed177c3685b8dbd252a54d8f864 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -341,20 +341,26 @@ Void setAnsibleKubeConfig() { Void checkoutProvisioningRepo(String stage) { withCredentials([usernamePassword(credentialsId: 'jenkins-gitea-access-token', passwordVariable: 'TOKEN', usernameVariable: 'USER')]) { dir(stage) { - sh 'git clone https://${USER}:${TOKEN}@git.ozg-sh.de/mgm/provisioning.git' + sh 'git clone https://${USER}:${TOKEN}@git.ozg-sh.de/mgm/provisioning.git' - // todo remove git checkout - //dir('provisioning') { - // sh 'git checkout ozg-2552-jenkins-e2e' - //} + if (env.BRANCH_NAME == 'release') { + dir('provisioning') { + sh 'git checkout release' + } + } } } } Void copyTestEnvironmentToDev(stage) { dir("${stage}/provisioning") { - def devEnvFile = "playbook/inventory/versions/dev.yml" - def testEnvFile = "playbook/inventory/versions/test.yml" + def devEnvFile = "inventories/group_vars/dev/versions" + def testEnvFile = "inventories/group_vars/test/versions" + + if (env.BRANCH_NAME == 'release') { + devEnvFile = "playbook/inventory/versions/dev.yml" + testEnvFile = "playbook/inventory/versions/test.yml" + } def devVersions = readYaml file: devEnvFile def testVersions = readYaml file: testEnvFile @@ -368,7 +374,11 @@ Void copyTestEnvironmentToDev(stage) { Void editEnvironemntVersion(String stage, String imageTag, Boolean isEa) { dir("${stage}/provisioning") { - def editFile = "playbook/inventory/versions/dev.yml" + def editFile = "inventories/group_vars/dev/versions" + + if (env.BRANCH_NAME == 'release') { + editFile = "playbook/inventory/versions/dev.yml" + } def devVersions = readYaml file: editFile @@ -380,8 +390,6 @@ Void editEnvironemntVersion(String stage, String imageTag, Boolean isEa) { devVersions.versions.goofy.image.tag = imageTag writeYaml file: editFile, data: devVersions, overwrite: true - - sh "cat ${editFile}" } } @@ -395,7 +403,12 @@ String getSpringProfile(Boolean isEa) { Void setupEaEnvironment(String stage) { dir("${stage}/provisioning") { - def editFile = "playbook/inventory/group_vars/all.yml" + def editFile = "inventories/group_vars/all/env" + + if (env.BRANCH_NAME == 'release') { + editFile = "playbook/inventory/group_vars/all.yml" + } + def groupVars = readYaml file: editFile groupVars.kop_einheitlicher_ansprechpartner = true @@ -406,7 +419,12 @@ Void setupEaEnvironment(String stage) { Void setPlutoDatabasePassword(String stage) { dir("${stage}/provisioning") { - def editFile = "playbook/inventory/versions/dev.yml" + def editFile = "inventories/group_vars/dev/versions" + + if (env.BRANCH_NAME == 'release') { + editFile = "playbook/inventory/versions/dev.yml" + } + def devVars = readYaml file: editFile devVars.values.pluto.database.password = "XnHhfznNWg65NNd" @@ -427,7 +445,7 @@ Void rolloutKopStack(String bezeichner, String stage) { "install_fs_adapter":false, \ "external_db_enabled":false}""" - sh "ansible-playbook playbook/rollout.yml --extra-vars '${ansibleVars}'" + sh "ansible-playbook playbooks/rollout.yml --extra-vars '${ansibleVars}'" } } } @@ -446,7 +464,7 @@ Void addKeycloakGroups(String bezeichner, String stage) { }""" dir("${stage}/provisioning") { - sh "ansible-playbook playbook/add-keycloak-group.yml --extra-vars '${ansibleVars}'" + sh "ansible-playbook playbooks/add-keycloak-group.yml --extra-vars '${ansibleVars}'" } } } @@ -466,7 +484,7 @@ Void addKeycloakUser(String bezeichner, String stage) { }""" dir("${stage}/provisioning") { - sh "ansible-playbook playbook/add-keycloak-user.yml --extra-vars '${ansibleVars}'" + sh "ansible-playbook playbooks/add-keycloak-user.yml --extra-vars '${ansibleVars}'" } } } @@ -479,7 +497,7 @@ Void deleteKopStack(String bezeichner, String stage) { "kop_env":"dev", \ "kop_bezeichner":${bezeichner}}""" - sh "ansible-playbook playbook/delete-commune.yml --extra-vars '${ansibleVars}'" + sh "ansible-playbook playbooks/delete-commune.yml --extra-vars '${ansibleVars}'" } } } diff --git a/goofy-client/libs/postfach/src/lib/postfach.module.ts b/goofy-client/libs/postfach/src/lib/postfach.module.ts index 73e5115ee1bee6a0e9e982106aca8e73328180bb..51873ed48f38cdce082bd9ff7acd6df11c9c46e0 100644 --- a/goofy-client/libs/postfach/src/lib/postfach.module.ts +++ b/goofy-client/libs/postfach/src/lib/postfach.module.ts @@ -27,7 +27,7 @@ const routes: Routes = [ { path: 'postfach', component: PostfachPageContainerComponent, - title: 'Postfach zum Vorgang | Alfa' + title: 'Nachrichten zum Vorgang | Alfa' } ]; diff --git a/goofy-client/libs/vorgang/src/lib/vorgang.module.ts b/goofy-client/libs/vorgang/src/lib/vorgang.module.ts index 6708cae6c7f1f88f6731bed39e7841c011927df2..49f433b03c481402f1680915ed115f5170cd5c7b 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: 'Alle Vorgänge | 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: 'Details zum Vorgang | Alfa' }, ]; diff --git a/goofy-client/pom.xml b/goofy-client/pom.xml index 641ca104804688f78f5e3ab96b556a2dc59bedda..45e6b5587379e4660ece10d816b5561dd8bd22c4 100644 --- a/goofy-client/pom.xml +++ b/goofy-client/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>de.itvsh.ozg</groupId> <artifactId>goofy</artifactId> - <version>0.31.0-SNAPSHOT</version> + <version>0.32.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml index ba4e53191ef5670c93764305b9e4d0a8c80f00fe..24c74564ce454a3a77092d6d223c435fd550431e 100644 --- a/goofy-server/pom.xml +++ b/goofy-server/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>de.itvsh.ozg</groupId> <artifactId>goofy</artifactId> - <version>0.31.0-SNAPSHOT</version> + <version>0.32.0-SNAPSHOT</version> </parent> <artifactId>goofy-server</artifactId> 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 diff --git a/pom.xml b/pom.xml index 6315b873457a7e59e27a0329eb9ad3ed0d470dc5..51643ab3571b1d4e1ee313fb5279b0915610573c 100644 --- a/pom.xml +++ b/pom.xml @@ -5,14 +5,14 @@ <groupId>de.itvsh.ozg</groupId> <artifactId>goofy</artifactId> - <version>0.31.0-SNAPSHOT</version> + <version>0.32.0-SNAPSHOT</version> <name>Goofy Parent</name> <packaging>pom</packaging> <parent> <groupId>de.itvsh.kop.common</groupId> <artifactId>kop-common-parent</artifactId> - <version>1.1.5</version> + <version>1.2.1</version> </parent> <modules> @@ -24,7 +24,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <pluto.version>0.31.0-SNAPSHOT</pluto.version> + <pluto.version>0.32.0-SNAPSHOT</pluto.version> <jsoup.version>1.15.1</jsoup.version> </properties>