diff --git a/alfa-service/pom.xml b/alfa-service/pom.xml index 525cf2e219bd65e3edfade89158b536bd1fc71d8..67e37c00dbdaa4eaadd4696180e0a39f18ed092e 100644 --- a/alfa-service/pom.xml +++ b/alfa-service/pom.xml @@ -132,16 +132,6 @@ <artifactId>mapstruct</artifactId> </dependency> - <!-- aspectJ --> - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjweaver</artifactId> - </dependency> - <dependency> - <groupId>org.aspectj</groupId> - <artifactId>aspectjrt</artifactId> - </dependency> - <!-- Dev --> <dependency> <groupId>org.projectlombok</groupId> diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java index b0413eb8dacc873c3cdeb3d98ba2ae1532b0302a..6886fd5c92ff3f7a0e3c7ff12c433d76cd4e7d58 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangProperties.java @@ -19,8 +19,7 @@ class VorgangProperties { public static final String PREFIX = "ozgcloud.vorgang"; /** - * Konfiguriert für welche Art von Anträgen der Button zur Erstellung von Bescheiden angezeigt wird. Der Art eines Antrags wird basierend auf form - * id und form engine name bestimmt. + * List of Vorgänge for which notices can be issued. */ private List<VorgangProperty> bescheid = Collections.emptyList(); @@ -29,7 +28,13 @@ class VorgangProperties { @Getter static class VorgangProperty { + /** + * ID of the received formular + */ private String formId; + /** + * Name of the form engine providing the used formular + */ private String formEngineName; } diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java index 763dadcc1fc104b2728193388416e3cc9d130a99..d39f9fdf782a0f534cd3f63d11df212f33e83cae 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/vorgang/VorgangWithEingangProzessor.java @@ -30,7 +30,6 @@ import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; -import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.Link; @@ -67,9 +66,6 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity static final String USER_PROFILE_SEARCH_DELETED_PARAM = "deleted"; static final String USER_PROFILE_SEARCH_ORGANISATIONS_EINHEIT_ID_PARAM = "organisationsEinheitId"; - private static final Predicate<EingangHeader> HAS_FORM_ID_WITH_ENGINE_NAME = - eingangHeader -> ObjectUtils.allNotNull(eingangHeader.getFormEngineName(), eingangHeader.getFormId()); - @Autowired private PostfachMailController postfachMailController; @Autowired @@ -104,7 +100,7 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity .ifMatch(HAS_REPRESENTATIONS) .addLink(vorgangWithEingang -> linkTo( methodOn(RepresentationController.class).getAllByEingang(vorgangWithEingang.getEingang().getId())) - .withRel(REL_REPRESENTATIONS)) + .withRel(REL_REPRESENTATIONS)) .ifMatch(this::isPostfachConfigured) .addLink(linkTo(methodOn(PostfachMailController.class).getAll(vorgang.getId())).withRel(REL_POSTFACH_MAILS)) .ifMatch(this::isEinheitlicherAnsprechpartner) @@ -148,16 +144,15 @@ class VorgangWithEingangProzessor implements RepresentationModelProcessor<Entity boolean hasVorgangCreateBescheidEnabled(VorgangWithEingang vorgang) { return ofNullable(vorgang.getEingang()) .map(Eingang::getHeader) - .filter(HAS_FORM_ID_WITH_ENGINE_NAME) .map(this::isCreateBescheidEnabled) .orElse(false); } private boolean isCreateBescheidEnabled(EingangHeader eingangHeader) { - return vorgangProperties.getBescheid().stream().filter(prop -> isFormIdAndFormEngineNameMatching(eingangHeader, prop)).count() > 0; + return vorgangProperties.getBescheid().stream().anyMatch(prop -> isFormIdAndFormEngineNameMatching(eingangHeader, prop)); } - private boolean isFormIdAndFormEngineNameMatching(EingangHeader eingangHeader, VorgangProperty prop) { - return prop.getFormId().equals(eingangHeader.getFormId()) && prop.getFormEngineName().equals(eingangHeader.getFormEngineName()); + private boolean isFormIdAndFormEngineNameMatching(EingangHeader eingangHeader, VorgangProperty property) { + return property.getFormId().equals(eingangHeader.getFormId()) && property.getFormEngineName().equals(eingangHeader.getFormEngineName()); } } \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/Jenkinsfile b/goofy-client/apps/goofy-e2e/Jenkinsfile index a2d3aaf4a684ca4d52a5ce2fc5ef1653d827d3d9..6cf3ad53c272f1997b0095b7e3124851f4cc5d2f 100644 --- a/goofy-client/apps/goofy-e2e/Jenkinsfile +++ b/goofy-client/apps/goofy-e2e/Jenkinsfile @@ -151,7 +151,7 @@ pipeline { script { FAILED_STAGE = env.STAGE_NAME - configFileProvider([configFile(fileId: 'kubeconfig-ovh-cluster', variable: 'KUBE_CONFIG')]) { + configFileProvider([configFile(fileId: 'kubeconfig-dev-okd-cluster', variable: 'KUBE_CONFIG')]) { sh 'mkdir ~/.kube' sh 'cp ${KUBE_CONFIG} ~/.kube/config' } @@ -705,7 +705,7 @@ Map getUserManagerDatabaseSecret(String namespace) { String getKeycloakUuid(realm, userName) { def shScript = """curl -H 'Content-Type: application/json' \ - -H 'Authorization: bearer ${getKeycloakAccessToken()}' \ + -H 'Authorization: bearer ${getKeycloakAccessToken(realm)}' \ 'https://${env.SSO_URL}/admin/realms/${realm}/users' """ @@ -720,12 +720,21 @@ String getKeycloakUuid(realm, userName) { } } -String getKeycloakAccessToken() { - withCredentials([usernamePassword(credentialsId: 'keycloak-ovh-cluster', usernameVariable: 'USER', passwordVariable: 'PASSWORD')]) { - def token = readJSON text: sh (script: 'curl -d "client_id=admin-cli" -d "username=$USER" -d "password=$PASSWORD" -d "grant_type=password" https://$SSO_URL/realms/master/protocol/openid-connect/token', returnStdout: true) +String getKeycloakAccessToken(String realm) { + userManagerApiUserCredentials = getUserManagerApiUserCredentials(realm) - return token.access_token - } + def token = readJSON text: sh (script: "set +x && curl -d \"client_id=admin-cli\" -d \"username=${userManagerApiUserCredentials.user}\" -d \"password=${userManagerApiUserCredentials.password}\" -d \"grant_type=password\" https://$SSO_URL/realms/$realm/protocol/openid-connect/token", returnStdout: true) + + return token.access_token +} + +Map getUserManagerApiUserCredentials(String namespace) { + userManagerApiUserCredentials = readJSON ( text: sh (script: "kubectl get secret usermanagerapiuser-credentials -n ${namespace} -o jsonpath={.data}", returnStdout: true)) + + return [ + "user": decodeString(userManagerApiUserCredentials.name), + "password": decodeString(userManagerApiUserCredentials.password) + ] } Void sendFailureMessage() { diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/argocd/by-ea-dev.yaml b/goofy-client/apps/goofy-e2e/src/fixtures/argocd/by-ea-dev.yaml index 0a18187db799a58c2400314050e44443e36d3599..0a7bac13ba55363111aa138ee5592e815b798fbb 100644 --- a/goofy-client/apps/goofy-e2e/src/fixtures/argocd/by-ea-dev.yaml +++ b/goofy-client/apps/goofy-e2e/src/fixtures/argocd/by-ea-dev.yaml @@ -1,7 +1,11 @@ kop: bezeichner: mastere2eea environment: dev - +e2eTest: true +project: + destinations: + - namespace: '*' + server: https://kubernetes.default.svc goofy: env: overrideSpringProfiles: "oc,ea,e2e,dev" @@ -14,6 +18,7 @@ goofy: - name: EINHEITLICHER_ANSPRECHPARTNER ingress: use_staging_cert: true + className: openshift-default baseUrl: dev.by.ozg-cloud.de pluto: @@ -44,4 +49,8 @@ user_manager: role: view-users - name: realm-management role: manage-users - baseUrl: dev.by.ozg-cloud.de \ No newline at end of file + baseUrl: dev.by.ozg-cloud.de + + ingress: + use_staging_cert: true + className: openshift-default \ No newline at end of file diff --git a/goofy-client/apps/goofy-e2e/src/fixtures/argocd/by-main-dev.yaml b/goofy-client/apps/goofy-e2e/src/fixtures/argocd/by-main-dev.yaml index 462ead53f18ef32acd8a7e141d64248564c562be..bd69db0457d9187ad5b1bef98bdb103d63065a77 100644 --- a/goofy-client/apps/goofy-e2e/src/fixtures/argocd/by-main-dev.yaml +++ b/goofy-client/apps/goofy-e2e/src/fixtures/argocd/by-main-dev.yaml @@ -1,7 +1,11 @@ kop: bezeichner: mastere2emain environment: dev - +e2eTest: true +project: + destinations: + - namespace: '*' + server: https://kubernetes.default.svc goofy: env: overrideSpringProfiles: "oc,e2e,dev" @@ -10,6 +14,7 @@ goofy: apiPassword: "Test1234!" ingress: use_staging_cert: true + className: openshift-default baseUrl: dev.by.ozg-cloud.de pluto: @@ -40,4 +45,8 @@ user_manager: role: view-users - name: realm-management role: manage-users - baseUrl: dev.by.ozg-cloud.de \ No newline at end of file + baseUrl: dev.by.ozg-cloud.de + + ingress: + use_staging_cert: true + className: openshift-default \ No newline at end of file diff --git a/goofy-server/pom.xml b/goofy-server/pom.xml index d8828e90c1595e36866312085376c49d5d71dfad..eef1d5ae068925c2f68e71b17f809dfcef184831 100644 --- a/goofy-server/pom.xml +++ b/goofy-server/pom.xml @@ -1,19 +1,20 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>de.itvsh.ozg</groupId> - <artifactId>goofy</artifactId> - <version>1.17.0-SNAPSHOT</version> - </parent> + <parent> + <groupId>de.itvsh.ozg</groupId> + <artifactId>goofy</artifactId> + <version>1.17.0-SNAPSHOT</version> + </parent> - <artifactId>goofy-server</artifactId> - <name>Goofy Server</name> - <groupId>de.itvsh.ozg</groupId> + <artifactId>goofy-server</artifactId> + <name>Goofy Server</name> + <groupId>de.itvsh.ozg</groupId> - <properties> - <maven.compiler.source>${java.version}</maven.compiler.source> - <maven.compiler.target>${java.version}</maven.compiler.target> + <properties> + <maven.compiler.source>${java.version}</maven.compiler.source> + <maven.compiler.target>${java.version}</maven.compiler.target> <spring-boot.build-image.imageName>docker.ozg-sh.de/goofy:build-latest</spring-boot.build-image.imageName> </properties> @@ -35,84 +36,96 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> + + <!-- aspectJ --> + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjweaver</artifactId> + </dependency> + <dependency> + <groupId>org.aspectj</groupId> + <artifactId>aspectjrt</artifactId> + </dependency> </dependencies> - <build> - <finalName>${project.artifactId}</finalName> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - <configuration> - <docker> - <publishRegistry> - <username>${docker-username}</username> - <password>${docker-password}</password> - <url>${docker-url}</url> - </publishRegistry> - </docker> - </configuration> - </plugin> + <build> + <finalName>${project.artifactId}</finalName> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <configuration> + <docker> + <publishRegistry> + <username>${docker-username}</username> + <password>${docker-password}</password> + <url>${docker-url}</url> + </publishRegistry> + </docker> + </configuration> + </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-failsafe-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - </plugin> - <plugin> - <groupId>org.jacoco</groupId> - <artifactId>jacoco-maven-plugin</artifactId> - </plugin> - <plugin> - <groupId>pl.project13.maven</groupId> - <artifactId>git-commit-id-plugin</artifactId> - </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>pl.project13.maven</groupId> + <artifactId>git-commit-id-plugin</artifactId> + </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-resources-plugin</artifactId> - <executions> - <execution> - <id>copy-client</id> - <phase>compile</phase> - <goals> - <goal>copy-resources</goal> - </goals> - <configuration> - <outputDirectory> - ${project.build.directory}/classes/META-INF/resources</outputDirectory> - <resources> - <resource> - <directory> - ../${project.parent.artifactId}-client/dist/apps/goofy/</directory> - </resource> - </resources> - </configuration> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <version>3.3.0</version> - <executions> - <execution> - <id>Jar Tests Package</id> - <phase>package</phase> - <goals> - <goal>test-jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <executions> + <execution> + <id>copy-client</id> + <phase>compile</phase> + <goals> + <goal>copy-resources</goal> + </goals> + <configuration> + <outputDirectory> + ${project.build.directory}/classes/META-INF/resources + </outputDirectory> + <resources> + <resource> + <directory> + ../${project.parent.artifactId}-client/dist/apps/goofy/ + </directory> + </resource> + </resources> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.3.0</version> + <executions> + <execution> + <id>Jar Tests Package</id> + <phase>package</phase> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> </project> diff --git a/goofy-server/src/main/java/de/ozgcloud/alfa/logging/AlfaAspectPointcuts.java b/goofy-server/src/main/java/de/ozgcloud/alfa/logging/AlfaAspectPointcuts.java new file mode 100644 index 0000000000000000000000000000000000000000..7f72dd6b7afa91fc5466381f258ddba7a6440003 --- /dev/null +++ b/goofy-server/src/main/java/de/ozgcloud/alfa/logging/AlfaAspectPointcuts.java @@ -0,0 +1,31 @@ +package de.ozgcloud.alfa.logging; + +import org.aspectj.lang.annotation.Pointcut; + +public class AlfaAspectPointcuts { + + @Pointcut("execution(public * *(..))") + void anyPublicMethods() { + // aspect pointcut - no implementation needed + } + + @Pointcut("within(de.ozgcloud..*)") + void anythingInOzgCloud() { + // aspect pointcut - no implementation needed + } + + @Pointcut("anyPublicMethods() && anythingInOzgCloud()") + void anyPublicMethodInOzgCloud() { + // aspect pointcut - no implementation needed + } + + @Pointcut("anyPublicMethodInOzgCloud() && @target(org.springframework.stereotype.Service)") + void anyPublicServiceMethod() { + // aspect pointcut - no implementation needed + } + + @Pointcut("anyPublicMethodInOzgCloud() && @target(org.springframework.web.bind.annotation.RestController)") + void anyPublicRestControllerMethod() { + // aspect pointcut - no implementation needed + } +} diff --git a/goofy-server/src/main/java/de/ozgcloud/alfa/logging/AlfaLoggingAspect.java b/goofy-server/src/main/java/de/ozgcloud/alfa/logging/AlfaLoggingAspect.java new file mode 100644 index 0000000000000000000000000000000000000000..2a422d1b4b3eebaea5b90f1fa9d01aab438f6a12 --- /dev/null +++ b/goofy-server/src/main/java/de/ozgcloud/alfa/logging/AlfaLoggingAspect.java @@ -0,0 +1,31 @@ +package de.ozgcloud.alfa.logging; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +import de.itvsh.kop.common.logging.AspectLoggingUtils; + +@Aspect +@Component +public class AlfaLoggingAspect extends AlfaAspectPointcuts { + + @Before("anyPublicServiceMethod() || anyPublicRestControllerMethod()") + public void onLoggedMethod(JoinPoint joinPoint) { + AspectLoggingUtils.log(joinPoint); + } + + @AfterThrowing(pointcut = "anyPublicServiceMethod() || anyPublicRestControllerMethod()", throwing = "ex") + public void afterExceptionInLoggedMethod(JoinPoint joinPoint, Exception ex) { + AspectLoggingUtils.logException(joinPoint, ex); + } + + @AfterReturning(pointcut = "anyPublicServiceMethod() || anyPublicRestControllerMethod()", returning = "returnValue") + public void afterLoggedMethod(JoinPoint joinPoint, Object returnValue) { + AspectLoggingUtils.logReturnValue(joinPoint, returnValue); + } + +}