From e8354c3f6e988ef5892882575b96bb7b2e12cd4d Mon Sep 17 00:00:00 2001 From: Jottyfan Date: Sun, 6 Aug 2023 00:09:44 +0200 Subject: [PATCH] jakartarized --- build.gradle | 73 ++++++++-------- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 57 +++++-------- .../config/AuthorizationConfiguration.java | 78 ++++++++++++++++++ .../camporganizer/config/SecurityConfig.java | 66 --------------- .../config/SecurityConfiguration.java | 44 ++++++++++ .../module/admin/AdminController.java | 7 +- .../admin/AdminPrivilegesController.java | 5 +- .../module/admin/AdminPrivilegesService.java | 4 + .../module/admin/AdminRepository.java | 10 ++- .../module/admin/AdminService.java | 6 +- .../module/admin/{ => model}/CampBean.java | 6 +- .../admin/{ => model}/CampProfileBean.java | 6 +- .../admin/{ => model}/DocumentBean.java | 6 +- .../admin/{ => model}/IntKeyValueBean.java | 2 +- .../admin/{ => model}/LocationBean.java | 6 +- .../{ => model}/PrivilegesContainerBean.java | 2 +- .../module/admin/{ => model}/ProfileBean.java | 2 +- .../business/bookings/BookingsController.java | 8 +- .../{impl => }/BookingsRepository.java | 3 +- .../bookings/{impl => }/BookingsService.java | 10 +-- .../business/bookings/IBookingsService.java | 38 --------- .../{impl => model}/AddPaymentBean.java | 2 +- .../bookings/{impl => model}/BookerBean.java | 2 +- .../business/business/BusinessController.java | 11 +-- .../{impl => }/BusinessRepository.java | 4 +- .../business/business/BusinessService.java | 24 ++++++ .../business/business/IBusinessService.java | 30 ------- .../business/impl/BusinessService.java | 38 --------- .../{impl => model}/BusinessBean.java | 2 +- .../{impl => model}/CampBudgetBean.java | 2 +- .../module/business/camp/CampController.java | 25 ++---- .../camp/{impl => }/CampRepository.java | 4 +- .../business/camp/{impl => }/CampService.java | 16 ++-- .../module/business/camp/ICampService.java | 43 ---------- .../camp/{impl => model}/BookerBean.java | 2 +- .../camp/{impl => model}/BookingBean.java | 2 +- .../camp/{impl => model}/CampBean.java | 4 +- .../camp/{impl => model}/PersonBean.java | 2 +- .../privileges/PrivilegesController.java | 20 ++--- .../{impl => }/PrivilegesRepository.java | 4 +- .../{impl => }/PrivilegesService.java | 6 +- .../{impl => model}/PrivilegesBean.java | 2 +- .../{impl => model}/ProfileBean.java | 2 +- .../module/camplist/CamplistController.java | 16 ++-- .../module/camplist/CamplistGateway.java | 2 + .../module/camplist/CamplistService.java | 1 + .../module/camplist/CommonController.java | 35 ++++---- .../camplist/{ => model}/BookingBean.java | 2 +- .../camplist/{ => model}/DocumentBean.java | 2 +- .../{ => model}/LambdaResultWrapper.java | 2 +- .../camplist/{ => model}/ManifestBean.java | 2 +- .../confirmation/ConfirmationController.java | 17 ++-- .../{impl => }/ConfirmationRepository.java | 4 +- .../{impl => }/ConfirmationService.java | 44 ++++------ .../confirmation/IConfirmationService.java | 65 --------------- .../confirmation/SearchController.java | 13 +-- .../{impl => model}/BookingBean.java | 2 +- .../{impl => model}/CampOverviewBean.java | 2 +- .../{impl => model}/FoundBean.java | 2 +- .../confirmation/person/PersonController.java | 18 ++-- .../person/{impl => }/PersonRepository.java | 6 +- .../person/{impl => }/PersonService.java | 5 +- .../person/{impl => model}/CampBean.java | 2 +- .../person/{impl => model}/PersonBean.java | 2 +- .../module/dashboard/DashboardRepository.java | 4 +- .../module/dashboard/PersondocumentBean.java | 2 +- .../module/document/DocumentController.java | 2 +- .../module/ical/ICalController.java | 4 +- .../ical/{impl => }/ICalRepository.java | 2 +- .../module/ical/{impl => }/ICalService.java | 10 +-- .../module/ical/IICalService.java | 23 ------ .../camporganizer/module/mail/MailBean.java | 4 +- .../module/mail/MailRepository.java | 4 +- .../module/migration/MigrationBean.java | 4 +- .../module/migration/MigrationController.java | 2 +- .../module/migration/MigrationService.java | 2 +- .../registration/KeycloakRepository.java | 4 +- .../registration/RegistrationController.java | 4 +- .../registration/RegistrationRepository.java | 7 +- .../registration/RegistrationService.java | 4 +- .../registration/{ => model}/CampBean.java | 2 +- .../registration/{ => model}/ProfileBean.java | 2 +- .../{ => model}/RegistrationBean.java | 8 +- .../validate/TeacherAgeCheck.java | 4 +- .../validate/TeacherAgeCheckValidator.java | 4 +- .../registration/validate/UnusedUsername.java | 4 +- .../validate/UnusedUsernameValidator.java | 4 +- .../module/rss/RssController.java | 2 +- .../camporganizer/module/rss/RssService.java | 2 +- src/main/resources/application.properties | 16 ++-- 92 files changed, 446 insertions(+), 616 deletions(-) create mode 100644 src/main/java/de/jottyfan/camporganizer/config/AuthorizationConfiguration.java delete mode 100644 src/main/java/de/jottyfan/camporganizer/config/SecurityConfig.java create mode 100644 src/main/java/de/jottyfan/camporganizer/config/SecurityConfiguration.java rename src/main/java/de/jottyfan/camporganizer/module/admin/{ => model}/CampBean.java (97%) rename src/main/java/de/jottyfan/camporganizer/module/admin/{ => model}/CampProfileBean.java (87%) rename src/main/java/de/jottyfan/camporganizer/module/admin/{ => model}/DocumentBean.java (93%) rename src/main/java/de/jottyfan/camporganizer/module/admin/{ => model}/IntKeyValueBean.java (93%) rename src/main/java/de/jottyfan/camporganizer/module/admin/{ => model}/LocationBean.java (90%) rename src/main/java/de/jottyfan/camporganizer/module/admin/{ => model}/PrivilegesContainerBean.java (95%) rename src/main/java/de/jottyfan/camporganizer/module/admin/{ => model}/ProfileBean.java (95%) rename src/main/java/de/jottyfan/camporganizer/module/business/bookings/{impl => }/BookingsRepository.java (97%) rename src/main/java/de/jottyfan/camporganizer/module/business/bookings/{impl => }/BookingsService.java (70%) delete mode 100644 src/main/java/de/jottyfan/camporganizer/module/business/bookings/IBookingsService.java rename src/main/java/de/jottyfan/camporganizer/module/business/bookings/{impl => model}/AddPaymentBean.java (82%) rename src/main/java/de/jottyfan/camporganizer/module/business/bookings/{impl => model}/BookerBean.java (97%) rename src/main/java/de/jottyfan/camporganizer/module/business/business/{impl => }/BusinessRepository.java (95%) create mode 100644 src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessService.java delete mode 100644 src/main/java/de/jottyfan/camporganizer/module/business/business/IBusinessService.java delete mode 100644 src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessService.java rename src/main/java/de/jottyfan/camporganizer/module/business/business/{impl => model}/BusinessBean.java (97%) rename src/main/java/de/jottyfan/camporganizer/module/business/business/{impl => model}/CampBudgetBean.java (95%) rename src/main/java/de/jottyfan/camporganizer/module/business/camp/{impl => }/CampRepository.java (95%) rename src/main/java/de/jottyfan/camporganizer/module/business/camp/{impl => }/CampService.java (76%) delete mode 100644 src/main/java/de/jottyfan/camporganizer/module/business/camp/ICampService.java rename src/main/java/de/jottyfan/camporganizer/module/business/camp/{impl => model}/BookerBean.java (96%) rename src/main/java/de/jottyfan/camporganizer/module/business/camp/{impl => model}/BookingBean.java (94%) rename src/main/java/de/jottyfan/camporganizer/module/business/camp/{impl => model}/CampBean.java (93%) rename src/main/java/de/jottyfan/camporganizer/module/business/camp/{impl => model}/PersonBean.java (96%) rename src/main/java/de/jottyfan/camporganizer/module/business/privileges/{impl => }/PrivilegesRepository.java (95%) rename src/main/java/de/jottyfan/camporganizer/module/business/privileges/{impl => }/PrivilegesService.java (84%) rename src/main/java/de/jottyfan/camporganizer/module/business/privileges/{impl => model}/PrivilegesBean.java (96%) rename src/main/java/de/jottyfan/camporganizer/module/business/privileges/{impl => model}/ProfileBean.java (97%) rename src/main/java/de/jottyfan/camporganizer/module/camplist/{ => model}/BookingBean.java (99%) rename src/main/java/de/jottyfan/camporganizer/module/camplist/{ => model}/DocumentBean.java (89%) rename src/main/java/de/jottyfan/camporganizer/module/camplist/{ => model}/LambdaResultWrapper.java (93%) rename src/main/java/de/jottyfan/camporganizer/module/camplist/{ => model}/ManifestBean.java (90%) rename src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/{impl => }/ConfirmationRepository.java (97%) rename src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/{impl => }/ConfirmationService.java (50%) delete mode 100644 src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/IConfirmationService.java rename src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/{impl => model}/BookingBean.java (99%) rename src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/{impl => model}/CampOverviewBean.java (99%) rename src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/{impl => model}/FoundBean.java (99%) rename src/main/java/de/jottyfan/camporganizer/module/confirmation/person/{impl => }/PersonRepository.java (97%) rename src/main/java/de/jottyfan/camporganizer/module/confirmation/person/{impl => }/PersonService.java (74%) rename src/main/java/de/jottyfan/camporganizer/module/confirmation/person/{impl => model}/CampBean.java (93%) rename src/main/java/de/jottyfan/camporganizer/module/confirmation/person/{impl => model}/PersonBean.java (98%) rename src/main/java/de/jottyfan/camporganizer/module/ical/{impl => }/ICalRepository.java (98%) rename src/main/java/de/jottyfan/camporganizer/module/ical/{impl => }/ICalService.java (77%) delete mode 100644 src/main/java/de/jottyfan/camporganizer/module/ical/IICalService.java rename src/main/java/de/jottyfan/camporganizer/module/registration/{ => model}/CampBean.java (92%) rename src/main/java/de/jottyfan/camporganizer/module/registration/{ => model}/ProfileBean.java (94%) rename src/main/java/de/jottyfan/camporganizer/module/registration/{ => model}/RegistrationBean.java (96%) diff --git a/build.gradle b/build.gradle index 968bfb4..e49ea01 100644 --- a/build.gradle +++ b/build.gradle @@ -1,25 +1,20 @@ -buildscript { - ext { - springBootVersion = '2.7.4' - } - repositories { - mavenCentral() - } - dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") - } +plugins { + id 'org.springframework.boot' version '3.1.1' + id "io.spring.dependency-management" version "1.1.2" + id 'java' + id 'war' + id 'eclipse' + id 'application' } -apply plugin: 'java' -apply plugin: 'eclipse' -apply plugin: 'org.springframework.boot' -apply plugin: 'io.spring.dependency-management' -apply plugin: 'war' -apply plugin: 'application' - group = 'de.jottyfan.camporganizer' -version = '0.5.3' +version = '0.5.4' + +description = """CampOrganizer2""" + sourceCompatibility = 17 +targetCompatibility = 17 + mainClassName = "de.jottyfan.camporganizer.Main" repositories { @@ -27,16 +22,21 @@ repositories { maven { url "https://www.jottyfan.de/libs/" } -} - -ext { - set('keycloakVersion', '21.1.1') + maven { + url "https://repo.maven.apache.org/maven2" + } } war { - manifest { - attributes("Implementation-Version": version) + doFirst { + manifest { + attributes("Implementation-Title": project.name, + "Implementation-Version": version, + "Implementation-Timestamp": new Date()) + } } + baseName = project.name + version = version archiveName = 'CampOrganizer2.war' } @@ -54,11 +54,10 @@ dependencies { implementation 'net.sf.biweekly:biweekly:0.6.6' - implementation 'org.keycloak:keycloak-spring-boot-starter' - // for using the keycloak rest interface - implementation 'org.keycloak:keycloak-admin-client:21.1.1' - implementation 'org.jboss.resteasy:resteasy-client:5.0.0.Final' + implementation 'org.keycloak:keycloak-server-spi:22.0.1' + implementation 'org.keycloak:keycloak-admin-client:22.0.0' + implementation 'org.jboss.resteasy:resteasy-client:6.2.4.Final' // backward compatibility until the complete registration is converted to keycloak implementation 'org.jasypt:jasypt:1.9.3' @@ -72,19 +71,27 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-jooq' implementation 'org.springframework.boot:spring-boot-starter-security' + implementation "org.springframework.boot:spring-boot-starter-oauth2-client" + implementation 'org.springframework.security:spring-security-oauth2-authorization-server:1.1.1' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' implementation 'de.jottyfan:COJooq:2023.03' implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.0.0' + + implementation 'commons-io:commons-io:2.13.0' + runtimeOnly 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' } -dependencyManagement { - imports { - mavenBom "org.keycloak.bom:keycloak-adapter-bom:${keycloakVersion}" - } +test { + useJUnitPlatform() +} + +// add version to manifest +springBoot { + buildInfo() } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..41d9927a4d4fb3f96a785543079b8df6723c946b 100644 GIT binary patch delta 8958 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fbce071..41dfb87 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 744e882..9d9cdba 100755 --- a/gradlew +++ b/gradlew @@ -1,21 +1,5 @@ #!/usr/bin/env sh -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - ############################################################################## ## ## Gradle start up script for UN*X @@ -44,7 +28,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -72,7 +56,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MSYS* | MINGW* ) + MINGW* ) msys=true ;; NONSTOP* ) @@ -82,7 +66,6 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -126,11 +109,10 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -156,19 +138,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then else eval `echo args$i`="\"$arg\"" fi - i=`expr $i + 1` + i=$((i+1)) done case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -177,9 +159,14 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=`save "$@"` +APP_ARGS=$(save "$@") # Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +eval set -- $DEFAULT_JVM_OPTS --illegal-access=permit $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi exec "$JAVACMD" "$@" diff --git a/src/main/java/de/jottyfan/camporganizer/config/AuthorizationConfiguration.java b/src/main/java/de/jottyfan/camporganizer/config/AuthorizationConfiguration.java new file mode 100644 index 0000000..5248278 --- /dev/null +++ b/src/main/java/de/jottyfan/camporganizer/config/AuthorizationConfiguration.java @@ -0,0 +1,78 @@ +package de.jottyfan.camporganizer.config; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; +import org.springframework.security.oauth2.core.oidc.user.OidcUserAuthority; +import org.springframework.security.oauth2.core.user.OAuth2UserAuthority; + +/** + * + * @author jotty + * + */ +@Configuration +public class AuthorizationConfiguration { + + private static final String REALM_ACCESS_CLAIM = "realm_access"; + private static final String ROLES_CLAIM = "roles"; + private static final String RESOURCE_ACCESS_CLAIM = "resource_access"; + + @Value("${spring.security.oauth2.client.registration.keycloak.client-id}") + private String clientId; + + @Bean + GrantedAuthoritiesMapper userAuthoritiesMapperForKeycloak() { + return authorities -> { + Set mappedAuthorities = new HashSet<>(); + var authority = authorities.iterator().next(); + boolean isOidc = authority instanceof OidcUserAuthority; + + if (isOidc) { + var oidcUserAuthority = (OidcUserAuthority) authority; + var userInfo = oidcUserAuthority.getUserInfo(); + + if (userInfo.hasClaim(REALM_ACCESS_CLAIM)) { + var realmAccess = userInfo.getClaimAsMap(REALM_ACCESS_CLAIM); + @SuppressWarnings("unchecked") + var roles = (Collection) realmAccess.get(ROLES_CLAIM); + mappedAuthorities.addAll(generateAuthoritiesFromClaim(roles)); + } + if (userInfo.hasClaim(RESOURCE_ACCESS_CLAIM)) { + var resourceAccess = userInfo.getClaimAsMap(RESOURCE_ACCESS_CLAIM); + if (resourceAccess.containsKey(clientId)) { + @SuppressWarnings("unchecked") + var roles = (Collection) ((Map) resourceAccess.get(clientId)).get(ROLES_CLAIM); + mappedAuthorities.addAll(generateAuthoritiesFromClaim(roles)); + } + } + } else { + var oauth2UserAuthority = (OAuth2UserAuthority) authority; + Map userAttributes = oauth2UserAuthority.getAttributes(); + + if (userAttributes.containsKey(REALM_ACCESS_CLAIM)) { + @SuppressWarnings("unchecked") + var realmAccess = (Map) userAttributes.get(REALM_ACCESS_CLAIM); + @SuppressWarnings("unchecked") + var roles = (Collection) realmAccess.get(ROLES_CLAIM); + mappedAuthorities.addAll(generateAuthoritiesFromClaim(roles)); + } + } + + return mappedAuthorities; + }; + } + + private Collection generateAuthoritiesFromClaim(Collection roles) { + return roles.stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role)).collect(Collectors.toList()); + } +} diff --git a/src/main/java/de/jottyfan/camporganizer/config/SecurityConfig.java b/src/main/java/de/jottyfan/camporganizer/config/SecurityConfig.java deleted file mode 100644 index 4a2f6ab..0000000 --- a/src/main/java/de/jottyfan/camporganizer/config/SecurityConfig.java +++ /dev/null @@ -1,66 +0,0 @@ -package de.jottyfan.camporganizer.config; - -import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; -import org.keycloak.adapters.springsecurity.KeycloakConfiguration; -import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; -import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; -import org.keycloak.adapters.springsecurity.management.HttpSessionManager; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; -import org.springframework.security.core.session.SessionRegistryImpl; -import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; -import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; - -/** - * - * @author jotty - * - */ -@KeycloakConfiguration -@ComponentScan(basePackageClasses = KeycloakSpringBootConfigResolver.class) -@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) -public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter { - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); - keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper()); - auth.authenticationProvider(keycloakAuthenticationProvider); - } - - @Bean - public KeycloakSpringBootConfigResolver KeycloakConfigResolver() { - return new KeycloakSpringBootConfigResolver(); - } - - @Bean - @Override - @ConditionalOnMissingBean(HttpSessionManager.class) - protected HttpSessionManager httpSessionManager() { - return new HttpSessionManager(); - } - - @Bean - @Override - protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { - return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - super.configure(http); - http.authorizeRequests() - // @formatter:off - .antMatchers("/dashboard/**", "/business/**", "/confirmation/**").authenticated() - .anyRequest().permitAll(); - // @formatter:on -// http.anonymous().disable(); - http.csrf().disable(); - } -} \ No newline at end of file diff --git a/src/main/java/de/jottyfan/camporganizer/config/SecurityConfiguration.java b/src/main/java/de/jottyfan/camporganizer/config/SecurityConfiguration.java new file mode 100644 index 0000000..54bea71 --- /dev/null +++ b/src/main/java/de/jottyfan/camporganizer/config/SecurityConfiguration.java @@ -0,0 +1,44 @@ +package de.jottyfan.camporganizer.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.Customizer; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.oauth2.client.oidc.web.logout.OidcClientInitiatedLogoutSuccessHandler; +import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.session.NullAuthenticatedSessionStrategy; +import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; + +/** + * + * @author jotty + * + */ +@Configuration +@EnableWebSecurity +@EnableMethodSecurity +public class SecurityConfiguration { + + @Bean + protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { + return new NullAuthenticatedSessionStrategy(); + } + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity sec, InMemoryClientRegistrationRepository crr) + throws Exception { + sec.csrf(o -> o.disable()).anonymous(o -> o.disable()) + // @formatter:off + .oauth2Login(o -> o.defaultSuccessUrl("/")) + .logout(o -> o.logoutSuccessHandler(new OidcClientInitiatedLogoutSuccessHandler(crr))) + .authorizeHttpRequests(o -> o.requestMatchers("/dashboard/**", "/business/**", "/confirmation/**").authenticated() + .anyRequest().permitAll()) + .oauth2ResourceServer(o -> o.jwt(Customizer.withDefaults())) + .sessionManagement(o -> o.init(sec)); + // @formatter:on + return sec.build(); + } + } diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java index 69cae31..eaa3ab9 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java @@ -1,7 +1,7 @@ package de.jottyfan.camporganizer.module.admin; -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -17,6 +17,9 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import de.jottyfan.camporganizer.module.admin.model.CampBean; +import de.jottyfan.camporganizer.module.admin.model.DocumentBean; +import de.jottyfan.camporganizer.module.admin.model.LocationBean; import de.jottyfan.camporganizer.module.camplist.CommonController; import de.jottyfan.camporganizer.module.mail.MailBean; diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesController.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesController.java index e11edf5..4905aff 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesController.java @@ -2,7 +2,7 @@ package de.jottyfan.camporganizer.module.admin; import java.util.List; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -14,6 +14,9 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; +import de.jottyfan.camporganizer.module.admin.model.CampBean; +import de.jottyfan.camporganizer.module.admin.model.CampProfileBean; +import de.jottyfan.camporganizer.module.admin.model.ProfileBean; import de.jottyfan.camporganizer.module.camplist.CommonController; /** diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesService.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesService.java index 63b4a7d..6fc6642 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminPrivilegesService.java @@ -6,6 +6,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; +import de.jottyfan.camporganizer.module.admin.model.CampBean; +import de.jottyfan.camporganizer.module.admin.model.CampProfileBean; +import de.jottyfan.camporganizer.module.admin.model.PrivilegesContainerBean; +import de.jottyfan.camporganizer.module.admin.model.ProfileBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminRepository.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminRepository.java index 46b4b78..5b7d560 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminRepository.java @@ -16,7 +16,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -53,7 +53,13 @@ import de.jottyfan.camporganizer.db.jooq.tables.records.TDocumentroleRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TLocationRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TProfileRecord; -import de.jottyfan.camporganizer.module.camplist.LambdaResultWrapper; +import de.jottyfan.camporganizer.module.admin.model.CampBean; +import de.jottyfan.camporganizer.module.admin.model.DocumentBean; +import de.jottyfan.camporganizer.module.admin.model.IntKeyValueBean; +import de.jottyfan.camporganizer.module.admin.model.LocationBean; +import de.jottyfan.camporganizer.module.admin.model.PrivilegesContainerBean; +import de.jottyfan.camporganizer.module.admin.model.ProfileBean; +import de.jottyfan.camporganizer.module.camplist.model.LambdaResultWrapper; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java index d7b30d1..437539c 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java @@ -5,7 +5,7 @@ import static de.jottyfan.camporganizer.db.jooq.Tables.T_DOCUMENT; import java.io.IOException; import java.util.List; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -13,6 +13,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.jottyfan.camporganizer.db.jooq.enums.EnumDocument; +import de.jottyfan.camporganizer.module.admin.model.CampBean; +import de.jottyfan.camporganizer.module.admin.model.DocumentBean; +import de.jottyfan.camporganizer.module.admin.model.LocationBean; +import de.jottyfan.camporganizer.module.admin.model.ProfileBean; import de.jottyfan.camporganizer.module.mail.MailBean; import de.jottyfan.camporganizer.module.mail.MailRepository; diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/CampBean.java b/src/main/java/de/jottyfan/camporganizer/module/admin/model/CampBean.java similarity index 97% rename from src/main/java/de/jottyfan/camporganizer/module/admin/CampBean.java rename to src/main/java/de/jottyfan/camporganizer/module/admin/model/CampBean.java index 5b3c9b2..9b51b0b 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/CampBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/model/CampBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.admin; +package de.jottyfan.camporganizer.module.admin.model; import java.io.Serializable; import java.time.LocalDate; @@ -7,8 +7,8 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import org.springframework.format.annotation.DateTimeFormat; diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/CampProfileBean.java b/src/main/java/de/jottyfan/camporganizer/module/admin/model/CampProfileBean.java similarity index 87% rename from src/main/java/de/jottyfan/camporganizer/module/admin/CampProfileBean.java rename to src/main/java/de/jottyfan/camporganizer/module/admin/model/CampProfileBean.java index 543b403..b611d7c 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/CampProfileBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/model/CampProfileBean.java @@ -1,9 +1,9 @@ -package de.jottyfan.camporganizer.module.admin; +package de.jottyfan.camporganizer.module.admin.model; import java.io.Serializable; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/DocumentBean.java b/src/main/java/de/jottyfan/camporganizer/module/admin/model/DocumentBean.java similarity index 93% rename from src/main/java/de/jottyfan/camporganizer/module/admin/DocumentBean.java rename to src/main/java/de/jottyfan/camporganizer/module/admin/model/DocumentBean.java index 1c0dfd4..46d1812 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/DocumentBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/model/DocumentBean.java @@ -1,12 +1,12 @@ -package de.jottyfan.camporganizer.module.admin; +package de.jottyfan.camporganizer.module.admin.model; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.util.Base64; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import org.apache.commons.io.IOUtils; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/IntKeyValueBean.java b/src/main/java/de/jottyfan/camporganizer/module/admin/model/IntKeyValueBean.java similarity index 93% rename from src/main/java/de/jottyfan/camporganizer/module/admin/IntKeyValueBean.java rename to src/main/java/de/jottyfan/camporganizer/module/admin/model/IntKeyValueBean.java index 3c49408..c7212fb 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/IntKeyValueBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/model/IntKeyValueBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.admin; +package de.jottyfan.camporganizer.module.admin.model; import java.io.Serializable; diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/LocationBean.java b/src/main/java/de/jottyfan/camporganizer/module/admin/model/LocationBean.java similarity index 90% rename from src/main/java/de/jottyfan/camporganizer/module/admin/LocationBean.java rename to src/main/java/de/jottyfan/camporganizer/module/admin/model/LocationBean.java index 2552f3c..107deca 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/LocationBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/model/LocationBean.java @@ -1,9 +1,9 @@ -package de.jottyfan.camporganizer.module.admin; +package de.jottyfan.camporganizer.module.admin.model; import java.io.Serializable; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import de.jottyfan.camporganizer.db.jooq.tables.records.TLocationRecord; diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/PrivilegesContainerBean.java b/src/main/java/de/jottyfan/camporganizer/module/admin/model/PrivilegesContainerBean.java similarity index 95% rename from src/main/java/de/jottyfan/camporganizer/module/admin/PrivilegesContainerBean.java rename to src/main/java/de/jottyfan/camporganizer/module/admin/model/PrivilegesContainerBean.java index 24345a7..4497aa4 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/PrivilegesContainerBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/model/PrivilegesContainerBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.admin; +package de.jottyfan.camporganizer.module.admin.model; import java.io.Serializable; import java.util.ArrayList; diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/ProfileBean.java b/src/main/java/de/jottyfan/camporganizer/module/admin/model/ProfileBean.java similarity index 95% rename from src/main/java/de/jottyfan/camporganizer/module/admin/ProfileBean.java rename to src/main/java/de/jottyfan/camporganizer/module/admin/model/ProfileBean.java index c7e2443..b8d8ae6 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/ProfileBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/model/ProfileBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.admin; +package de.jottyfan.camporganizer.module.admin.model; import java.io.Serializable; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsController.java b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsController.java index 9745809..9d98036 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsController.java @@ -1,6 +1,6 @@ package de.jottyfan.camporganizer.module.business.bookings; -import javax.annotation.security.RolesAllowed; +import jakarta.annotation.security.RolesAllowed; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -13,8 +13,8 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; -import de.jottyfan.camporganizer.module.business.bookings.impl.AddPaymentBean; -import de.jottyfan.camporganizer.module.business.bookings.impl.BookerBean; +import de.jottyfan.camporganizer.module.business.bookings.model.AddPaymentBean; +import de.jottyfan.camporganizer.module.business.bookings.model.BookerBean; import de.jottyfan.camporganizer.module.camplist.CommonController; /** @@ -27,7 +27,7 @@ public class BookingsController extends CommonController { private static final Logger LOGGER = LogManager.getLogger(BookingsController.class); @Autowired - private IBookingsService bookingsService; + private BookingsService bookingsService; @GetMapping("/business/bookings") @RolesAllowed({"business_booking"}) diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookingsRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsRepository.java similarity index 97% rename from src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookingsRepository.java rename to src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsRepository.java index af93546..b76a929 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookingsRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsRepository.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.bookings.impl; +package de.jottyfan.camporganizer.module.business.bookings; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE; @@ -27,6 +27,7 @@ import de.jottyfan.camporganizer.db.EnumConverter; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; import de.jottyfan.camporganizer.db.jooq.enums.EnumSex; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; +import de.jottyfan.camporganizer.module.business.bookings.model.BookerBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookingsService.java b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsService.java similarity index 70% rename from src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookingsService.java rename to src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsService.java index 2deee15..d63f42d 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookingsService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/BookingsService.java @@ -1,11 +1,11 @@ -package de.jottyfan.camporganizer.module.business.bookings.impl; +package de.jottyfan.camporganizer.module.business.bookings; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import de.jottyfan.camporganizer.module.business.bookings.IBookingsService; +import de.jottyfan.camporganizer.module.business.bookings.model.BookerBean; /** * @@ -13,24 +13,20 @@ import de.jottyfan.camporganizer.module.business.bookings.IBookingsService; * */ @Service -public class BookingsService implements IBookingsService { +public class BookingsService { @Autowired private BookingsRepository bookingsGateway; - @Override public List getBookers(String username) { return bookingsGateway.getBookings(username); } - @Override public BookerBean getBooker(Integer id, String username) { return bookingsGateway.getBooking(id, username); } - @Override public Integer addPayment(Integer id, Double payment) { return bookingsGateway.addPayment(id, payment); } - } diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/IBookingsService.java b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/IBookingsService.java deleted file mode 100644 index fae57e0..0000000 --- a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/IBookingsService.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.jottyfan.camporganizer.module.business.bookings; - -import java.util.List; - -import de.jottyfan.camporganizer.module.business.bookings.impl.BookerBean; - -/** - * - * @author jotty - * - */ -public interface IBookingsService { - /** - * get the bookers information - * - * @param username the name of the user in this session - * @return the list of bookers; an empty one at least - */ - public List getBookers(String username); - - /** - * get the booker referenced by id - * - * @param id the ID of the booker - * @param username the name of the user in this session - * @return the booker if found; null otherwise - */ - public BookerBean getBooker(Integer id, String username); - - /** - * add payment to the paid values of user with id - * - * @param id the ID of the booker - * @param payment the payment (additional value) - * @return number of affected database rows, should be 1 - */ - public Integer addPayment(Integer id, Double payment); -} diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/AddPaymentBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/model/AddPaymentBean.java similarity index 82% rename from src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/AddPaymentBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/bookings/model/AddPaymentBean.java index 02d5de3..da2b4f3 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/AddPaymentBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/model/AddPaymentBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.bookings.impl; +package de.jottyfan.camporganizer.module.business.bookings.model; import java.io.Serializable; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookerBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/model/BookerBean.java similarity index 97% rename from src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookerBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/bookings/model/BookerBean.java index 3b5531d..04e3d01 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/bookings/impl/BookerBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/bookings/model/BookerBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.bookings.impl; +package de.jottyfan.camporganizer.module.business.bookings.model; import java.io.Serializable; import java.math.BigDecimal; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessController.java b/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessController.java index 1201e42..9f4f99f 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessController.java @@ -1,7 +1,5 @@ package de.jottyfan.camporganizer.module.business.business; -import javax.servlet.http.HttpServletRequest; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -18,15 +16,12 @@ import de.jottyfan.camporganizer.module.camplist.CommonController; public class BusinessController extends CommonController { @Autowired - private HttpServletRequest request; - - @Autowired - private IBusinessService indexService; + private BusinessService service; @GetMapping("/business") public String getIndex(Model model) { - String username = indexService.getCurrentUser(request); - model.addAttribute("campBudgets", indexService.getCampBudgets(username)); + String username = super.getCurrentUser(); + model.addAttribute("campBudgets", service.getCampBudgets(username)); return "business/business"; } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessRepository.java similarity index 95% rename from src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessRepository.java rename to src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessRepository.java index fcf5e58..0dca9e5 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessRepository.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.business.impl; +package de.jottyfan.camporganizer.module.business.business; import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP; import static de.jottyfan.camporganizer.db.jooq.Tables.T_LOCATION; @@ -25,6 +25,8 @@ import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; +import de.jottyfan.camporganizer.module.business.business.model.BusinessBean; +import de.jottyfan.camporganizer.module.business.business.model.CampBudgetBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessService.java b/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessService.java new file mode 100644 index 0000000..d9b25e3 --- /dev/null +++ b/src/main/java/de/jottyfan/camporganizer/module/business/business/BusinessService.java @@ -0,0 +1,24 @@ +package de.jottyfan.camporganizer.module.business.business; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import de.jottyfan.camporganizer.module.business.business.model.CampBudgetBean; + +/** + * + * @author jotty + * + */ +@Service +public class BusinessService { + + @Autowired + private BusinessRepository gateway; + + public List getCampBudgets(String username) { + return gateway.getCampBudgets(username); + } +} diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/business/IBusinessService.java b/src/main/java/de/jottyfan/camporganizer/module/business/business/IBusinessService.java deleted file mode 100644 index f611bfa..0000000 --- a/src/main/java/de/jottyfan/camporganizer/module/business/business/IBusinessService.java +++ /dev/null @@ -1,30 +0,0 @@ -package de.jottyfan.camporganizer.module.business.business; - -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import de.jottyfan.camporganizer.module.business.business.impl.CampBudgetBean; - -/** - * - * @author jotty - * - */ -public interface IBusinessService { - /** - * get the user of this session - * - * @param request the request - * @return the username of the current user - */ - public String getCurrentUser(HttpServletRequest request); - - /** - * get a list of all camp budgets of all years - * - * @param username the name of the current user in this session - * @return the list; an empty one at least - */ - public List getCampBudgets(String username); -} diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessService.java b/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessService.java deleted file mode 100644 index 6ec3cc9..0000000 --- a/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessService.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.jottyfan.camporganizer.module.business.business.impl; - -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import org.jooq.exception.DataAccessException; -import org.keycloak.KeycloakSecurityContext; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.jottyfan.camporganizer.module.business.business.IBusinessService; - -/** - * - * @author jotty - * - */ -@Service -public class BusinessService implements IBusinessService { - @Autowired - private BusinessRepository gateway; - - @Override - public String getCurrentUser(HttpServletRequest request) { - KeycloakSecurityContext ksc = (KeycloakSecurityContext) request - .getAttribute(KeycloakSecurityContext.class.getName()); - if (ksc == null) { - throw new DataAccessException("no keycloak user in session"); - } - return ksc.getIdToken().getPreferredUsername(); - } - - @Override - public List getCampBudgets(String username) { - return gateway.getCampBudgets(username); - } -} diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/business/model/BusinessBean.java similarity index 97% rename from src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/business/model/BusinessBean.java index bce06d8..ef1ac8b 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/BusinessBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/business/model/BusinessBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.business.impl; +package de.jottyfan.camporganizer.module.business.business.model; import java.io.Serializable; import java.math.BigDecimal; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/CampBudgetBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/business/model/CampBudgetBean.java similarity index 95% rename from src/main/java/de/jottyfan/camporganizer/module/business/business/impl/CampBudgetBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/business/model/CampBudgetBean.java index d1f41a3..605a52c 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/business/impl/CampBudgetBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/business/model/CampBudgetBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.business.impl; +package de.jottyfan.camporganizer.module.business.business.model; import java.io.Serializable; import java.math.BigDecimal; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampController.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampController.java index d450889..aa21300 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampController.java @@ -1,38 +1,29 @@ package de.jottyfan.camporganizer.module.business.camp; -import javax.annotation.security.RolesAllowed; -import javax.servlet.http.HttpServletRequest; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import de.jottyfan.camporganizer.module.business.business.IBusinessService; import de.jottyfan.camporganizer.module.camplist.CommonController; +import jakarta.annotation.security.RolesAllowed; /** -* -* @author jotty -* -*/ + * + * @author jotty + * + */ @Controller public class CampController extends CommonController { @Autowired - private HttpServletRequest request; - - @Autowired - private IBusinessService indexService; - - @Autowired - private ICampService campService; + private CampService campService; @GetMapping("/business/camp/{id}") - @RolesAllowed({"business"}) + @RolesAllowed({ "business" }) public String getCamp(Model model, @PathVariable Integer id) { - String username = indexService.getCurrentUser(request); + String username = super.getCurrentUser(); model.addAttribute("currentUser", username); model.addAttribute("campId", id); model.addAttribute("camp", campService.getCamp(id, username)); diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampRepository.java similarity index 95% rename from src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampRepository.java rename to src/main/java/de/jottyfan/camporganizer/module/business/camp/CampRepository.java index 8ba1fdc..78917e2 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampRepository.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.camp.impl; +package de.jottyfan.camporganizer.module.business.camp; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE; @@ -25,6 +25,8 @@ import org.springframework.transaction.annotation.Transactional; import de.jottyfan.camporganizer.db.EnumConverter; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; import de.jottyfan.camporganizer.db.jooq.enums.EnumSex; +import de.jottyfan.camporganizer.module.business.camp.model.CampBean; +import de.jottyfan.camporganizer.module.business.camp.model.PersonBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampService.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampService.java similarity index 76% rename from src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampService.java rename to src/main/java/de/jottyfan/camporganizer/module/business/camp/CampService.java index 97d8944..c16027d 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/CampService.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.camp.impl; +package de.jottyfan.camporganizer.module.business.camp; import java.math.BigDecimal; import java.util.List; @@ -6,7 +6,9 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import de.jottyfan.camporganizer.module.business.camp.ICampService; +import de.jottyfan.camporganizer.module.business.camp.model.BookingBean; +import de.jottyfan.camporganizer.module.business.camp.model.CampBean; +import de.jottyfan.camporganizer.module.business.camp.model.PersonBean; /** * @@ -14,17 +16,15 @@ import de.jottyfan.camporganizer.module.business.camp.ICampService; * */ @Service -public class CampService implements ICampService { +public class CampService { @Autowired private CampRepository campGateway; - @Override public CampBean getCamp(Integer id, String username) { return campGateway.getCamp(id, username); } - @Override public BookingBean getBookings(Integer id, String username) { Integer approved = 0; Integer open = 0; @@ -35,9 +35,9 @@ public class CampService implements ICampService { if (acceptence == null) { open += 1; } else if (acceptence) { - approved +=1; + approved += 1; } else { - rejected +=1; + rejected += 1; } paid = paid.add(p.getPaid() == null ? new BigDecimal(0) : p.getPaid()); } @@ -49,9 +49,7 @@ public class CampService implements ICampService { return bean; } - @Override public List getBookers(Integer id, String username) { return campGateway.getBookings(id, username); } - } diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/ICampService.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/ICampService.java deleted file mode 100644 index 57b1f12..0000000 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/ICampService.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.jottyfan.camporganizer.module.business.camp; - -import java.util.List; - -import de.jottyfan.camporganizer.module.business.camp.impl.BookingBean; -import de.jottyfan.camporganizer.module.business.camp.impl.CampBean; -import de.jottyfan.camporganizer.module.business.camp.impl.PersonBean; - -/** - * - * @author jotty - * - */ -public interface ICampService { - - /** - * get the camp bean of id - * - * @param id the id of the camp - * @param username the name of the user in this session - * @return the camp bean if found; null otherwise - */ - public CampBean getCamp(Integer id, String username); - - /** - * get the booking information for camp with id - * - * @param id the id of the camp - * @param username the name of the user in this session - * @return a booking bean - */ - public BookingBean getBookings(Integer id, String username); - - /** - * get the bookers information for camp with id - * - * @param id the id of the camp - * @param username the name of the user in this session - * @return the list of bookers; an empty one at least - */ - public List getBookers(Integer id, String username); - -} diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/BookerBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/model/BookerBean.java similarity index 96% rename from src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/BookerBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/camp/model/BookerBean.java index 1ce624a..f178843 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/BookerBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/model/BookerBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.camp.impl; +package de.jottyfan.camporganizer.module.business.camp.model; import java.io.Serializable; import java.math.BigDecimal; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/BookingBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/model/BookingBean.java similarity index 94% rename from src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/BookingBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/camp/model/BookingBean.java index 0d2bda3..4fa1726 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/BookingBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/model/BookingBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.camp.impl; +package de.jottyfan.camporganizer.module.business.camp.model; import java.io.Serializable; import java.math.BigDecimal; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/model/CampBean.java similarity index 93% rename from src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/camp/model/CampBean.java index c7ee468..915b3dc 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/CampBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/model/CampBean.java @@ -1,11 +1,11 @@ -package de.jottyfan.camporganizer.module.business.camp.impl; +package de.jottyfan.camporganizer.module.business.camp.model; import java.io.Serializable; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import de.jottyfan.camporganizer.module.business.privileges.impl.ProfileBean; +import de.jottyfan.camporganizer.module.business.privileges.model.ProfileBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/PersonBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/camp/model/PersonBean.java similarity index 96% rename from src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/PersonBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/camp/model/PersonBean.java index acbdde9..a3d42f5 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/camp/impl/PersonBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/camp/model/PersonBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.camp.impl; +package de.jottyfan.camporganizer.module.business.camp.model; import java.io.Serializable; import java.math.BigDecimal; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesController.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesController.java index 8d316cf..69bcc46 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesController.java @@ -1,9 +1,5 @@ package de.jottyfan.camporganizer.module.business.privileges; -import javax.annotation.security.RolesAllowed; -import javax.servlet.http.HttpServletRequest; -import javax.websocket.server.PathParam; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -12,10 +8,10 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; -import de.jottyfan.camporganizer.module.business.business.IBusinessService; -import de.jottyfan.camporganizer.module.business.privileges.impl.PrivilegesBean; -import de.jottyfan.camporganizer.module.business.privileges.impl.PrivilegesService; +import de.jottyfan.camporganizer.module.business.privileges.model.PrivilegesBean; import de.jottyfan.camporganizer.module.camplist.CommonController; +import jakarta.annotation.security.RolesAllowed; +import jakarta.websocket.server.PathParam; /** * @@ -25,19 +21,13 @@ import de.jottyfan.camporganizer.module.camplist.CommonController; @Controller public class PrivilegesController extends CommonController { - @Autowired - private HttpServletRequest request; - @Autowired private PrivilegesService privilegesService; - @Autowired - private IBusinessService indexService; - @GetMapping("/business/privileges") @RolesAllowed({ "admin" }) public String getIndex(Model model) { - String username = indexService.getCurrentUser(request); + String username = super.getCurrentUser(); model.addAttribute("currentUser", username); model.addAttribute("privileges", privilegesService.getPrivileges()); model.addAttribute("profiles", privilegesService.getProfiles(EnumCamprole.director, EnumCamprole.teacher)); @@ -59,7 +49,7 @@ public class PrivilegesController extends CommonController { PrivilegesBean bean = new PrivilegesBean(); bean.setFkCamp(fkCamp); bean.setFkProfile(fkProfile); - privilegesService.remove(bean, indexService.getCurrentUser(request)); + privilegesService.remove(bean, super.getCurrentUser()); return getIndex(model); } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesRepository.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesRepository.java similarity index 95% rename from src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesRepository.java rename to src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesRepository.java index 9117731..a927596 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesRepository.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.privileges.impl; +package de.jottyfan.camporganizer.module.business.privileges; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PERSON; import static de.jottyfan.camporganizer.db.jooq.Tables.T_PROFILE; @@ -24,6 +24,8 @@ import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import de.jottyfan.camporganizer.db.jooq.tables.records.TSalesprofileRecord; +import de.jottyfan.camporganizer.module.business.privileges.model.PrivilegesBean; +import de.jottyfan.camporganizer.module.business.privileges.model.ProfileBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesService.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesService.java similarity index 84% rename from src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesService.java rename to src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesService.java index 020231d..c1e086c 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/PrivilegesService.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.privileges.impl; +package de.jottyfan.camporganizer.module.business.privileges; import java.util.HashMap; import java.util.HashSet; @@ -10,7 +10,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; -import de.jottyfan.camporganizer.module.business.camp.impl.CampBean; +import de.jottyfan.camporganizer.module.business.camp.model.CampBean; +import de.jottyfan.camporganizer.module.business.privileges.model.PrivilegesBean; +import de.jottyfan.camporganizer.module.business.privileges.model.ProfileBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/PrivilegesBean.java similarity index 96% rename from src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/PrivilegesBean.java index 63393e8..31894b3 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/PrivilegesBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/PrivilegesBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.privileges.impl; +package de.jottyfan.camporganizer.module.business.privileges.model; import java.io.Serializable; import java.time.LocalDateTime; diff --git a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/ProfileBean.java b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/ProfileBean.java similarity index 97% rename from src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/ProfileBean.java rename to src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/ProfileBean.java index d9e328c..c3e68dc 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/business/privileges/impl/ProfileBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/business/privileges/model/ProfileBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.business.privileges.impl; +package de.jottyfan.camporganizer.module.business.privileges.model; import java.io.Serializable; import java.time.LocalDateTime; diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistController.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistController.java index 0b79487..21787d9 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistController.java @@ -1,7 +1,9 @@ package de.jottyfan.camporganizer.module.camplist; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; + +import java.security.Principal; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,6 +14,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; +import de.jottyfan.camporganizer.module.camplist.model.BookingBean; import de.jottyfan.camporganizer.module.registration.KeycloakRepository; /** @@ -23,9 +26,6 @@ import de.jottyfan.camporganizer.module.registration.KeycloakRepository; public class CamplistController extends CommonController { private static final Logger LOGGER = LogManager.getLogger(CamplistController.class); - @Autowired - private HttpServletRequest request; - @Autowired private KeycloakRepository keycloak; @@ -33,14 +33,14 @@ public class CamplistController extends CommonController { private CamplistService service; @GetMapping("/camplist") - public String index(Model model) { + public String index(Model model, Principal principal) { model.addAttribute("camps", service.getAllCamps(true)); - return super.isLoggedIn(request) ? dashboard(model) : "/camplist"; + return super.isLoggedIn(principal) ? dashboard(model) : "/camplist"; } @GetMapping("/dashboard") public String dashboard(Model model) { - model.addAttribute("mybookings", service.getBookingsOf(super.getCurrentUser(request))); + model.addAttribute("mybookings", service.getBookingsOf(super.getCurrentUser())); model.addAttribute("bookingBean", new BookingBean()); model.addAttribute("keycloakProfileUrl", keycloak.getUserClientUrl()); model.addAttribute("camps", service.getAllCamps(true)); diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistGateway.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistGateway.java index 699f968..944354f 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistGateway.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistGateway.java @@ -34,6 +34,8 @@ import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; import de.jottyfan.camporganizer.db.jooq.enums.EnumDocument; import de.jottyfan.camporganizer.db.jooq.tables.TProfile; import de.jottyfan.camporganizer.db.jooq.tables.records.VCampRecord; +import de.jottyfan.camporganizer.module.camplist.model.BookingBean; +import de.jottyfan.camporganizer.module.camplist.model.DocumentBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistService.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistService.java index cd03ef3..79dc416 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/CamplistService.java @@ -13,6 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.jottyfan.camporganizer.db.jooq.tables.records.VCampRecord; +import de.jottyfan.camporganizer.module.camplist.model.BookingBean; import de.jottyfan.camporganizer.module.dashboard.DashboardRepository; /** diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/CommonController.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/CommonController.java index 9cde09d..b37dfef 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/CommonController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/CommonController.java @@ -1,9 +1,9 @@ package de.jottyfan.camporganizer.module.camplist; -import javax.servlet.http.HttpServletRequest; +import java.security.Principal; -import org.keycloak.KeycloakSecurityContext; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.ModelAttribute; /** @@ -14,44 +14,45 @@ import org.springframework.web.bind.annotation.ModelAttribute; public abstract class CommonController { @Autowired - private HttpServletRequest request; + private Principal principal; /** * try to get current keycloak user * - * @param request the request + * @param principal the principal * @return the preferred username or null */ - public String getCurrentUser(HttpServletRequest request) { - KeycloakSecurityContext ksc = (KeycloakSecurityContext) request - .getAttribute(KeycloakSecurityContext.class.getName()); - return ksc == null ? null : ksc.getIdToken().getPreferredUsername(); + public String getCurrentUser(Principal principal) { + return principal.getName(); } /** * try to get th currnt keycloak email * - * @param request the request + * @param principal the principal * @return the email or null */ - public String getCurrentEmail(HttpServletRequest request) { - KeycloakSecurityContext ksc = (KeycloakSecurityContext) request - .getAttribute(KeycloakSecurityContext.class.getName()); - return ksc == null ? null : ksc.getIdToken().getEmail(); + public String getCurrentEmail(Principal principal) { + if (principal instanceof UserDetails) { + UserDetails userDetails = (UserDetails) principal; + return userDetails.getEmail(); + } else { + return null; + } } @ModelAttribute("currentUser") public String getCurrentUser() { - return getCurrentUser(request); + return getCurrentUser(principal); } /** * return true if the user has a valid keycloak session token * - * @param request the request + * @param principal the principal * @return true or false */ - public boolean isLoggedIn(HttpServletRequest request) { - return getCurrentUser(request) != null; + public boolean isLoggedIn(Principal principal) { + return getCurrentUser(principal) != null; } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/BookingBean.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/model/BookingBean.java similarity index 99% rename from src/main/java/de/jottyfan/camporganizer/module/camplist/BookingBean.java rename to src/main/java/de/jottyfan/camporganizer/module/camplist/model/BookingBean.java index 9920048..4faf4ba 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/BookingBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/model/BookingBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.camplist; +package de.jottyfan.camporganizer.module.camplist.model; import java.io.Serializable; import java.time.LocalDate; diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/DocumentBean.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/model/DocumentBean.java similarity index 89% rename from src/main/java/de/jottyfan/camporganizer/module/camplist/DocumentBean.java rename to src/main/java/de/jottyfan/camporganizer/module/camplist/model/DocumentBean.java index 7b86ae6..50817ed 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/DocumentBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/model/DocumentBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.camplist; +package de.jottyfan.camporganizer.module.camplist.model; import java.io.Serializable; diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/LambdaResultWrapper.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/model/LambdaResultWrapper.java similarity index 93% rename from src/main/java/de/jottyfan/camporganizer/module/camplist/LambdaResultWrapper.java rename to src/main/java/de/jottyfan/camporganizer/module/camplist/model/LambdaResultWrapper.java index b28137c..bc3aa29 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/LambdaResultWrapper.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/model/LambdaResultWrapper.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.camplist; +package de.jottyfan.camporganizer.module.camplist.model; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/ManifestBean.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/model/ManifestBean.java similarity index 90% rename from src/main/java/de/jottyfan/camporganizer/module/camplist/ManifestBean.java rename to src/main/java/de/jottyfan/camporganizer/module/camplist/model/ManifestBean.java index 1436864..1cf374a 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/ManifestBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/model/ManifestBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.camplist; +package de.jottyfan.camporganizer.module.camplist.model; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.info.BuildProperties; diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationController.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationController.java index c5f2f6a..434801f 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationController.java @@ -3,15 +3,13 @@ package de.jottyfan.camporganizer.module.confirmation.confirmation; import java.time.LocalDate; import java.util.List; -import javax.servlet.http.HttpServletRequest; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import de.jottyfan.camporganizer.module.camplist.CommonController; -import de.jottyfan.camporganizer.module.confirmation.confirmation.impl.CampOverviewBean; +import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean; /** * @@ -22,14 +20,11 @@ import de.jottyfan.camporganizer.module.confirmation.confirmation.impl.CampOverv public class ConfirmationController extends CommonController { @Autowired - private HttpServletRequest request; - - @Autowired - private IConfirmationService indexService; + private ConfirmationService indexService; @GetMapping("/confirmation") public String getIndex(Model model) { - List campoverview = indexService.getCampOverview(request); + List campoverview = indexService.getCampOverview(super.getCurrentUser()); CampOverviewBean campoverviewsummary = new CampOverviewBean(LocalDate.now(), "summary"); for (CampOverviewBean bean : campoverview) { campoverviewsummary.setApproved(bean.getApproved() + campoverviewsummary.getApproved()); @@ -38,9 +33,9 @@ public class ConfirmationController extends CommonController { } model.addAttribute("campoverview", campoverview); model.addAttribute("campoverviewsummary", campoverviewsummary); - model.addAttribute("untouched", indexService.getUntouched(request)); - model.addAttribute("approved", indexService.getApproved(request)); - model.addAttribute("rejected", indexService.getRejected(request)); + model.addAttribute("untouched", indexService.getUntouched(super.getCurrentUser())); + model.addAttribute("approved", indexService.getApproved(super.getCurrentUser())); + model.addAttribute("rejected", indexService.getRejected(super.getCurrentUser())); return "confirmation/confirmation"; } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/ConfirmationRepository.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationRepository.java similarity index 97% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/ConfirmationRepository.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationRepository.java index b4601f2..22660d5 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/ConfirmationRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationRepository.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.confirmation.confirmation.impl; +package de.jottyfan.camporganizer.module.confirmation.confirmation; import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP; import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE; @@ -30,6 +30,8 @@ import org.springframework.transaction.annotation.Transactional; import de.jottyfan.camporganizer.db.jooq.enums.EnumCamprole; import de.jottyfan.camporganizer.db.jooq.enums.EnumModule; +import de.jottyfan.camporganizer.module.confirmation.confirmation.model.BookingBean; +import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/ConfirmationService.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationService.java similarity index 50% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/ConfirmationService.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationService.java index cb75d6d..18680c1 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/ConfirmationService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/ConfirmationService.java @@ -1,15 +1,16 @@ -package de.jottyfan.camporganizer.module.confirmation.confirmation.impl; +package de.jottyfan.camporganizer.module.confirmation.confirmation; import java.util.List; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.jooq.exception.DataAccessException; import org.keycloak.KeycloakSecurityContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import de.jottyfan.camporganizer.module.confirmation.confirmation.IConfirmationService; +import de.jottyfan.camporganizer.module.confirmation.confirmation.model.BookingBean; +import de.jottyfan.camporganizer.module.confirmation.confirmation.model.CampOverviewBean; /** * @@ -17,45 +18,30 @@ import de.jottyfan.camporganizer.module.confirmation.confirmation.IConfirmationS * */ @Service -public class ConfirmationService implements IConfirmationService { +public class ConfirmationService { @Autowired private ConfirmationRepository gateway; - @Override - public String getCurrentUser(HttpServletRequest request) { - KeycloakSecurityContext ksc = (KeycloakSecurityContext) request - .getAttribute(KeycloakSecurityContext.class.getName()); - if (ksc == null) { - throw new DataAccessException("no keycloak user in session"); - } - return ksc.getIdToken().getPreferredUsername(); + public List getCampOverview(String currentUser) { + return gateway.getCampOverviewBeans(currentUser); } - @Override - public List getCampOverview(HttpServletRequest request) { - return gateway.getCampOverviewBeans(getCurrentUser(request)); + public List getUntouched(String currentUser) { + return gateway.getUntouched(currentUser); } - @Override - public List getUntouched(HttpServletRequest request) { - return gateway.getUntouched(getCurrentUser(request)); + public List getApproved(String currentUser) { + return gateway.getApproved(currentUser); } - @Override - public List getApproved(HttpServletRequest request) { - return gateway.getApproved(getCurrentUser(request)); + public List getRejected(String currentUser) { + return gateway.getRejected(currentUser); } - @Override - public List getRejected(HttpServletRequest request) { - return gateway.getRejected(getCurrentUser(request)); - } - - @Override - public String search(String needle, String linkURL, HttpServletRequest request) { + public String search(String needle, String linkURL, String currentUser) { StringBuilder buf = new StringBuilder( ""); - for (BookingBean bean : gateway.getSearchResult(needle, getCurrentUser(request))) { + for (BookingBean bean : gateway.getSearchResult(needle, currentUser)) { String acceptHtml = ""; if (bean.getAccept() == null) { acceptHtml = ""; diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/IConfirmationService.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/IConfirmationService.java deleted file mode 100644 index d6044ac..0000000 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/IConfirmationService.java +++ /dev/null @@ -1,65 +0,0 @@ -package de.jottyfan.camporganizer.module.confirmation.confirmation; - -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import de.jottyfan.camporganizer.module.confirmation.confirmation.impl.BookingBean; -import de.jottyfan.camporganizer.module.confirmation.confirmation.impl.CampOverviewBean; - -/** - * - * @author jotty - * - */ -public interface IConfirmationService { - /** - * get the user of this session - * - * @param request the request - * @return the username of the current user - */ - public String getCurrentUser(HttpServletRequest request); - - /** - * get a list of the camps and its booking status - * - * @param request the request - * @return the camp overview beans - */ - public List getCampOverview(HttpServletRequest request); - - /** - * get a list of bookings that have not yet been worked on - * - * @param request the request - * @return the list of untouched bookings - */ - public List getUntouched(HttpServletRequest request); - - /** - * get a list of approved bookings - * - * @param request the request - * @return the list of approved bookings - */ - public List getApproved(HttpServletRequest request); - - /** - * get a list of rejected bookings - * - * @param request the request - * @return the list of rejected bookings - */ - public List getRejected(HttpServletRequest request); - - /** - * get the result of a search for needle in the database - * - * @param needle the needle; may be a name of anything - * @param linkURL the URL of the link for clicking on the found entity - * @param request the request - * @return the result in html format (for now) - */ - public String search(String needle, String linkURL, HttpServletRequest request); -} diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/SearchController.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/SearchController.java index 82662d4..1a2a40a 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/SearchController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/SearchController.java @@ -1,31 +1,32 @@ package de.jottyfan.camporganizer.module.confirmation.confirmation; -import javax.servlet.http.HttpServletRequest; -import javax.websocket.server.PathParam; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; +import de.jottyfan.camporganizer.module.camplist.CommonController; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.websocket.server.PathParam; + /** * * @author jotty * */ @Controller -public class SearchController { +public class SearchController extends CommonController { @Autowired private HttpServletRequest request; @Autowired - private IConfirmationService service; + private ConfirmationService service; @GetMapping("/confirmation/search") @ResponseBody public String search(@PathParam(value = "needle") String needle, Model model) { - return service.search(needle, request.getRequestURI().replace("search", "person"), request); + return service.search(needle, request.getRequestURI().replace("search", "person"), super.getCurrentUser()); } } diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/BookingBean.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/BookingBean.java similarity index 99% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/BookingBean.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/BookingBean.java index fce9947..608dca8 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/BookingBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/BookingBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.confirmation.confirmation.impl; +package de.jottyfan.camporganizer.module.confirmation.confirmation.model; import java.io.Serializable; import java.time.LocalDate; diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/CampOverviewBean.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/CampOverviewBean.java similarity index 99% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/CampOverviewBean.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/CampOverviewBean.java index 5487ca9..66a5885 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/CampOverviewBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/CampOverviewBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.confirmation.confirmation.impl; +package de.jottyfan.camporganizer.module.confirmation.confirmation.model; import java.io.Serializable; import java.time.LocalDate; diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/FoundBean.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/FoundBean.java similarity index 99% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/FoundBean.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/FoundBean.java index d305005..7ff2d4e 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/impl/FoundBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/confirmation/model/FoundBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.confirmation.confirmation.impl; +package de.jottyfan.camporganizer.module.confirmation.confirmation.model; import java.io.Serializable; diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonController.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonController.java index 757bdd0..0693e0c 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonController.java @@ -1,7 +1,5 @@ package de.jottyfan.camporganizer.module.confirmation.person; -import javax.servlet.http.HttpServletRequest; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -11,9 +9,9 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import de.jottyfan.camporganizer.module.camplist.CommonController; -import de.jottyfan.camporganizer.module.confirmation.confirmation.IConfirmationService; -import de.jottyfan.camporganizer.module.confirmation.person.impl.PersonBean; -import de.jottyfan.camporganizer.module.confirmation.person.impl.PersonService; +import de.jottyfan.camporganizer.module.confirmation.confirmation.ConfirmationService; +import de.jottyfan.camporganizer.module.confirmation.person.model.PersonBean; +import jakarta.servlet.http.HttpServletRequest; /** * @@ -23,18 +21,12 @@ import de.jottyfan.camporganizer.module.confirmation.person.impl.PersonService; @Controller public class PersonController extends CommonController { - @Autowired - private HttpServletRequest request; - - @Autowired - private IConfirmationService confirmationService; - @Autowired private PersonService personService; @GetMapping("/confirmation/person/{pk}") public String getIndex(Model model, @PathVariable Integer pk) { - String username = confirmationService.getCurrentUser(request); + String username = super.getCurrentUser(); model.addAttribute("currentUser", username); model.addAttribute("person", personService.getPerson(username, pk)); model.addAttribute("camps", personService.getCamps(username)); @@ -44,7 +36,7 @@ public class PersonController extends CommonController { @PostMapping("/confirmation/person/update") public String doUpdate(@ModelAttribute PersonBean bean, Model model) { - String username = confirmationService.getCurrentUser(request); + String username = super.getCurrentUser(); personService.updatePerson(bean, username); return "redirect:/confirmation"; } diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonRepository.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonRepository.java similarity index 97% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonRepository.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonRepository.java index d48fae9..37c69b8 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonRepository.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.confirmation.person.impl; +package de.jottyfan.camporganizer.module.confirmation.person; import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP; import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMPPROFILE; @@ -36,7 +36,9 @@ import de.jottyfan.camporganizer.db.jooq.tables.records.TCampRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TProfileRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TRssRecord; -import de.jottyfan.camporganizer.module.camplist.LambdaResultWrapper; +import de.jottyfan.camporganizer.module.camplist.model.LambdaResultWrapper; +import de.jottyfan.camporganizer.module.confirmation.person.model.CampBean; +import de.jottyfan.camporganizer.module.confirmation.person.model.PersonBean; import de.jottyfan.camporganizer.module.mail.MailBean; import de.jottyfan.camporganizer.module.mail.MailRepository; diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonService.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonService.java similarity index 74% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonService.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonService.java index 3e585a2..33fdc1e 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/PersonService.java @@ -1,10 +1,13 @@ -package de.jottyfan.camporganizer.module.confirmation.person.impl; +package de.jottyfan.camporganizer.module.confirmation.person; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import de.jottyfan.camporganizer.module.confirmation.person.model.CampBean; +import de.jottyfan.camporganizer.module.confirmation.person.model.PersonBean; + /** * * @author jotty diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/CampBean.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/model/CampBean.java similarity index 93% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/CampBean.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/person/model/CampBean.java index e9ff7dc..c6b37e2 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/CampBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/model/CampBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.confirmation.person.impl; +package de.jottyfan.camporganizer.module.confirmation.person.model; import java.io.Serializable; import java.time.LocalDateTime; diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonBean.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/model/PersonBean.java similarity index 98% rename from src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonBean.java rename to src/main/java/de/jottyfan/camporganizer/module/confirmation/person/model/PersonBean.java index 195acaf..d39ad1a 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/model/PersonBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.confirmation.person.impl; +package de.jottyfan.camporganizer.module.confirmation.person.model; import java.io.Serializable; import java.time.LocalDate; diff --git a/src/main/java/de/jottyfan/camporganizer/module/dashboard/DashboardRepository.java b/src/main/java/de/jottyfan/camporganizer/module/dashboard/DashboardRepository.java index 2331b5c..03d33c7 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/dashboard/DashboardRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/dashboard/DashboardRepository.java @@ -21,8 +21,8 @@ import de.jottyfan.camporganizer.db.jooq.enums.EnumFiletype; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersondocumentRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TRssRecord; -import de.jottyfan.camporganizer.module.camplist.BookingBean; -import de.jottyfan.camporganizer.module.camplist.LambdaResultWrapper; +import de.jottyfan.camporganizer.module.camplist.model.BookingBean; +import de.jottyfan.camporganizer.module.camplist.model.LambdaResultWrapper; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/dashboard/PersondocumentBean.java b/src/main/java/de/jottyfan/camporganizer/module/dashboard/PersondocumentBean.java index f00b165..5af602a 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/dashboard/PersondocumentBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/dashboard/PersondocumentBean.java @@ -4,7 +4,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.Base64; -import javax.servlet.http.Part; +import jakarta.servlet.http.Part; import org.apache.commons.io.IOUtils; diff --git a/src/main/java/de/jottyfan/camporganizer/module/document/DocumentController.java b/src/main/java/de/jottyfan/camporganizer/module/document/DocumentController.java index 2e53068..d2d6e7e 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/document/DocumentController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/document/DocumentController.java @@ -2,7 +2,7 @@ package de.jottyfan.camporganizer.module.document; import java.util.Base64; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ByteArrayResource; diff --git a/src/main/java/de/jottyfan/camporganizer/module/ical/ICalController.java b/src/main/java/de/jottyfan/camporganizer/module/ical/ICalController.java index 22337d0..4840e5e 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/ical/ICalController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/ical/ICalController.java @@ -2,7 +2,7 @@ package de.jottyfan.camporganizer.module.ical; import java.io.IOException; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -19,7 +19,7 @@ import de.jottyfan.camporganizer.module.camplist.CommonController; public class ICalController extends CommonController { @Autowired - private IICalService service; + private ICalService service; /** * generate the ical response stream diff --git a/src/main/java/de/jottyfan/camporganizer/module/ical/impl/ICalRepository.java b/src/main/java/de/jottyfan/camporganizer/module/ical/ICalRepository.java similarity index 98% rename from src/main/java/de/jottyfan/camporganizer/module/ical/impl/ICalRepository.java rename to src/main/java/de/jottyfan/camporganizer/module/ical/ICalRepository.java index 50329a3..8e6c1fd 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/ical/impl/ICalRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/ical/ICalRepository.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.ical.impl; +package de.jottyfan.camporganizer.module.ical; import static de.jottyfan.camporganizer.db.jooq.Tables.T_CAMP; import static de.jottyfan.camporganizer.db.jooq.Tables.T_LOCATION; diff --git a/src/main/java/de/jottyfan/camporganizer/module/ical/impl/ICalService.java b/src/main/java/de/jottyfan/camporganizer/module/ical/ICalService.java similarity index 77% rename from src/main/java/de/jottyfan/camporganizer/module/ical/impl/ICalService.java rename to src/main/java/de/jottyfan/camporganizer/module/ical/ICalService.java index ef411f6..71c174f 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/ical/impl/ICalService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/ical/ICalService.java @@ -1,15 +1,13 @@ -package de.jottyfan.camporganizer.module.ical.impl; +package de.jottyfan.camporganizer.module.ical; import java.io.IOException; -import javax.servlet.http.HttpServletResponse; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import biweekly.Biweekly; import biweekly.ICalendar; -import de.jottyfan.camporganizer.module.ical.IICalService; +import jakarta.servlet.http.HttpServletResponse; /** * @@ -17,12 +15,11 @@ import de.jottyfan.camporganizer.module.ical.IICalService; * */ @Service -public class ICalService implements IICalService { +public class ICalService { @Autowired private ICalRepository gateway; - @Override public Boolean generate(HttpServletResponse response) throws IOException { ICalendar ical = gateway.getIcal(); String content = Biweekly.write(ical).go(); @@ -37,5 +34,4 @@ public class ICalService implements IICalService { return true; } - } diff --git a/src/main/java/de/jottyfan/camporganizer/module/ical/IICalService.java b/src/main/java/de/jottyfan/camporganizer/module/ical/IICalService.java deleted file mode 100644 index 6262941..0000000 --- a/src/main/java/de/jottyfan/camporganizer/module/ical/IICalService.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.jottyfan.camporganizer.module.ical; - -import java.io.IOException; - -import javax.servlet.http.HttpServletResponse; - -/** - * - * @author jotty - * - */ -public interface IICalService { - - /** - * generate the ical - * - * @param response the response for the output stream - * - * @return true if successful, false otherwise - * @throws IOException on io errors - */ - public Boolean generate(HttpServletResponse response) throws IOException; -} diff --git a/src/main/java/de/jottyfan/camporganizer/module/mail/MailBean.java b/src/main/java/de/jottyfan/camporganizer/module/mail/MailBean.java index f8b2a3a..051ef76 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/mail/MailBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/mail/MailBean.java @@ -5,8 +5,8 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/mail/MailRepository.java b/src/main/java/de/jottyfan/camporganizer/module/mail/MailRepository.java index e6f23d9..93c02c4 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/mail/MailRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/mail/MailRepository.java @@ -3,8 +3,8 @@ package de.jottyfan.camporganizer.module.mail; import java.nio.charset.StandardCharsets; import java.util.Set; -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationBean.java b/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationBean.java index dc3f4a6..aa2396c 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationBean.java @@ -2,8 +2,8 @@ package de.jottyfan.camporganizer.module.migration; import java.io.Serializable; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; import org.jasypt.exceptions.EncryptionOperationNotPossibleException; import org.jasypt.util.password.StrongPasswordEncryptor; diff --git a/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationController.java b/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationController.java index 722bb3f..f19d1d1 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationController.java @@ -1,6 +1,6 @@ package de.jottyfan.camporganizer.module.migration; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; diff --git a/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationService.java b/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationService.java index 866eb38..8d097b8 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/migration/MigrationService.java @@ -1,6 +1,6 @@ package de.jottyfan.camporganizer.module.migration; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/KeycloakRepository.java b/src/main/java/de/jottyfan/camporganizer/module/registration/KeycloakRepository.java index 1328ae0..67b1bf3 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/KeycloakRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/KeycloakRepository.java @@ -3,8 +3,8 @@ package de.jottyfan.camporganizer.module.registration; import java.util.Arrays; import java.util.Collections; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; +import jakarta.ws.rs.core.Response; +import jakarta.ws.rs.core.Response.Status; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationController.java b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationController.java index 743110e..97fd0b1 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationController.java @@ -1,6 +1,6 @@ package de.jottyfan.camporganizer.module.registration; -import javax.validation.Valid; +import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -13,6 +13,8 @@ import org.springframework.web.bind.annotation.PostMapping; import de.jottyfan.camporganizer.db.EnumConverter; import de.jottyfan.camporganizer.module.camplist.CommonController; +import de.jottyfan.camporganizer.module.registration.model.CampBean; +import de.jottyfan.camporganizer.module.registration.model.RegistrationBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationRepository.java b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationRepository.java index 53a9e8c..dad1224 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationRepository.java @@ -43,8 +43,11 @@ import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersondocumentRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TProfileRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TRssRecord; -import de.jottyfan.camporganizer.module.camplist.BookingBean; -import de.jottyfan.camporganizer.module.camplist.LambdaResultWrapper; +import de.jottyfan.camporganizer.module.camplist.model.BookingBean; +import de.jottyfan.camporganizer.module.camplist.model.LambdaResultWrapper; +import de.jottyfan.camporganizer.module.registration.model.CampBean; +import de.jottyfan.camporganizer.module.registration.model.ProfileBean; +import de.jottyfan.camporganizer.module.registration.model.RegistrationBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationService.java b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationService.java index 0c1748d..c4e967f 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationService.java @@ -3,7 +3,9 @@ package de.jottyfan.camporganizer.module.registration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import de.jottyfan.camporganizer.module.camplist.BookingBean; +import de.jottyfan.camporganizer.module.camplist.model.BookingBean; +import de.jottyfan.camporganizer.module.registration.model.CampBean; +import de.jottyfan.camporganizer.module.registration.model.RegistrationBean; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/CampBean.java b/src/main/java/de/jottyfan/camporganizer/module/registration/model/CampBean.java similarity index 92% rename from src/main/java/de/jottyfan/camporganizer/module/registration/CampBean.java rename to src/main/java/de/jottyfan/camporganizer/module/registration/model/CampBean.java index f396f0a..aff863d 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/CampBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/model/CampBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.registration; +package de.jottyfan.camporganizer.module.registration.model; import java.io.Serializable; diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/ProfileBean.java b/src/main/java/de/jottyfan/camporganizer/module/registration/model/ProfileBean.java similarity index 94% rename from src/main/java/de/jottyfan/camporganizer/module/registration/ProfileBean.java rename to src/main/java/de/jottyfan/camporganizer/module/registration/model/ProfileBean.java index c60438d..02126e2 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/ProfileBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/model/ProfileBean.java @@ -1,4 +1,4 @@ -package de.jottyfan.camporganizer.module.registration; +package de.jottyfan.camporganizer.module.registration.model; import java.io.Serializable; diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationBean.java b/src/main/java/de/jottyfan/camporganizer/module/registration/model/RegistrationBean.java similarity index 96% rename from src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationBean.java rename to src/main/java/de/jottyfan/camporganizer/module/registration/model/RegistrationBean.java index 5e1d38e..4e60422 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/RegistrationBean.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/model/RegistrationBean.java @@ -1,11 +1,11 @@ -package de.jottyfan.camporganizer.module.registration; +package de.jottyfan.camporganizer.module.registration.model; import java.io.Serializable; import java.time.LocalDate; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import org.springframework.format.annotation.DateTimeFormat; diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/validate/TeacherAgeCheck.java b/src/main/java/de/jottyfan/camporganizer/module/registration/validate/TeacherAgeCheck.java index 91b4763..8b44a96 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/validate/TeacherAgeCheck.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/validate/TeacherAgeCheck.java @@ -6,8 +6,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/validate/TeacherAgeCheckValidator.java b/src/main/java/de/jottyfan/camporganizer/module/registration/validate/TeacherAgeCheckValidator.java index 43eb813..c2758d2 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/validate/TeacherAgeCheckValidator.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/validate/TeacherAgeCheckValidator.java @@ -2,8 +2,8 @@ package de.jottyfan.camporganizer.module.registration.validate; import java.time.LocalDate; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/validate/UnusedUsername.java b/src/main/java/de/jottyfan/camporganizer/module/registration/validate/UnusedUsername.java index 74dbcf0..a859732 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/validate/UnusedUsername.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/validate/UnusedUsername.java @@ -6,8 +6,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import javax.validation.Constraint; -import javax.validation.Payload; +import jakarta.validation.Constraint; +import jakarta.validation.Payload; /** * diff --git a/src/main/java/de/jottyfan/camporganizer/module/registration/validate/UnusedUsernameValidator.java b/src/main/java/de/jottyfan/camporganizer/module/registration/validate/UnusedUsernameValidator.java index 882d532..7616a47 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/registration/validate/UnusedUsernameValidator.java +++ b/src/main/java/de/jottyfan/camporganizer/module/registration/validate/UnusedUsernameValidator.java @@ -1,7 +1,7 @@ package de.jottyfan.camporganizer.module.registration.validate; -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/de/jottyfan/camporganizer/module/rss/RssController.java b/src/main/java/de/jottyfan/camporganizer/module/rss/RssController.java index c80908e..8e8e84d 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/rss/RssController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/rss/RssController.java @@ -1,6 +1,6 @@ package de.jottyfan.camporganizer.module.rss; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; diff --git a/src/main/java/de/jottyfan/camporganizer/module/rss/RssService.java b/src/main/java/de/jottyfan/camporganizer/module/rss/RssService.java index 829ae4c..b17bc01 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/rss/RssService.java +++ b/src/main/java/de/jottyfan/camporganizer/module/rss/RssService.java @@ -5,7 +5,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8ba7828..c3b896d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,11 +9,17 @@ spring.datasource.password = ${spring.datasource.password} server.servlet.context-path = ${server.servlet.context-path:/CampOrganizer2} -keycloak.auth-server-url = ${keycloak.auth-server-url} -keycloak.realm = ${keycloak.realm:ow} -keycloak.resource = ${keycloak.resource:biblecamp} -keycloak.public-client = ${keycloak.public-client} -keycloak.use-resource-role-mappings = ${keycloak.use-resource-role-mappings} +# security +spring.security.oauth2.client.registration.keycloak.client-id = ${keycloak.client-id} +spring.security.oauth2.client.registration.keycloak.scope = openid +spring.security.oauth2.client.registration.keycloak.authorization-grant-type = authorization_code +spring.security.oauth2.client.registration.keycloak.redirect-uri = ${keycloak.redirect-uri} +spring.security.oauth2.client.provider.keycloak.issuer-uri = ${keycloak.issuer-uri} +spring.security.oauth2.client.provider.keycloak.authorization-uri = ${keycloak.openid-url}/auth +spring.security.oauth2.client.provider.keycloak.token-uri = ${keycloak.openid-url}/token +spring.security.oauth2.client.provider.keycloak.user-info-uri = ${keycloak.openid-url}/userinfo +spring.security.oauth2.client.provider.keycloak.jwk-set-uri = ${keycloak.openid-url}/certs +spring.security.oauth2.client.provider.keycloak.user-name-attribute = preferred_username ow.keycloak.admin.name = ${ow.keycloak.admin.name} ow.keycloak.admin.password = ${ow.keycloak.admin.password}
DabeiNameFreizeitRolle