diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..72f20de Binary files /dev/null and b/.DS_Store differ diff --git a/backend/.gradle/8.13/checksums/checksums.lock b/backend/.gradle/8.13/checksums/checksums.lock index 0e026db..8e4ba99 100644 Binary files a/backend/.gradle/8.13/checksums/checksums.lock and b/backend/.gradle/8.13/checksums/checksums.lock differ diff --git a/backend/.gradle/8.13/checksums/md5-checksums.bin b/backend/.gradle/8.13/checksums/md5-checksums.bin new file mode 100644 index 0000000..9f8be1c Binary files /dev/null and b/backend/.gradle/8.13/checksums/md5-checksums.bin differ diff --git a/backend/.gradle/8.13/checksums/sha1-checksums.bin b/backend/.gradle/8.13/checksums/sha1-checksums.bin new file mode 100644 index 0000000..e1c7413 Binary files /dev/null and b/backend/.gradle/8.13/checksums/sha1-checksums.bin differ diff --git a/backend/.gradle/8.13/executionHistory/executionHistory.bin b/backend/.gradle/8.13/executionHistory/executionHistory.bin index edf6df2..233b2c5 100644 Binary files a/backend/.gradle/8.13/executionHistory/executionHistory.bin and b/backend/.gradle/8.13/executionHistory/executionHistory.bin differ diff --git a/backend/.gradle/8.13/executionHistory/executionHistory.lock b/backend/.gradle/8.13/executionHistory/executionHistory.lock index 9d4c086..5e931fa 100644 Binary files a/backend/.gradle/8.13/executionHistory/executionHistory.lock and b/backend/.gradle/8.13/executionHistory/executionHistory.lock differ diff --git a/backend/.gradle/8.13/fileHashes/fileHashes.bin b/backend/.gradle/8.13/fileHashes/fileHashes.bin index 079b406..edf5408 100644 Binary files a/backend/.gradle/8.13/fileHashes/fileHashes.bin and b/backend/.gradle/8.13/fileHashes/fileHashes.bin differ diff --git a/backend/.gradle/8.13/fileHashes/fileHashes.lock b/backend/.gradle/8.13/fileHashes/fileHashes.lock index 5a7426d..5c6ed7f 100644 Binary files a/backend/.gradle/8.13/fileHashes/fileHashes.lock and b/backend/.gradle/8.13/fileHashes/fileHashes.lock differ diff --git a/backend/.gradle/8.13/fileHashes/resourceHashesCache.bin b/backend/.gradle/8.13/fileHashes/resourceHashesCache.bin index 88d5e4a..21d6129 100644 Binary files a/backend/.gradle/8.13/fileHashes/resourceHashesCache.bin and b/backend/.gradle/8.13/fileHashes/resourceHashesCache.bin differ diff --git a/backend/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/backend/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 466ff64..8903ad7 100644 Binary files a/backend/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/backend/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/backend/.gradle/buildOutputCleanup/outputFiles.bin b/backend/.gradle/buildOutputCleanup/outputFiles.bin index 8d7fc68..e9fb9ff 100644 Binary files a/backend/.gradle/buildOutputCleanup/outputFiles.bin and b/backend/.gradle/buildOutputCleanup/outputFiles.bin differ diff --git a/backend/.gradle/file-system.probe b/backend/.gradle/file-system.probe index 7123ba5..beb479e 100644 Binary files a/backend/.gradle/file-system.probe and b/backend/.gradle/file-system.probe differ diff --git a/backend/.idea/compiler.xml b/backend/.idea/compiler.xml new file mode 100644 index 0000000..d47b76b --- /dev/null +++ b/backend/.idea/compiler.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/.idea/dataSources.xml b/backend/.idea/dataSources.xml new file mode 100644 index 0000000..a6ddb0a --- /dev/null +++ b/backend/.idea/dataSources.xml @@ -0,0 +1,29 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306 + + + + + + $ProjectFileDir$ + + + mysql_aurora.aws_wrapper + true + software.amazon.jdbc.Driver + jdbc:aws-wrapper:mysql://localhost:3306/scheduler + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/backend/.idea/git_toolbox_blame.xml b/backend/.idea/git_toolbox_blame.xml new file mode 100644 index 0000000..7dc1249 --- /dev/null +++ b/backend/.idea/git_toolbox_blame.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/backend/.idea/gradle.xml b/backend/.idea/gradle.xml new file mode 100644 index 0000000..3a14534 --- /dev/null +++ b/backend/.idea/gradle.xml @@ -0,0 +1,17 @@ + + + + + + + \ No newline at end of file diff --git a/backend/.idea/jarRepositories.xml b/backend/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/backend/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/backend/.idea/misc.xml b/backend/.idea/misc.xml new file mode 100644 index 0000000..c45eb12 --- /dev/null +++ b/backend/.idea/misc.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/backend/.idea/modules.xml b/backend/.idea/modules.xml new file mode 100644 index 0000000..79d1db2 --- /dev/null +++ b/backend/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/backend/.idea/modules/157171029/backend.main.iml b/backend/.idea/modules/157171029/backend.main.iml new file mode 100644 index 0000000..ea0e737 --- /dev/null +++ b/backend/.idea/modules/157171029/backend.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/backend/.idea/modules/backend.main.iml b/backend/.idea/modules/backend.main.iml new file mode 100644 index 0000000..afc1871 --- /dev/null +++ b/backend/.idea/modules/backend.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/backend/.idea/vcs.xml b/backend/.idea/vcs.xml index d843f34..6c0b863 100644 --- a/backend/.idea/vcs.xml +++ b/backend/.idea/vcs.xml @@ -1,4 +1,6 @@ - + + + \ No newline at end of file diff --git a/backend/build.gradle b/backend/build.gradle index f7cc42a..0c49a6e 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -48,6 +48,10 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + + implementation 'io.jsonwebtoken:jjwt-api:0.11.5' + runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5' + runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.5' } tasks.named('test') { diff --git a/backend/build/classes/java/main/capstone/backend/BackendApplication.class b/backend/build/classes/java/main/capstone/backend/BackendApplication.class index ff770b6..3f7e74c 100644 Binary files a/backend/build/classes/java/main/capstone/backend/BackendApplication.class and b/backend/build/classes/java/main/capstone/backend/BackendApplication.class differ diff --git a/backend/build/classes/java/main/capstone/backend/TimeBlock$TimeBlockBuilder.class b/backend/build/classes/java/main/capstone/backend/TimeBlock$TimeBlockBuilder.class deleted file mode 100644 index 8e5966c..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/TimeBlock$TimeBlockBuilder.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/TimeBlock.class b/backend/build/classes/java/main/capstone/backend/TimeBlock.class deleted file mode 100644 index 3371534..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/TimeBlock.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/auth/AuthController$LoginRequest.class b/backend/build/classes/java/main/capstone/backend/auth/AuthController$LoginRequest.class new file mode 100644 index 0000000..272e555 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/auth/AuthController$LoginRequest.class differ diff --git a/backend/build/classes/java/main/capstone/backend/auth/AuthController$TokenResponse.class b/backend/build/classes/java/main/capstone/backend/auth/AuthController$TokenResponse.class new file mode 100644 index 0000000..6d48a62 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/auth/AuthController$TokenResponse.class differ diff --git a/backend/build/classes/java/main/capstone/backend/auth/AuthController.class b/backend/build/classes/java/main/capstone/backend/auth/AuthController.class new file mode 100644 index 0000000..b7f2f3f Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/auth/AuthController.class differ diff --git a/backend/build/classes/java/main/capstone/backend/auth/controller/LoginController.class b/backend/build/classes/java/main/capstone/backend/auth/controller/LoginController.class new file mode 100644 index 0000000..89ba85c Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/auth/controller/LoginController.class differ diff --git a/backend/build/classes/java/main/capstone/backend/auth/dto/LoginRequestDto.class b/backend/build/classes/java/main/capstone/backend/auth/dto/LoginRequestDto.class new file mode 100644 index 0000000..aae3675 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/auth/dto/LoginRequestDto.class differ diff --git a/backend/build/classes/java/main/capstone/backend/auth/dto/TokenResponseDto.class b/backend/build/classes/java/main/capstone/backend/auth/dto/TokenResponseDto.class new file mode 100644 index 0000000..e93e731 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/auth/dto/TokenResponseDto.class differ diff --git a/backend/build/classes/java/main/capstone/backend/auth/service/AuthService.class b/backend/build/classes/java/main/capstone/backend/auth/service/AuthService.class new file mode 100644 index 0000000..4bdaa90 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/auth/service/AuthService.class differ diff --git a/backend/build/classes/java/main/capstone/backend/config/CorsConfig.class b/backend/build/classes/java/main/capstone/backend/config/CorsConfig.class new file mode 100644 index 0000000..34ae853 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/config/CorsConfig.class differ diff --git a/backend/build/classes/java/main/capstone/backend/config/SecurityConfig.class b/backend/build/classes/java/main/capstone/backend/config/SecurityConfig.class index bd4639d..f7aeee3 100644 Binary files a/backend/build/classes/java/main/capstone/backend/config/SecurityConfig.class and b/backend/build/classes/java/main/capstone/backend/config/SecurityConfig.class differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/Task$TaskBuilder.class b/backend/build/classes/java/main/capstone/backend/schedule/Task$TaskBuilder.class deleted file mode 100644 index aa3f897..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/schedule/Task$TaskBuilder.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/Task.class b/backend/build/classes/java/main/capstone/backend/schedule/Task.class deleted file mode 100644 index ba18878..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/schedule/Task.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/TaskController.class b/backend/build/classes/java/main/capstone/backend/schedule/TaskController.class deleted file mode 100644 index 2dd4777..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/schedule/TaskController.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/TaskRepository.class b/backend/build/classes/java/main/capstone/backend/schedule/TaskRepository.class deleted file mode 100644 index 7ce97b6..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/schedule/TaskRepository.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/TaskService.class b/backend/build/classes/java/main/capstone/backend/schedule/TaskService.class deleted file mode 100644 index 1217cdd..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/schedule/TaskService.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/controller/TaskController.class b/backend/build/classes/java/main/capstone/backend/schedule/controller/TaskController.class new file mode 100644 index 0000000..bacd8b9 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/schedule/controller/TaskController.class differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/Category.class b/backend/build/classes/java/main/capstone/backend/schedule/domain/Category.class similarity index 53% rename from backend/build/classes/java/main/capstone/backend/schedule/Category.class rename to backend/build/classes/java/main/capstone/backend/schedule/domain/Category.class index beea631..6c310cc 100644 Binary files a/backend/build/classes/java/main/capstone/backend/schedule/Category.class and b/backend/build/classes/java/main/capstone/backend/schedule/domain/Category.class differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/domain/Task$TaskBuilder.class b/backend/build/classes/java/main/capstone/backend/schedule/domain/Task$TaskBuilder.class new file mode 100644 index 0000000..6ace424 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/schedule/domain/Task$TaskBuilder.class differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/domain/Task.class b/backend/build/classes/java/main/capstone/backend/schedule/domain/Task.class new file mode 100644 index 0000000..503f904 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/schedule/domain/Task.class differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/dto/TaskRequestDTO.class b/backend/build/classes/java/main/capstone/backend/schedule/dto/TaskRequestDTO.class new file mode 100644 index 0000000..593cb10 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/schedule/dto/TaskRequestDTO.class differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/repository/TaskRepository.class b/backend/build/classes/java/main/capstone/backend/schedule/repository/TaskRepository.class new file mode 100644 index 0000000..ab97c0d Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/schedule/repository/TaskRepository.class differ diff --git a/backend/build/classes/java/main/capstone/backend/schedule/service/TaskService.class b/backend/build/classes/java/main/capstone/backend/schedule/service/TaskService.class new file mode 100644 index 0000000..4895b29 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/schedule/service/TaskService.class differ diff --git a/backend/build/classes/java/main/capstone/backend/security/JwtAuthenticationEntryPoint.class b/backend/build/classes/java/main/capstone/backend/security/JwtAuthenticationEntryPoint.class new file mode 100644 index 0000000..2c033b2 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/security/JwtAuthenticationEntryPoint.class differ diff --git a/backend/build/classes/java/main/capstone/backend/security/JwtAuthenticationFilter.class b/backend/build/classes/java/main/capstone/backend/security/JwtAuthenticationFilter.class new file mode 100644 index 0000000..193990c Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/security/JwtAuthenticationFilter.class differ diff --git a/backend/build/classes/java/main/capstone/backend/security/JwtTokenProvider.class b/backend/build/classes/java/main/capstone/backend/security/JwtTokenProvider.class new file mode 100644 index 0000000..bc9ec4b Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/security/JwtTokenProvider.class differ diff --git a/backend/build/classes/java/main/capstone/backend/time/domain/PreferredTime$PreferredTimeBuilder.class b/backend/build/classes/java/main/capstone/backend/time/domain/PreferredTime$PreferredTimeBuilder.class new file mode 100644 index 0000000..76c5d2b Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/time/domain/PreferredTime$PreferredTimeBuilder.class differ diff --git a/backend/build/classes/java/main/capstone/backend/time/domain/PreferredTime.class b/backend/build/classes/java/main/capstone/backend/time/domain/PreferredTime.class new file mode 100644 index 0000000..3308eba Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/time/domain/PreferredTime.class differ diff --git a/backend/build/classes/java/main/capstone/backend/time/repository/PreferredTimeRepository.class b/backend/build/classes/java/main/capstone/backend/time/repository/PreferredTimeRepository.class new file mode 100644 index 0000000..8e39c26 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/time/repository/PreferredTimeRepository.class differ diff --git a/backend/build/classes/java/main/capstone/backend/time/service/PreferredTimeService.class b/backend/build/classes/java/main/capstone/backend/time/service/PreferredTimeService.class new file mode 100644 index 0000000..4e3e099 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/time/service/PreferredTimeService.class differ diff --git a/backend/build/classes/java/main/capstone/backend/timeblock/controller/TimeBlockController.class b/backend/build/classes/java/main/capstone/backend/timeblock/controller/TimeBlockController.class new file mode 100644 index 0000000..eb4a0d5 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/timeblock/controller/TimeBlockController.class differ diff --git a/backend/build/classes/java/main/capstone/backend/timeblock/domain/TimeBlock$TimeBlockBuilder.class b/backend/build/classes/java/main/capstone/backend/timeblock/domain/TimeBlock$TimeBlockBuilder.class new file mode 100644 index 0000000..39cab5c Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/timeblock/domain/TimeBlock$TimeBlockBuilder.class differ diff --git a/backend/build/classes/java/main/capstone/backend/timeblock/domain/TimeBlock.class b/backend/build/classes/java/main/capstone/backend/timeblock/domain/TimeBlock.class new file mode 100644 index 0000000..b46011d Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/timeblock/domain/TimeBlock.class differ diff --git a/backend/build/classes/java/main/capstone/backend/timeblock/repository/TimeBlockRepository.class b/backend/build/classes/java/main/capstone/backend/timeblock/repository/TimeBlockRepository.class new file mode 100644 index 0000000..a7cdabe Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/timeblock/repository/TimeBlockRepository.class differ diff --git a/backend/build/classes/java/main/capstone/backend/timeblock/service/TimeBlockService.class b/backend/build/classes/java/main/capstone/backend/timeblock/service/TimeBlockService.class new file mode 100644 index 0000000..d0446aa Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/timeblock/service/TimeBlockService.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/CustomUserDetails.class b/backend/build/classes/java/main/capstone/backend/user/CustomUserDetails.class new file mode 100644 index 0000000..8cc705d Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/CustomUserDetails.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/PreferredTime.class b/backend/build/classes/java/main/capstone/backend/user/PreferredTime.class deleted file mode 100644 index de695aa..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/user/PreferredTime.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/user/User$UserBuilder.class b/backend/build/classes/java/main/capstone/backend/user/User$UserBuilder.class deleted file mode 100644 index e38428f..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/user/User$UserBuilder.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/user/User.class b/backend/build/classes/java/main/capstone/backend/user/User.class deleted file mode 100644 index e1152c3..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/user/User.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/user/UserController.class b/backend/build/classes/java/main/capstone/backend/user/UserController.class deleted file mode 100644 index 56f08e7..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/user/UserController.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/user/UserRepository.class b/backend/build/classes/java/main/capstone/backend/user/UserRepository.class deleted file mode 100644 index ca93580..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/user/UserRepository.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/user/UserService.class b/backend/build/classes/java/main/capstone/backend/user/UserService.class deleted file mode 100644 index 22e397b..0000000 Binary files a/backend/build/classes/java/main/capstone/backend/user/UserService.class and /dev/null differ diff --git a/backend/build/classes/java/main/capstone/backend/user/controller/UserController.class b/backend/build/classes/java/main/capstone/backend/user/controller/UserController.class new file mode 100644 index 0000000..68f0cbd Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/controller/UserController.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/domain/PreferredTime.class b/backend/build/classes/java/main/capstone/backend/user/domain/PreferredTime.class new file mode 100644 index 0000000..8cc7248 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/domain/PreferredTime.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/domain/User$UserBuilder.class b/backend/build/classes/java/main/capstone/backend/user/domain/User$UserBuilder.class new file mode 100644 index 0000000..f2fddad Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/domain/User$UserBuilder.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/domain/User.class b/backend/build/classes/java/main/capstone/backend/user/domain/User.class new file mode 100644 index 0000000..463580e Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/domain/User.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/dto/LoginRequestDto.class b/backend/build/classes/java/main/capstone/backend/user/dto/LoginRequestDto.class new file mode 100644 index 0000000..4e12f25 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/dto/LoginRequestDto.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/dto/UserSignupRequestDto.class b/backend/build/classes/java/main/capstone/backend/user/dto/UserSignupRequestDto.class new file mode 100644 index 0000000..88e68a5 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/dto/UserSignupRequestDto.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/repository/UserRepository.class b/backend/build/classes/java/main/capstone/backend/user/repository/UserRepository.class new file mode 100644 index 0000000..7e99a42 Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/repository/UserRepository.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/service/CustomUserDetailsService.class b/backend/build/classes/java/main/capstone/backend/user/service/CustomUserDetailsService.class new file mode 100644 index 0000000..f72b90b Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/service/CustomUserDetailsService.class differ diff --git a/backend/build/classes/java/main/capstone/backend/user/service/UserService.class b/backend/build/classes/java/main/capstone/backend/user/service/UserService.class new file mode 100644 index 0000000..3e7bd6f Binary files /dev/null and b/backend/build/classes/java/main/capstone/backend/user/service/UserService.class differ diff --git a/backend/build/classes/java/test/capstone/backend/BackendApplicationTests.class b/backend/build/classes/java/test/capstone/backend/BackendApplicationTests.class new file mode 100644 index 0000000..07bfaf8 Binary files /dev/null and b/backend/build/classes/java/test/capstone/backend/BackendApplicationTests.class differ diff --git a/backend/build/libs/backend-0.0.1-SNAPSHOT-plain.jar b/backend/build/libs/backend-0.0.1-SNAPSHOT-plain.jar new file mode 100644 index 0000000..6159526 Binary files /dev/null and b/backend/build/libs/backend-0.0.1-SNAPSHOT-plain.jar differ diff --git a/backend/build/libs/backend-0.0.1-SNAPSHOT.jar b/backend/build/libs/backend-0.0.1-SNAPSHOT.jar new file mode 100644 index 0000000..47534eb Binary files /dev/null and b/backend/build/libs/backend-0.0.1-SNAPSHOT.jar differ diff --git a/backend/build/reports/problems/problems-report.html b/backend/build/reports/problems/problems-report.html index 329f11a..b628949 100644 --- a/backend/build/reports/problems/problems-report.html +++ b/backend/build/reports/problems/problems-report.html @@ -650,7 +650,7 @@ diff --git a/backend/build/reports/tests/test/classes/capstone.backend.BackendApplicationTests.html b/backend/build/reports/tests/test/classes/capstone.backend.BackendApplicationTests.html new file mode 100644 index 0000000..4895d16 --- /dev/null +++ b/backend/build/reports/tests/test/classes/capstone.backend.BackendApplicationTests.html @@ -0,0 +1,1658 @@ + + + + + +Test results - BackendApplicationTests + + + + + +
+

BackendApplicationTests

+ +
+ + + + + +
+
+ + + + + + + +
+
+
1
+

tests

+
+
+
+
1
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.017s
+

duration

+
+
+
+
+
+
0%
+

successful

+
+
+
+
+ +
+

Failed tests

+
+ +

contextLoads()

+ +
java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@12c78f36 testClass = capstone.backend.BackendApplicationTests, locations = [], classes = [capstone.backend.BackendApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@3ecd267f, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@6c5945a7, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@78365cfa, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@3a0d172f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@6c25e6c4, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@73dce0e6, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@a2adb2dd], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180)
+	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130)
+	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200)
+	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139)
+	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260)
+	at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160)
+	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
+	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
+	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
+	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
+	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
+	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
+	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
+	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
+	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
+	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
+	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
+	at java.base/java.util.Optional.orElseGet(Optional.java:364)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct)
+	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812)
+	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
+	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523)
+	at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339)
+	at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:347)
+	at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
+	at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207)
+	at app//org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970)
+	at app//org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627)
+	at app//org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752)
+	at app//org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
+	at app//org.springframework.boot.SpringApplication.run(SpringApplication.java:318)
+	at app//org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144)
+	at app//org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58)
+	at app//org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46)
+	at app//org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461)
+	at app//org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563)
+	at app//org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144)
+	at app//org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110)
+	at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225)
+	at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152)
+	... 19 more
+Caused by: org.hibernate.DuplicateMappingException: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct)
+	at app//org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addEntityBinding(InFlightMetadataCollectorImpl.java:360)
+	at app//org.hibernate.boot.model.internal.EntityBinder.bindEntityClass(EntityBinder.java:262)
+	at app//org.hibernate.boot.model.internal.AnnotationBinder.bindClass(AnnotationBinder.java:401)
+	at app//org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:257)
+	at app//org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:281)
+	at app//org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:324)
+	at app//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1442)
+	at app//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1513)
+	at app//org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66)
+	at app//org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390)
+	at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419)
+	at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400)
+	at app//org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366)
+	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859)
+	at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808)
+	... 39 more
+
+
+
+
+
+

Tests

+ + + + + + + + + + + + + +
TestDurationResult
contextLoads()0.017sfailed
+
+
+

Standard output

+ +
17:33:31.533 [Test worker] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [capstone.backend.BackendApplicationTests]: BackendApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
+17:33:31.864 [Test worker] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration capstone.backend.BackendApplication for test class capstone.backend.BackendApplicationTests
+
+  .   ____          _            __ _ _
+ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
+( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
+ \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
+  '  |____| .__|_| |_|_| |_\__, | / / / /
+ =========|_|==============|___/=/_/_/_/
+
+ :: Spring Boot ::                (v3.4.4)
+
+2025-04-29T17:33:32.896+09:00  INFO 17940 --- [backend] [    Test worker] c.backend.BackendApplicationTests        : Starting BackendApplicationTests using Java 17.0.14 with PID 17940 (started by dmltj in C:\bbackend\capstone_backend\backend)
+2025-04-29T17:33:32.900+09:00  INFO 17940 --- [backend] [    Test worker] c.backend.BackendApplicationTests        : No active profile set, falling back to 1 default profile: "default"
+2025-04-29T17:33:34.445+09:00  INFO 17940 --- [backend] [    Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
+2025-04-29T17:33:34.582+09:00  INFO 17940 --- [backend] [    Test worker] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 114 ms. Found 4 JPA repository interfaces.
+2025-04-29T17:33:36.312+09:00  INFO 17940 --- [backend] [    Test worker] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
+2025-04-29T17:33:36.504+09:00  INFO 17940 --- [backend] [    Test worker] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.6.11.Final
+2025-04-29T17:33:36.627+09:00  INFO 17940 --- [backend] [    Test worker] o.h.c.internal.RegionFactoryInitiator    : HHH000026: Second-level cache disabled
+2025-04-29T17:33:37.674+09:00  INFO 17940 --- [backend] [    Test worker] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
+2025-04-29T17:33:37.898+09:00  INFO 17940 --- [backend] [    Test worker] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
+2025-04-29T17:33:39.079+09:00  INFO 17940 --- [backend] [    Test worker] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@4f4d05b3
+2025-04-29T17:33:39.092+09:00  INFO 17940 --- [backend] [    Test worker] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
+2025-04-29T17:33:39.411+09:00  WARN 17940 --- [backend] [    Test worker] org.hibernate.orm.deprecation            : HHH90000025: MySQL8Dialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)
+2025-04-29T17:33:39.415+09:00  WARN 17940 --- [backend] [    Test worker] org.hibernate.orm.deprecation            : HHH90000026: MySQL8Dialect has been deprecated; use org.hibernate.dialect.MySQLDialect instead
+2025-04-29T17:33:39.506+09:00  INFO 17940 --- [backend] [    Test worker] org.hibernate.orm.connections.pooling    : HHH10001005: Database info:
+	Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)']
+	Database driver: undefined/unknown
+	Database version: 8.0
+	Autocommit mode: undefined/unknown
+	Isolation level: undefined/unknown
+	Minimum pool size: undefined/unknown
+	Maximum pool size: undefined/unknown
+2025-04-29T17:33:41.734+09:00 ERROR 17940 --- [backend] [    Test worker] j.LocalContainerEntityManagerFactoryBean : Failed to initialize JPA EntityManagerFactory: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct)
+2025-04-29T17:33:41.736+09:00  WARN 17940 --- [backend] [    Test worker] o.s.w.c.s.GenericWebApplicationContext   : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct)
+2025-04-29T17:33:41.737+09:00  INFO 17940 --- [backend] [    Test worker] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
+2025-04-29T17:33:41.766+09:00  INFO 17940 --- [backend] [    Test worker] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
+2025-04-29T17:33:42.033+09:00  INFO 17940 --- [backend] [    Test worker] .s.b.a.l.ConditionEvaluationReportLogger : 
+
+Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
+2025-04-29T17:33:42.146+09:00 ERROR 17940 --- [backend] [    Test worker] o.s.boot.SpringApplication               : Application run failed
+
+org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:347) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) ~[spring-context-6.2.5.jar:6.2.5]
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.5.jar:6.2.5]
+	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.4.jar:3.4.4]
+	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.4.jar:3.4.4]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.4.jar:3.4.4]
+	at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) ~[spring-boot-test-3.4.4.jar:3.4.4]
+	at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[spring-core-6.2.5.jar:6.2.5]
+	at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[spring-core-6.2.5.jar:6.2.5]
+	at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) ~[spring-boot-3.4.4.jar:3.4.4]
+	at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) ~[spring-boot-test-3.4.4.jar:3.4.4]
+	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) ~[spring-boot-test-3.4.4.jar:3.4.4]
+	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) ~[spring-boot-test-3.4.4.jar:3.4.4]
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
+	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
+	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[na:na]
+	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
+	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) ~[na:na]
+	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
+	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
+	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na]
+	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na]
+	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
+	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at java.base/java.util.Optional.orElseGet(Optional.java:364) ~[na:na]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
+	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
+	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) ~[na:na]
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
+	at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na]
+	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) ~[na:na]
+	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) ~[na:na]
+	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) ~[na:na]
+	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) ~[na:na]
+	at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) ~[na:na]
+	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) ~[na:na]
+	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) ~[na:na]
+	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) ~[na:na]
+	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) ~[gradle-worker.jar:na]
+	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) ~[gradle-worker.jar:na]
+Caused by: org.hibernate.DuplicateMappingException: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct)
+	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addEntityBinding(InFlightMetadataCollectorImpl.java:360) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.internal.EntityBinder.bindEntityClass(EntityBinder.java:262) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.internal.AnnotationBinder.bindClass(AnnotationBinder.java:401) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:257) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:281) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:324) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1442) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1513) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) ~[spring-beans-6.2.5.jar:6.2.5]
+	... 109 common frames omitted
+
+2025-04-29T17:33:42.200+09:00  WARN 17940 --- [backend] [    Test worker] o.s.test.context.TestContextManager      : Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener] to prepare test instance [capstone.backend.BackendApplicationTests@7bdb4d69]
+
+java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@12c78f36 testClass = capstone.backend.BackendApplicationTests, locations = [], classes = [capstone.backend.BackendApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@3ecd267f, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@6c5945a7, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@78365cfa, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@3a0d172f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@6c25e6c4, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@73dce0e6, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@a2adb2dd], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null]
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$11(ClassBasedTestDescriptor.java:378) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:383) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$12(ClassBasedTestDescriptor.java:378) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) ~[na:na]
+	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
+	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) ~[na:na]
+	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[na:na]
+	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) ~[na:na]
+	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[na:na]
+	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[na:na]
+	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) ~[na:na]
+	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) ~[na:na]
+	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:na]
+	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) ~[na:na]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:377) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$instantiateAndPostProcessTestInstance$7(ClassBasedTestDescriptor.java:290) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:289) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:279) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at java.base/java.util.Optional.orElseGet(Optional.java:364) ~[na:na]
+	at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$6(ClassBasedTestDescriptor.java:278) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$1(TestMethodTestDescriptor.java:105) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:104) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:68) ~[junit-jupiter-engine-5.11.4.jar:5.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:128) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:128) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
+	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
+	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) ~[junit-platform-engine-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:198) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:169) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:93) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:58) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:141) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:57) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47) ~[junit-platform-launcher-1.11.4.jar:1.11.4]
+	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:124) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:99) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:94) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63) ~[na:na]
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
+	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
+	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
+	at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na]
+	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36) ~[na:na]
+	at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24) ~[na:na]
+	at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33) ~[na:na]
+	at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:92) ~[na:na]
+	at jdk.proxy1/jdk.proxy1.$Proxy4.stop(Unknown Source) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.worker.TestWorker$3.run(TestWorker.java:200) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.worker.TestWorker.executeAndMaintainThreadName(TestWorker.java:132) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:103) ~[na:na]
+	at org.gradle.api.internal.tasks.testing.worker.TestWorker.execute(TestWorker.java:63) ~[na:na]
+	at org.gradle.process.internal.worker.child.ActionExecutionWorker.execute(ActionExecutionWorker.java:56) ~[na:na]
+	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:121) ~[na:na]
+	at org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.call(SystemApplicationClassLoaderWorker.java:71) ~[na:na]
+	at worker.org.gradle.process.internal.worker.GradleWorkerMain.run(GradleWorkerMain.java:69) ~[gradle-worker.jar:na]
+	at worker.org.gradle.process.internal.worker.GradleWorkerMain.main(GradleWorkerMain.java:74) ~[gradle-worker.jar:na]
+Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct)
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:347) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) ~[spring-context-6.2.5.jar:6.2.5]
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.5.jar:6.2.5]
+	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.4.jar:3.4.4]
+	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.4.jar:3.4.4]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.4.jar:3.4.4]
+	at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) ~[spring-boot-test-3.4.4.jar:3.4.4]
+	at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) ~[spring-core-6.2.5.jar:6.2.5]
+	at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) ~[spring-core-6.2.5.jar:6.2.5]
+	at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) ~[spring-boot-3.4.4.jar:3.4.4]
+	at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) ~[spring-boot-test-3.4.4.jar:3.4.4]
+	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) ~[spring-boot-test-3.4.4.jar:3.4.4]
+	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) ~[spring-boot-test-3.4.4.jar:3.4.4]
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) ~[spring-test-6.2.5.jar:6.2.5]
+	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) ~[spring-test-6.2.5.jar:6.2.5]
+	... 89 common frames omitted
+Caused by: org.hibernate.DuplicateMappingException: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct)
+	at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addEntityBinding(InFlightMetadataCollectorImpl.java:360) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.internal.EntityBinder.bindEntityClass(EntityBinder.java:262) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.internal.AnnotationBinder.bindClass(AnnotationBinder.java:401) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:257) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:281) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:324) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1442) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1513) ~[hibernate-core-6.6.11.Final.jar:6.6.11.Final]
+	at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) ~[spring-orm-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859) ~[spring-beans-6.2.5.jar:6.2.5]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) ~[spring-beans-6.2.5.jar:6.2.5]
+	... 109 common frames omitted
+
+
+
+
+
+

Standard error

+ +
+
+
+============================
+CONDITIONS EVALUATION REPORT
+============================
+
+
+Positive matches:
+-----------------
+
+   AopAutoConfiguration matched:
+      - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
+
+   AopAutoConfiguration.AspectJAutoProxyingConfiguration matched:
+      - @ConditionalOnClass found required class 'org.aspectj.weaver.Advice' (OnClassCondition)
+
+   AopAutoConfiguration.AspectJAutoProxyingConfiguration.CglibAutoProxyConfiguration matched:
+      - @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
+
+   ApplicationAvailabilityAutoConfiguration#applicationAvailability matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.availability.ApplicationAvailability; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   DataSourceAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)
+      - @ConditionalOnMissingBean (types: io.r2dbc.spi.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   DataSourceAutoConfiguration.PooledDataSourceConfiguration matched:
+      - AnyNestedCondition 1 matched 1 did not; NestedCondition on DataSourceAutoConfiguration.PooledDataSourceCondition.PooledDataSourceAvailable PooledDataSource found supported DataSource; NestedCondition on DataSourceAutoConfiguration.PooledDataSourceCondition.ExplicitType @ConditionalOnProperty (spring.datasource.type) did not find property 'type' (DataSourceAutoConfiguration.PooledDataSourceCondition)
+      - @ConditionalOnMissingBean (types: javax.sql.DataSource,javax.sql.XADataSource; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   DataSourceAutoConfiguration.PooledDataSourceConfiguration#jdbcConnectionDetails matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jdbc.JdbcConnectionDetails; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   DataSourceConfiguration.Hikari matched:
+      - @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition)
+      - @ConditionalOnProperty (spring.datasource.type=com.zaxxer.hikari.HikariDataSource) matched (OnPropertyCondition)
+      - @ConditionalOnMissingBean (types: javax.sql.DataSource; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   DataSourceInitializationConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.jdbc.datasource.init.DatabasePopulator' (OnClassCondition)
+      - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.sql.init.SqlDataSourceScriptDatabaseInitializer,org.springframework.boot.autoconfigure.sql.init.SqlR2dbcScriptDatabaseInitializer; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   DataSourcePoolMetadataProvidersConfiguration.HikariPoolDataSourceMetadataProviderConfiguration matched:
+      - @ConditionalOnClass found required class 'com.zaxxer.hikari.HikariDataSource' (OnClassCondition)
+
+   DataSourceTransactionManagerAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate', 'org.springframework.transaction.TransactionManager' (OnClassCondition)
+
+   DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration matched:
+      - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
+
+   DispatcherServletAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+
+   DispatcherServletAutoConfiguration.DispatcherServletConfiguration matched:
+      - @ConditionalOnClass found required class 'jakarta.servlet.ServletRegistration' (OnClassCondition)
+      - Default DispatcherServlet did not find dispatcher servlet beans (DispatcherServletAutoConfiguration.DefaultDispatcherServletCondition)
+
+   DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration matched:
+      - @ConditionalOnClass found required class 'jakarta.servlet.ServletRegistration' (OnClassCondition)
+      - DispatcherServlet Registration did not find servlet registration bean (DispatcherServletAutoConfiguration.DispatcherServletRegistrationCondition)
+
+   DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration#dispatcherServletRegistration matched:
+      - @ConditionalOnBean (names: dispatcherServlet types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found bean 'dispatcherServlet' (OnBeanCondition)
+
+   ErrorMvcAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+
+   ErrorMvcAutoConfiguration#basicErrorController matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.error.ErrorController; SearchStrategy: current) did not find any beans (OnBeanCondition)
+
+   ErrorMvcAutoConfiguration#errorAttributes matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.error.ErrorAttributes; SearchStrategy: current) did not find any beans (OnBeanCondition)
+
+   ErrorMvcAutoConfiguration.DefaultErrorViewResolverConfiguration#conventionErrorViewResolver matched:
+      - @ConditionalOnBean (types: org.springframework.web.servlet.DispatcherServlet; SearchStrategy: all) found bean 'dispatcherServlet'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration matched:
+      - @ConditionalOnProperty (server.error.whitelabel.enabled) matched (OnPropertyCondition)
+      - ErrorTemplate Missing did not find error template view (ErrorMvcAutoConfiguration.ErrorTemplateMissingCondition)
+
+   ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration#beanNameViewResolver matched:
+      - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   ErrorMvcAutoConfiguration.WhitelabelErrorViewConfiguration#defaultErrorView matched:
+      - @ConditionalOnMissingBean (names: error; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   GenericCacheConfiguration matched:
+      - Cache org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration automatic cache type (CacheCondition)
+
+   HibernateJpaAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean', 'jakarta.persistence.EntityManager', 'org.hibernate.engine.spi.SessionImplementor' (OnClassCondition)
+
+   HibernateJpaConfiguration matched:
+      - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
+
+   HttpClientAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.http.client.ClientHttpRequestFactory' (OnClassCondition)
+      - NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationCondition)
+
+   HttpClientAutoConfiguration#clientHttpRequestFactoryBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   HttpClientAutoConfiguration#clientHttpRequestFactorySettings matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.http.client.ClientHttpRequestFactorySettings; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   HttpEncodingAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.web.filter.CharacterEncodingFilter' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+      - @ConditionalOnProperty (server.servlet.encoding.enabled) matched (OnPropertyCondition)
+
+   HttpEncodingAutoConfiguration#characterEncodingFilter matched:
+      - @ConditionalOnMissingBean (types: org.springframework.web.filter.CharacterEncodingFilter; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   HttpMessageConvertersAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.http.converter.HttpMessageConverter' (OnClassCondition)
+      - NoneNestedConditions 0 matched 1 did not; NestedCondition on HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (HttpMessageConvertersAutoConfiguration.NotReactiveWebApplicationCondition)
+
+   HttpMessageConvertersAutoConfiguration#messageConverters matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.http.HttpMessageConverters; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   HttpMessageConvertersAutoConfiguration.StringHttpMessageConverterConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.http.converter.StringHttpMessageConverter' (OnClassCondition)
+
+   HttpMessageConvertersAutoConfiguration.StringHttpMessageConverterConfiguration#stringHttpMessageConverter matched:
+      - @ConditionalOnMissingBean (types: org.springframework.http.converter.StringHttpMessageConverter; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JacksonAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition)
+
+   JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition)
+
+   JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition)
+
+   JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration#jacksonObjectMapperBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JacksonAutoConfiguration.JacksonObjectMapperConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.http.converter.json.Jackson2ObjectMapperBuilder' (OnClassCondition)
+
+   JacksonAutoConfiguration.JacksonObjectMapperConfiguration#jacksonObjectMapper matched:
+      - @ConditionalOnMissingBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JacksonAutoConfiguration.ParameterNamesModuleConfiguration matched:
+      - @ConditionalOnClass found required class 'com.fasterxml.jackson.module.paramnames.ParameterNamesModule' (OnClassCondition)
+
+   JacksonAutoConfiguration.ParameterNamesModuleConfiguration#parameterNamesModule matched:
+      - @ConditionalOnMissingBean (types: com.fasterxml.jackson.module.paramnames.ParameterNamesModule; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration matched:
+      - @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper' (OnClassCondition)
+      - @ConditionalOnProperty (spring.mvc.converters.preferred-json-mapper=jackson) matched (OnPropertyCondition)
+      - @ConditionalOnBean (types: com.fasterxml.jackson.databind.ObjectMapper; SearchStrategy: all) found bean 'jacksonObjectMapper' (OnBeanCondition)
+
+   JacksonHttpMessageConvertersConfiguration.MappingJackson2HttpMessageConverterConfiguration#mappingJackson2HttpMessageConverter matched:
+      - @ConditionalOnMissingBean (types: org.springframework.http.converter.json.MappingJackson2HttpMessageConverter ignored: org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter,org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JdbcClientAutoConfiguration matched:
+      - @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; SearchStrategy: all) found a single bean 'namedParameterJdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.simple.JdbcClient; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JdbcTemplateAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.core.JdbcTemplate' (OnClassCondition)
+      - @ConditionalOnSingleCandidate (types: javax.sql.DataSource; SearchStrategy: all) found a single bean 'dataSource' (OnBeanCondition)
+
+   JdbcTemplateConfiguration matched:
+      - @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JpaBaseConfiguration#entityManagerFactory matched:
+      - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JpaBaseConfiguration#entityManagerFactoryBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JpaBaseConfiguration#jpaVendorAdapter matched:
+      - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.JpaVendorAdapter; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JpaBaseConfiguration#transactionManager matched:
+      - @ConditionalOnMissingBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JpaBaseConfiguration.JpaWebConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+      - @ConditionalOnProperty (spring.jpa.open-in-view=true) matched (OnPropertyCondition)
+      - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor,org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JpaBaseConfiguration.PersistenceManagedTypesConfiguration matched:
+      - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean,jakarta.persistence.EntityManagerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JpaBaseConfiguration.PersistenceManagedTypesConfiguration#persistenceManagedTypes matched:
+      - @ConditionalOnMissingBean (types: org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   JtaAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'jakarta.transaction.Transaction' (OnClassCondition)
+      - @ConditionalOnProperty (spring.jta.enabled) matched (OnPropertyCondition)
+
+   LifecycleAutoConfiguration#defaultLifecycleProcessor matched:
+      - @ConditionalOnMissingBean (names: lifecycleProcessor; SearchStrategy: current) did not find any beans (OnBeanCondition)
+
+   MultipartAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.multipart.support.StandardServletMultipartResolver', 'jakarta.servlet.MultipartConfigElement' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+      - @ConditionalOnProperty (spring.servlet.multipart.enabled) matched (OnPropertyCondition)
+
+   MultipartAutoConfiguration#multipartConfigElement matched:
+      - @ConditionalOnMissingBean (types: jakarta.servlet.MultipartConfigElement; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   MultipartAutoConfiguration#multipartResolver matched:
+      - @ConditionalOnMissingBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   NamedParameterJdbcTemplateConfiguration matched:
+      - @ConditionalOnSingleCandidate (types: org.springframework.jdbc.core.JdbcTemplate; SearchStrategy: all) found a single bean 'jdbcTemplate'; @ConditionalOnMissingBean (types: org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   NoOpCacheConfiguration matched:
+      - Cache org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration automatic cache type (CacheCondition)
+
+   PersistenceExceptionTranslationAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor' (OnClassCondition)
+
+   PersistenceExceptionTranslationAutoConfiguration#persistenceExceptionTranslationPostProcessor matched:
+      - @ConditionalOnProperty (spring.dao.exceptiontranslation.enabled) matched (OnPropertyCondition)
+      - @ConditionalOnMissingBean (types: org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   PropertyPlaceholderAutoConfiguration#propertySourcesPlaceholderConfigurer matched:
+      - @ConditionalOnMissingBean (types: org.springframework.context.support.PropertySourcesPlaceholderConfigurer; SearchStrategy: current) did not find any beans (OnBeanCondition)
+
+   RestClientAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.web.client.RestClient' (OnClassCondition)
+      - NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationCondition)
+
+   RestClientAutoConfiguration#httpMessageConvertersRestClientCustomizer matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.HttpMessageConvertersRestClientCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   RestClientAutoConfiguration#restClientBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.web.client.RestClient$Builder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   RestClientAutoConfiguration#restClientBuilderConfigurer matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.RestClientBuilderConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   RestClientAutoConfiguration#restClientSsl matched:
+      - @ConditionalOnBean (types: org.springframework.boot.ssl.SslBundles; SearchStrategy: all) found bean 'sslBundleRegistry'; @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.web.client.RestClientSsl; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   RestTemplateAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.web.client.RestTemplate' (OnClassCondition)
+      - NoneNestedConditions 0 matched 1 did not; NestedCondition on NotReactiveWebApplicationCondition.ReactiveWebApplication did not find reactive web application classes (NotReactiveWebApplicationCondition)
+
+   RestTemplateAutoConfiguration#restTemplateBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.web.client.RestTemplateBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   SecurityAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.security.authentication.DefaultAuthenticationEventPublisher' (OnClassCondition)
+
+   SecurityAutoConfiguration#authenticationEventPublisher matched:
+      - @ConditionalOnMissingBean (types: org.springframework.security.authentication.AuthenticationEventPublisher; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   SecurityFilterAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer', 'org.springframework.security.config.http.SessionCreationPolicy' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+
+   SecurityFilterAutoConfiguration#securityFilterChainRegistration matched:
+      - @ConditionalOnBean (names: springSecurityFilterChain; SearchStrategy: all) found bean 'springSecurityFilterChain' (OnBeanCondition)
+
+   ServletWebServerFactoryAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'jakarta.servlet.ServletRequest' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+
+   ServletWebServerFactoryAutoConfiguration#tomcatServletWebServerFactoryCustomizer matched:
+      - @ConditionalOnClass found required class 'org.apache.catalina.startup.Tomcat' (OnClassCondition)
+
+   ServletWebServerFactoryConfiguration.EmbeddedTomcat matched:
+      - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.apache.catalina.startup.Tomcat', 'org.apache.coyote.UpgradeProtocol' (OnClassCondition)
+      - @ConditionalOnMissingBean (types: org.springframework.boot.web.servlet.server.ServletWebServerFactory; SearchStrategy: current) did not find any beans (OnBeanCondition)
+
+   SimpleCacheConfiguration matched:
+      - Cache org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration automatic cache type (CacheCondition)
+
+   SpringBootWebSecurityConfiguration matched:
+      - found 'session' scope (OnWebApplicationCondition)
+
+   SpringDataWebAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'org.springframework.data.web.PageableHandlerMethodArgumentResolver', 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+      - @ConditionalOnMissingBean (types: org.springframework.data.web.PageableHandlerMethodArgumentResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   SpringDataWebAutoConfiguration#pageableCustomizer matched:
+      - @ConditionalOnMissingBean (types: org.springframework.data.web.config.PageableHandlerMethodArgumentResolverCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   SpringDataWebAutoConfiguration#sortCustomizer matched:
+      - @ConditionalOnMissingBean (types: org.springframework.data.web.config.SortHandlerMethodArgumentResolverCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   SpringDataWebAutoConfiguration#springDataWebSettings matched:
+      - @ConditionalOnMissingBean (types: org.springframework.data.web.config.SpringDataWebSettings; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   SqlInitializationAutoConfiguration matched:
+      - @ConditionalOnProperty (spring.sql.init.enabled) matched (OnPropertyCondition)
+      - NoneNestedConditions 0 matched 1 did not; NestedCondition on SqlInitializationAutoConfiguration.SqlInitializationModeCondition.ModeIsNever @ConditionalOnProperty (spring.sql.init.mode=never) did not find property 'mode' (SqlInitializationAutoConfiguration.SqlInitializationModeCondition)
+
+   SslAutoConfiguration#sslBundleRegistry matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.ssl.SslBundleRegistry,org.springframework.boot.ssl.SslBundles; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   TaskExecutionAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor' (OnClassCondition)
+
+   TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+      - @ConditionalOnThreading found PLATFORM (OnThreadingCondition)
+
+   TaskExecutorConfigurations.TaskExecutorConfiguration matched:
+      - @ConditionalOnMissingBean (types: java.util.concurrent.Executor; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   TaskExecutorConfigurations.TaskExecutorConfiguration#applicationTaskExecutor matched:
+      - @ConditionalOnThreading found PLATFORM (OnThreadingCondition)
+
+   TaskExecutorConfigurations.ThreadPoolTaskExecutorBuilderConfiguration#threadPoolTaskExecutorBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskExecutorBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   TaskSchedulingAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler' (OnClassCondition)
+
+   TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+      - @ConditionalOnThreading found PLATFORM (OnThreadingCondition)
+
+   TaskSchedulingConfigurations.ThreadPoolTaskSchedulerBuilderConfiguration#threadPoolTaskSchedulerBuilder matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.task.ThreadPoolTaskSchedulerBuilder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   TemplateEngineConfigurations.DefaultTemplateEngineConfiguration#templateEngine matched:
+      - @ConditionalOnMissingBean (types: org.thymeleaf.spring6.ISpringTemplateEngine; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   ThymeleafAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'org.thymeleaf.templatemode.TemplateMode', 'org.thymeleaf.spring6.SpringTemplateEngine' (OnClassCondition)
+
+   ThymeleafAutoConfiguration.DefaultTemplateResolverConfiguration matched:
+      - @ConditionalOnMissingBean (names: defaultTemplateResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   ThymeleafAutoConfiguration.ThymeleafSecurityDialectConfiguration matched:
+      - @ConditionalOnClass found required classes 'org.thymeleaf.extras.springsecurity6.dialect.SpringSecurityDialect', 'org.springframework.security.web.server.csrf.CsrfToken' (OnClassCondition)
+
+   ThymeleafAutoConfiguration.ThymeleafSecurityDialectConfiguration#securityDialect matched:
+      - @ConditionalOnMissingBean (types: org.thymeleaf.extras.springsecurity6.dialect.SpringSecurityDialect; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration matched:
+      - found 'session' scope (OnWebApplicationCondition)
+      - @ConditionalOnProperty (spring.thymeleaf.enabled) matched (OnPropertyCondition)
+
+   ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration.ThymeleafViewResolverConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.web.servlet.view.AbstractCachingViewResolver' (OnClassCondition)
+
+   ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration.ThymeleafViewResolverConfiguration#thymeleafViewResolver matched:
+      - @ConditionalOnMissingBean (names: thymeleafViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   TransactionAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition)
+
+   TransactionAutoConfiguration.EnableTransactionManagementConfiguration matched:
+      - @ConditionalOnBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found bean 'transactionManager'; @ConditionalOnMissingBean (types: org.springframework.transaction.annotation.AbstractTransactionManagementConfiguration; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   TransactionAutoConfiguration.EnableTransactionManagementConfiguration.CglibAutoProxyConfiguration matched:
+      - @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
+
+   TransactionAutoConfiguration.TransactionTemplateConfiguration matched:
+      - @ConditionalOnSingleCandidate (types: org.springframework.transaction.PlatformTransactionManager; SearchStrategy: all) found a single bean 'transactionManager' (OnBeanCondition)
+
+   TransactionAutoConfiguration.TransactionTemplateConfiguration#transactionTemplate matched:
+      - @ConditionalOnMissingBean (types: org.springframework.transaction.support.TransactionOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   TransactionManagerCustomizationAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.transaction.PlatformTransactionManager' (OnClassCondition)
+
+   TransactionManagerCustomizationAutoConfiguration#platformTransactionManagerCustomizers matched:
+      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.transaction.TransactionManagerCustomizers; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   UserDetailsServiceAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'org.springframework.security.authentication.AuthenticationManager' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+      - AnyNestedCondition 3 matched 0 did not; NestedCondition on UserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.PasswordConfigured @ConditionalOnProperty (spring.security.user.password) matched; NestedCondition on UserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.NameConfigured @ConditionalOnProperty (spring.security.user.name) matched; NestedCondition on UserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.MissingAlternative @ConditionalOnMissingClass did not find unwanted classes 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository', 'org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector', 'org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository' (UserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured)
+      - @ConditionalOnBean (types: org.springframework.security.config.ObjectPostProcessor; SearchStrategy: all) found beans 'objectPostProcessor', 'webAuthorizationManagerPostProcessor', 'filterChainDecoratorPostProcessor', 'authenticationManagerPostProcessor'; @ConditionalOnMissingBean (types: org.springframework.security.authentication.AuthenticationManager,org.springframework.security.authentication.AuthenticationProvider,org.springframework.security.core.userdetails.UserDetailsService,org.springframework.security.authentication.AuthenticationManagerResolver,org.springframework.security.oauth2.jwt.JwtDecoder; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   ValidationAutoConfiguration matched:
+      - @ConditionalOnClass found required class 'jakarta.validation.executable.ExecutableValidator' (OnClassCondition)
+      - @ConditionalOnResource found location classpath:META-INF/services/jakarta.validation.spi.ValidationProvider (OnResourceCondition)
+
+   ValidationAutoConfiguration#defaultValidator matched:
+      - @ConditionalOnMissingBean (types: jakarta.validation.Validator; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   ValidationAutoConfiguration#methodValidationPostProcessor matched:
+      - @ConditionalOnMissingBean (types: org.springframework.validation.beanvalidation.MethodValidationPostProcessor; SearchStrategy: current) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'org.springframework.web.servlet.DispatcherServlet', 'org.springframework.web.servlet.config.annotation.WebMvcConfigurer' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+      - @ConditionalOnMissingBean (types: org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration#formContentFilter matched:
+      - @ConditionalOnProperty (spring.mvc.formcontent.filter.enabled) matched (OnPropertyCondition)
+      - @ConditionalOnMissingBean (types: org.springframework.web.filter.FormContentFilter; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration.EnableWebMvcConfiguration#flashMapManager matched:
+      - @ConditionalOnMissingBean (names: flashMapManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration.EnableWebMvcConfiguration#localeResolver matched:
+      - @ConditionalOnMissingBean (names: localeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration.EnableWebMvcConfiguration#themeResolver matched:
+      - @ConditionalOnMissingBean (names: themeResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration.EnableWebMvcConfiguration#viewNameTranslator matched:
+      - @ConditionalOnMissingBean (names: viewNameTranslator; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#defaultViewResolver matched:
+      - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.InternalResourceViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#requestContextFilter matched:
+      - @ConditionalOnMissingBean (types: org.springframework.web.context.request.RequestContextListener,org.springframework.web.filter.RequestContextFilter; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#viewResolver matched:
+      - @ConditionalOnBean (types: org.springframework.web.servlet.ViewResolver; SearchStrategy: all) found beans 'defaultViewResolver', 'beanNameViewResolver', 'mvcViewResolver'; @ConditionalOnMissingBean (names: viewResolver types: org.springframework.web.servlet.view.ContentNegotiatingViewResolver; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   WebSocketServletAutoConfiguration matched:
+      - @ConditionalOnClass found required classes 'jakarta.servlet.Servlet', 'jakarta.websocket.server.ServerContainer' (OnClassCondition)
+      - found 'session' scope (OnWebApplicationCondition)
+
+   WebSocketServletAutoConfiguration.TomcatWebSocketConfiguration matched:
+      - @ConditionalOnClass found required classes 'org.apache.catalina.startup.Tomcat', 'org.apache.tomcat.websocket.server.WsSci' (OnClassCondition)
+
+   WebSocketServletAutoConfiguration.TomcatWebSocketConfiguration#websocketServletWebServerCustomizer matched:
+      - @ConditionalOnMissingBean (names: websocketServletWebServerCustomizer; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+
+Negative matches:
+-----------------
+
+   ActiveMQAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition)
+
+   AopAutoConfiguration.AspectJAutoProxyingConfiguration.JdkDynamicAutoProxyConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (spring.aop.proxy-target-class=false) did not find property 'proxy-target-class' (OnPropertyCondition)
+
+   AopAutoConfiguration.ClassProxyingConfiguration:
+      Did not match:
+         - @ConditionalOnMissingClass found unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)
+
+   ArtemisAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'jakarta.jms.ConnectionFactory' (OnClassCondition)
+
+   BatchAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.batch.core.launch.JobLauncher' (OnClassCondition)
+
+   Cache2kCacheConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.cache2k.Cache2kBuilder' (OnClassCondition)
+
+   CacheAutoConfiguration:
+      Did not match:
+         - @ConditionalOnBean (types: org.springframework.cache.interceptor.CacheAspectSupport; SearchStrategy: all) did not find any beans of type org.springframework.cache.interceptor.CacheAspectSupport (OnBeanCondition)
+      Matched:
+         - @ConditionalOnClass found required class 'org.springframework.cache.CacheManager' (OnClassCondition)
+
+   CacheAutoConfiguration.CacheManagerEntityManagerFactoryDependsOnPostProcessor:
+      Did not match:
+         - Ancestor org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition)
+      Matched:
+         - @ConditionalOnClass found required class 'org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean' (OnClassCondition)
+
+   CaffeineCacheConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.github.benmanes.caffeine.cache.Caffeine' (OnClassCondition)
+
+   CassandraAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition)
+
+   CassandraDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition)
+
+   CassandraReactiveDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition)
+
+   CassandraReactiveRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.cassandra.ReactiveSession' (OnClassCondition)
+
+   CassandraRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.datastax.oss.driver.api.core.CqlSession' (OnClassCondition)
+
+   ClientHttpConnectorAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition)
+
+   CodecsAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition)
+
+   CouchbaseAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition)
+
+   CouchbaseCacheConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition)
+
+   CouchbaseDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Bucket' (OnClassCondition)
+
+   CouchbaseReactiveDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition)
+
+   CouchbaseReactiveRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Cluster' (OnClassCondition)
+
+   CouchbaseRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.couchbase.client.java.Bucket' (OnClassCondition)
+
+   DataSourceAutoConfiguration.EmbeddedDatabaseConfiguration:
+      Did not match:
+         - EmbeddedDataSource spring.datasource.url is set (DataSourceAutoConfiguration.EmbeddedDatabaseCondition)
+
+   DataSourceCheckpointRestoreConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.crac.Resource' (OnClassCondition)
+
+   DataSourceConfiguration.Dbcp2:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition)
+
+   DataSourceConfiguration.Generic:
+      Did not match:
+         - @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type' (OnPropertyCondition)
+
+   DataSourceConfiguration.OracleUcp:
+      Did not match:
+         - @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSourceImpl', 'oracle.jdbc.OracleConnection' (OnClassCondition)
+
+   DataSourceConfiguration.Tomcat:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition)
+
+   DataSourceJmxConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (spring.jmx.enabled=true) found different value in property 'enabled' (OnPropertyCondition)
+
+   DataSourcePoolMetadataProvidersConfiguration.CommonsDbcp2PoolDataSourceMetadataProviderConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.apache.commons.dbcp2.BasicDataSource' (OnClassCondition)
+
+   DataSourcePoolMetadataProvidersConfiguration.OracleUcpPoolDataSourceMetadataProviderConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required classes 'oracle.ucp.jdbc.PoolDataSource', 'oracle.jdbc.OracleConnection' (OnClassCondition)
+
+   DataSourcePoolMetadataProvidersConfiguration.TomcatDataSourcePoolMetadataProviderConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.apache.tomcat.jdbc.pool.DataSource' (OnClassCondition)
+
+   DataSourceTransactionManagerAutoConfiguration.JdbcTransactionManagerConfiguration#transactionManager:
+      Did not match:
+         - @ConditionalOnMissingBean (types: org.springframework.transaction.TransactionManager; SearchStrategy: all) found beans of type 'org.springframework.transaction.TransactionManager' transactionManager (OnBeanCondition)
+
+   DispatcherServletAutoConfiguration.DispatcherServletConfiguration#multipartResolver:
+      Did not match:
+         - @ConditionalOnBean (types: org.springframework.web.multipart.MultipartResolver; SearchStrategy: all) did not find any beans of type org.springframework.web.multipart.MultipartResolver (OnBeanCondition)
+
+   ElasticsearchClientAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'co.elastic.clients.elasticsearch.ElasticsearchClient' (OnClassCondition)
+
+   ElasticsearchDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate' (OnClassCondition)
+
+   ElasticsearchRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.elasticsearch.repository.ElasticsearchRepository' (OnClassCondition)
+
+   ElasticsearchRestClientAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.elasticsearch.client.RestClientBuilder' (OnClassCondition)
+
+   EmbeddedLdapAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.unboundid.ldap.listener.InMemoryDirectoryServer' (OnClassCondition)
+
+   EmbeddedWebServerFactoryCustomizerAutoConfiguration:
+      Did not match:
+         - Application is deployed as a WAR file. (OnWarDeploymentCondition)
+      Matched:
+         - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition)
+
+   ErrorWebFluxAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition)
+
+   FlywayAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.flywaydb.core.Flyway' (OnClassCondition)
+
+   FreeMarkerAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'freemarker.template.Configuration' (OnClassCondition)
+
+   GraphQlAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   GraphQlQueryByExampleAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   GraphQlQuerydslAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.querydsl.core.Query' (OnClassCondition)
+
+   GraphQlRSocketAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   GraphQlReactiveQueryByExampleAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   GraphQlReactiveQuerydslAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.querydsl.core.Query' (OnClassCondition)
+
+   GraphQlWebFluxAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   GraphQlWebFluxSecurityAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   GraphQlWebMvcAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   GraphQlWebMvcSecurityAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   GroovyTemplateAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'groovy.text.markup.MarkupTemplateEngine' (OnClassCondition)
+
+   GsonAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.google.gson.Gson' (OnClassCondition)
+
+   GsonHttpMessageConvertersConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.google.gson.Gson' (OnClassCondition)
+
+   H2ConsoleAutoConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (spring.h2.console.enabled=true) did not find property 'enabled' (OnPropertyCondition)
+      Matched:
+         - @ConditionalOnClass found required class 'org.h2.server.web.JakartaWebServlet' (OnClassCondition)
+         - found 'session' scope (OnWebApplicationCondition)
+
+   HazelcastAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition)
+
+   HazelcastCacheConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition)
+
+   HazelcastJpaDependencyAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.hazelcast.core.HazelcastInstance' (OnClassCondition)
+
+   HttpHandlerAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.DispatcherHandler' (OnClassCondition)
+
+   HypermediaAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.hateoas.EntityModel' (OnClassCondition)
+
+   InfinispanCacheConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.infinispan.spring.embedded.provider.SpringEmbeddedCacheManager' (OnClassCondition)
+
+   IntegrationAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.integration.config.EnableIntegration' (OnClassCondition)
+
+   JCacheCacheConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'javax.cache.Caching' (OnClassCondition)
+
+   JacksonHttpMessageConvertersConfiguration.MappingJackson2XmlHttpMessageConverterConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.fasterxml.jackson.dataformat.xml.XmlMapper' (OnClassCondition)
+
+   JdbcRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration' (OnClassCondition)
+
+   JerseyAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.glassfish.jersey.server.spring.SpringComponentProvider' (OnClassCondition)
+
+   JmsAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'jakarta.jms.Message' (OnClassCondition)
+
+   JmxAutoConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (spring.jmx.enabled=true) found different value in property 'enabled' (OnPropertyCondition)
+      Matched:
+         - @ConditionalOnClass found required class 'org.springframework.jmx.export.MBeanExporter' (OnClassCondition)
+
+   JndiConnectionFactoryAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.jms.core.JmsTemplate' (OnClassCondition)
+
+   JndiDataSourceAutoConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'jndi-name' (OnPropertyCondition)
+      Matched:
+         - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)
+
+   JndiJtaConfiguration:
+      Did not match:
+         - @ConditionalOnJndi JNDI environment is not available (OnJndiCondition)
+      Matched:
+         - @ConditionalOnClass found required class 'org.springframework.transaction.jta.JtaTransactionManager' (OnClassCondition)
+
+   JooqAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.jooq.DSLContext' (OnClassCondition)
+
+   JpaRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnMissingBean (types: org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean,org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension; SearchStrategy: all) found beans of type 'org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean' &userRepository, &taskRepository, &preferredTimeRepository, &timeBlockRepository and found beans of type 'org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension' org.springframework.data.jpa.repository.config.JpaRepositoryConfigExtension#0 (OnBeanCondition)
+      Matched:
+         - @ConditionalOnClass found required class 'org.springframework.data.jpa.repository.JpaRepository' (OnClassCondition)
+         - @ConditionalOnProperty (spring.data.jpa.repositories.enabled=true) matched (OnPropertyCondition)
+
+   JsonbAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'jakarta.json.bind.Jsonb' (OnClassCondition)
+
+   JsonbHttpMessageConvertersConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'jakarta.json.bind.Jsonb' (OnClassCondition)
+
+   KafkaAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.kafka.core.KafkaTemplate' (OnClassCondition)
+
+   LdapAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.ldap.core.ContextSource' (OnClassCondition)
+
+   LdapRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.ldap.repository.LdapRepository' (OnClassCondition)
+
+   LiquibaseAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'liquibase.change.DatabaseChange' (OnClassCondition)
+
+   MailSenderAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'jakarta.mail.internet.MimeMessage' (OnClassCondition)
+
+   MailSenderValidatorAutoConfiguration:
+      Did not match:
+         - @ConditionalOnSingleCandidate did not find required type 'org.springframework.mail.javamail.JavaMailSenderImpl' (OnBeanCondition)
+
+   MessageSourceAutoConfiguration:
+      Did not match:
+         - ResourceBundle did not find bundle with basename messages (MessageSourceAutoConfiguration.ResourceBundleCondition)
+
+   MongoAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition)
+
+   MongoDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition)
+
+   MongoReactiveAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition)
+
+   MongoReactiveDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition)
+
+   MongoReactiveRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.mongodb.reactivestreams.client.MongoClient' (OnClassCondition)
+
+   MongoRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.mongodb.client.MongoClient' (OnClassCondition)
+
+   MustacheAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.samskivert.mustache.Mustache' (OnClassCondition)
+
+   Neo4jAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition)
+
+   Neo4jDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition)
+
+   Neo4jReactiveDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition)
+
+   Neo4jReactiveRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition)
+
+   Neo4jRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.neo4j.driver.Driver' (OnClassCondition)
+
+   NettyAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.netty.util.NettyRuntime' (OnClassCondition)
+
+   OAuth2AuthorizationServerAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.authorization.OAuth2Authorization' (OnClassCondition)
+
+   OAuth2AuthorizationServerJwtAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.authorization.OAuth2Authorization' (OnClassCondition)
+
+   OAuth2ClientAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.client.registration.ClientRegistration' (OnClassCondition)
+
+   OAuth2ResourceServerAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.security.oauth2.server.resource.authentication.BearerTokenAuthenticationToken' (OnClassCondition)
+
+   ProjectInfoAutoConfiguration#buildProperties:
+      Did not match:
+         - @ConditionalOnResource did not find resource '${spring.info.build.location:classpath:META-INF/build-info.properties}' (OnResourceCondition)
+
+   ProjectInfoAutoConfiguration#gitProperties:
+      Did not match:
+         - GitResource did not find git info at classpath:git.properties (ProjectInfoAutoConfiguration.GitResourceAvailableCondition)
+
+   PulsarAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.apache.pulsar.client.api.PulsarClient' (OnClassCondition)
+
+   PulsarReactiveAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.apache.pulsar.client.api.PulsarClient' (OnClassCondition)
+
+   QuartzAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.quartz.Scheduler' (OnClassCondition)
+
+   R2dbcAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.r2dbc.spi.ConnectionFactory' (OnClassCondition)
+
+   R2dbcDataAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.r2dbc.core.R2dbcEntityTemplate' (OnClassCondition)
+
+   R2dbcInitializationConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required classes 'io.r2dbc.spi.ConnectionFactory', 'org.springframework.r2dbc.connection.init.DatabasePopulator' (OnClassCondition)
+
+   R2dbcProxyAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.r2dbc.proxy.ProxyConnectionFactory' (OnClassCondition)
+
+   R2dbcRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.r2dbc.spi.ConnectionFactory' (OnClassCondition)
+
+   R2dbcTransactionManagerAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.r2dbc.connection.R2dbcTransactionManager' (OnClassCondition)
+
+   RSocketGraphQlClientAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'graphql.GraphQL' (OnClassCondition)
+
+   RSocketMessagingAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.rsocket.RSocket' (OnClassCondition)
+
+   RSocketRequesterAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.rsocket.RSocket' (OnClassCondition)
+
+   RSocketSecurityAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.security.rsocket.core.SecuritySocketAcceptorInterceptor' (OnClassCondition)
+
+   RSocketServerAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.rsocket.core.RSocketServer' (OnClassCondition)
+
+   RSocketStrategiesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.netty.buffer.PooledByteBufAllocator' (OnClassCondition)
+
+   RabbitAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.rabbitmq.client.Channel' (OnClassCondition)
+
+   ReactiveElasticsearchClientAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'co.elastic.clients.transport.ElasticsearchTransport' (OnClassCondition)
+
+   ReactiveElasticsearchRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'reactor.core.publisher.Mono' (OnClassCondition)
+
+   ReactiveMultipartAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition)
+
+   ReactiveOAuth2ClientAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition)
+
+   ReactiveOAuth2ResourceServerAutoConfiguration:
+      Did not match:
+         - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition)
+
+   ReactiveSecurityAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition)
+
+   ReactiveUserDetailsServiceAutoConfiguration:
+      Did not match:
+         - AnyNestedCondition 0 matched 2 did not; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication.ReactiveWebApplicationCondition did not find reactive web application classes; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication.RSocketSecurityEnabledCondition @ConditionalOnBean (types: org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler; SearchStrategy: all) did not find any beans of type org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler (ReactiveUserDetailsServiceAutoConfiguration.RSocketEnabledOrReactiveWebApplication)
+      Matched:
+         - @ConditionalOnClass found required class 'org.springframework.security.authentication.ReactiveAuthenticationManager' (OnClassCondition)
+         - AnyNestedCondition 3 matched 0 did not; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.PasswordConfigured @ConditionalOnProperty (spring.security.user.password) matched; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.NameConfigured @ConditionalOnProperty (spring.security.user.name) matched; NestedCondition on ReactiveUserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured.MissingAlternative @ConditionalOnMissingClass did not find unwanted classes 'org.springframework.security.oauth2.client.registration.ClientRegistrationRepository', 'org.springframework.security.oauth2.server.resource.introspection.ReactiveOpaqueTokenIntrospector' (ReactiveUserDetailsServiceAutoConfiguration.MissingAlternativeOrUserPropertiesConfigured)
+
+   ReactiveWebServerFactoryAutoConfiguration:
+      Did not match:
+         - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition)
+
+   ReactorAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'reactor.core.publisher.Hooks' (OnClassCondition)
+
+   RedisAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.redis.core.RedisOperations' (OnClassCondition)
+
+   RedisCacheConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.redis.connection.RedisConnectionFactory' (OnClassCondition)
+
+   RedisReactiveAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'reactor.core.publisher.Flux' (OnClassCondition)
+
+   RedisRepositoriesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.redis.repository.configuration.EnableRedisRepositories' (OnClassCondition)
+
+   RepositoryRestMvcAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration' (OnClassCondition)
+
+   Saml2RelyingPartyAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository' (OnClassCondition)
+
+   SecurityDataConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.security.data.repository.query.SecurityEvaluationContextExtension' (OnClassCondition)
+
+   SendGridAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.sendgrid.SendGrid' (OnClassCondition)
+
+   ServletWebServerFactoryAutoConfiguration.ForwardedHeaderFilterConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (server.forward-headers-strategy=framework) did not find property 'server.forward-headers-strategy' (OnPropertyCondition)
+
+   ServletWebServerFactoryConfiguration.EmbeddedJetty:
+      Did not match:
+         - @ConditionalOnClass did not find required classes 'org.eclipse.jetty.server.Server', 'org.eclipse.jetty.util.Loader', 'org.eclipse.jetty.ee10.webapp.WebAppContext' (OnClassCondition)
+
+   ServletWebServerFactoryConfiguration.EmbeddedUndertow:
+      Did not match:
+         - @ConditionalOnClass did not find required classes 'io.undertow.Undertow', 'org.xnio.SslClientAuthMode' (OnClassCondition)
+
+   SessionAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.session.Session' (OnClassCondition)
+
+   SpringApplicationAdminJmxAutoConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (spring.application.admin.enabled=true) did not find property 'enabled' (OnPropertyCondition)
+
+   SpringBootWebSecurityConfiguration.SecurityFilterChainConfiguration:
+      Did not match:
+         - AllNestedConditions 1 matched 1 did not; NestedCondition on DefaultWebSecurityCondition.Beans @ConditionalOnMissingBean (types: org.springframework.security.web.SecurityFilterChain; SearchStrategy: all) found beans of type 'org.springframework.security.web.SecurityFilterChain' filterChain; NestedCondition on DefaultWebSecurityCondition.Classes @ConditionalOnClass found required classes 'org.springframework.security.web.SecurityFilterChain', 'org.springframework.security.config.annotation.web.builders.HttpSecurity' (DefaultWebSecurityCondition)
+
+   SpringBootWebSecurityConfiguration.WebSecurityEnablerConfiguration:
+      Did not match:
+         - @ConditionalOnMissingBean (names: springSecurityFilterChain; SearchStrategy: all) found beans named springSecurityFilterChain (OnBeanCondition)
+      Matched:
+         - @ConditionalOnClass found required class 'org.springframework.security.config.annotation.web.configuration.EnableWebSecurity' (OnClassCondition)
+
+   TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration#simpleAsyncTaskExecutorBuilderVirtualThreads:
+      Did not match:
+         - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskExecutorBuilder' simpleAsyncTaskExecutorBuilder (OnBeanCondition)
+
+   TaskExecutorConfigurations.TaskExecutorConfiguration#applicationTaskExecutorVirtualThreads:
+      Did not match:
+         - @ConditionalOnThreading did not find VIRTUAL (OnThreadingCondition)
+
+   TaskSchedulingAutoConfiguration#scheduledBeanLazyInitializationExcludeFilter:
+      Did not match:
+         - @ConditionalOnBean (names: org.springframework.context.annotation.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.context.annotation.internalScheduledAnnotationProcessor (OnBeanCondition)
+
+   TaskSchedulingConfigurations.SimpleAsyncTaskSchedulerBuilderConfiguration#simpleAsyncTaskSchedulerBuilderVirtualThreads:
+      Did not match:
+         - @ConditionalOnMissingBean (types: org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder; SearchStrategy: all) found beans of type 'org.springframework.boot.task.SimpleAsyncTaskSchedulerBuilder' simpleAsyncTaskSchedulerBuilder (OnBeanCondition)
+
+   TaskSchedulingConfigurations.TaskSchedulerConfiguration:
+      Did not match:
+         - @ConditionalOnBean (names: org.springframework.context.annotation.internalScheduledAnnotationProcessor; SearchStrategy: all) did not find any beans named org.springframework.context.annotation.internalScheduledAnnotationProcessor (OnBeanCondition)
+
+   TemplateEngineConfigurations.ReactiveTemplateEngineConfiguration:
+      Did not match:
+         - did not find reactive web application classes (OnWebApplicationCondition)
+
+   ThymeleafAutoConfiguration.DataAttributeDialectConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'com.github.mxab.thymeleaf.extras.dataattribute.dialect.DataAttributeDialect' (OnClassCondition)
+
+   ThymeleafAutoConfiguration.ThymeleafWebFluxConfiguration:
+      Did not match:
+         - did not find reactive web application classes (OnWebApplicationCondition)
+
+   ThymeleafAutoConfiguration.ThymeleafWebLayoutConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'nz.net.ultraq.thymeleaf.layoutdialect.LayoutDialect' (OnClassCondition)
+
+   ThymeleafAutoConfiguration.ThymeleafWebMvcConfiguration#resourceUrlEncodingFilter:
+      Did not match:
+         - @ConditionalOnEnabledResourceChain did not find class org.webjars.WebJarVersionLocator (OnEnabledResourceChainCondition)
+
+   TransactionAutoConfiguration#transactionalOperator:
+      Did not match:
+         - @ConditionalOnSingleCandidate (types: org.springframework.transaction.ReactiveTransactionManager; SearchStrategy: all) did not find any beans (OnBeanCondition)
+
+   TransactionAutoConfiguration.AspectJTransactionManagementConfiguration:
+      Did not match:
+         - @ConditionalOnBean (types: org.springframework.transaction.aspectj.AbstractTransactionAspect; SearchStrategy: all) did not find any beans of type org.springframework.transaction.aspectj.AbstractTransactionAspect (OnBeanCondition)
+
+   TransactionAutoConfiguration.EnableTransactionManagementConfiguration.JdkDynamicAutoProxyConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (spring.aop.proxy-target-class=false) did not find property 'proxy-target-class' (OnPropertyCondition)
+
+   WebClientAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.function.client.WebClient' (OnClassCondition)
+
+   WebFluxAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.web.reactive.config.WebFluxConfigurer' (OnClassCondition)
+
+   WebMvcAutoConfiguration#hiddenHttpMethodFilter:
+      Did not match:
+         - @ConditionalOnProperty (spring.mvc.hiddenmethod.filter.enabled) did not find property 'enabled' (OnPropertyCondition)
+
+   WebMvcAutoConfiguration.ProblemDetailsErrorHandlingConfiguration:
+      Did not match:
+         - @ConditionalOnProperty (spring.mvc.problemdetails.enabled=true) did not find property 'enabled' (OnPropertyCondition)
+
+   WebMvcAutoConfiguration.ResourceChainCustomizerConfiguration:
+      Did not match:
+         - @ConditionalOnEnabledResourceChain did not find class org.webjars.WebJarVersionLocator (OnEnabledResourceChainCondition)
+
+   WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter#beanNameViewResolver:
+      Did not match:
+         - @ConditionalOnMissingBean (types: org.springframework.web.servlet.view.BeanNameViewResolver; SearchStrategy: all) found beans of type 'org.springframework.web.servlet.view.BeanNameViewResolver' beanNameViewResolver (OnBeanCondition)
+
+   WebServiceTemplateAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.oxm.Marshaller' (OnClassCondition)
+
+   WebServicesAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.ws.transport.http.MessageDispatcherServlet' (OnClassCondition)
+
+   WebSessionIdResolverAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'reactor.core.publisher.Mono' (OnClassCondition)
+
+   WebSocketMessagingAutoConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer' (OnClassCondition)
+
+   WebSocketReactiveAutoConfiguration:
+      Did not match:
+         - @ConditionalOnWebApplication did not find reactive web application classes (OnWebApplicationCondition)
+
+   WebSocketServletAutoConfiguration.JettyWebSocketConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer' (OnClassCondition)
+
+   WebSocketServletAutoConfiguration.UndertowWebSocketConfiguration:
+      Did not match:
+         - @ConditionalOnClass did not find required class 'io.undertow.websockets.jsr.Bootstrap' (OnClassCondition)
+
+   XADataSourceAutoConfiguration:
+      Did not match:
+         - @ConditionalOnBean (types: org.springframework.boot.jdbc.XADataSourceWrapper; SearchStrategy: all) did not find any beans of type org.springframework.boot.jdbc.XADataSourceWrapper (OnBeanCondition)
+      Matched:
+         - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'jakarta.transaction.TransactionManager', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)
+
+
+Exclusions:
+-----------
+
+    None
+
+
+Unconditional classes:
+----------------------
+
+    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
+
+    org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
+
+    org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration
+
+    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
+
+    org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration
+
+    org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
+
+
+
+
+
+
+
+ +
+ + diff --git a/backend/build/reports/tests/test/css/base-style.css b/backend/build/reports/tests/test/css/base-style.css new file mode 100644 index 0000000..3ae6c58 --- /dev/null +++ b/backend/build/reports/tests/test/css/base-style.css @@ -0,0 +1,174 @@ + +body { + margin: 0; + padding: 0; + font-family: sans-serif; + font-size: 12pt; +} + +body, a, a:visited { + color: #303030; +} + +#content { + padding: 30px 50px; +} + +#content h1 { + font-size: 160%; + margin-bottom: 10px; +} + +#footer { + margin-top: 100px; + font-size: 80%; + white-space: nowrap; +} + +#footer, #footer a { + color: #a0a0a0; +} + +#line-wrapping-toggle { + vertical-align: middle; +} + +#label-for-line-wrapping-toggle { + vertical-align: middle; +} + +ul { + margin-left: 0; +} + +h1, h2, h3 { + white-space: nowrap; +} + +h2 { + font-size: 120%; +} + +.tab-container .tab-container { + margin-left: 8px; +} + +ul.tabLinks { + padding: 0; + margin-bottom: 0; + overflow: auto; + min-width: 800px; + width: auto; + border-bottom: solid 1px #aaa; +} + +ul.tabLinks li { + float: left; + height: 100%; + list-style: none; + padding: 5px 10px; + border-radius: 7px 7px 0 0; + border: solid 1px transparent; + border-bottom: none; + margin-right: 6px; + background-color: #f0f0f0; +} + +ul.tabLinks li.deselected > a { + color: #6d6d6d; +} + +ul.tabLinks li:hover { + background-color: #fafafa; +} + +ul.tabLinks li.selected { + background-color: #c5f0f5; + border-color: #aaa; +} + +ul.tabLinks a { + font-size: 120%; + display: block; + outline: none; + text-decoration: none; + margin: 0; + padding: 0; +} + +ul.tabLinks li h2 { + margin: 0; + padding: 0; +} + +div.tab { +} + +div.selected { + display: block; +} + +div.deselected { + display: none; +} + +div.tab table { + min-width: 350px; + width: auto; + border-collapse: collapse; +} + +div.tab th, div.tab table { + border-bottom: solid 1px #d0d0d0; +} + +div.tab th { + text-align: left; + white-space: nowrap; + padding-left: 6em; +} + +div.tab th:first-child { + padding-left: 0; +} + +div.tab td { + white-space: nowrap; + padding-left: 6em; + padding-top: 5px; + padding-bottom: 5px; +} + +div.tab td:first-child { + padding-left: 0; +} + +div.tab td.numeric, div.tab th.numeric { + text-align: right; +} + +span.code { + display: inline-block; + margin-top: 0; + margin-bottom: 1em; +} + +span.code pre { + font-size: 11pt; + padding: 10px; + margin: 0; + background-color: #f7f7f7; + border: solid 1px #d0d0d0; + min-width: 700px; + width: auto; +} + +span.wrapped pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: break-all; +} + +label.hidden { + display: none; +} diff --git a/backend/build/reports/tests/test/css/style.css b/backend/build/reports/tests/test/css/style.css new file mode 100644 index 0000000..3dc4913 --- /dev/null +++ b/backend/build/reports/tests/test/css/style.css @@ -0,0 +1,84 @@ + +#summary { + margin-top: 30px; + margin-bottom: 40px; +} + +#summary table { + border-collapse: collapse; +} + +#summary td { + vertical-align: top; +} + +.breadcrumbs, .breadcrumbs a { + color: #606060; +} + +.infoBox { + width: 110px; + padding-top: 15px; + padding-bottom: 15px; + text-align: center; +} + +.infoBox p { + margin: 0; +} + +.counter, .percent { + font-size: 120%; + font-weight: bold; + margin-bottom: 8px; +} + +#duration { + width: 125px; +} + +#successRate, .summaryGroup { + border: solid 2px #d0d0d0; + -moz-border-radius: 10px; + border-radius: 10px; +} + +#successRate { + width: 140px; + margin-left: 35px; +} + +#successRate .percent { + font-size: 180%; +} + +.success, .success a { + color: #008000; +} + +div.success, #successRate.success { + background-color: #bbd9bb; + border-color: #008000; +} + +.failures, .failures a { + color: #b60808; +} + +.skipped, .skipped a { + color: #c09853; +} + +div.failures, #successRate.failures { + background-color: #ecdada; + border-color: #b60808; +} + +ul.linkList { + padding-left: 0; +} + +ul.linkList li { + list-style: none; + margin-bottom: 5px; +} diff --git a/backend/build/reports/tests/test/index.html b/backend/build/reports/tests/test/index.html new file mode 100644 index 0000000..3bbabf3 --- /dev/null +++ b/backend/build/reports/tests/test/index.html @@ -0,0 +1,145 @@ + + + + + +Test results - Test Summary + + + + + +
+

Test Summary

+
+ + + + + +
+
+ + + + + + + +
+
+
1
+

tests

+
+
+
+
1
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.017s
+

duration

+
+
+
+
+
+
0%
+

successful

+
+
+
+
+ +
+

Failed tests

+ +
+
+

Packages

+ + + + + + + + + + + + + + + + + + + + + +
PackageTestsFailuresIgnoredDurationSuccess rate
+capstone.backend +1100.017s0%
+
+
+

Classes

+ + + + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+capstone.backend.BackendApplicationTests +1100.017s0%
+
+
+ +
+ + diff --git a/backend/build/reports/tests/test/js/report.js b/backend/build/reports/tests/test/js/report.js new file mode 100644 index 0000000..e246eba --- /dev/null +++ b/backend/build/reports/tests/test/js/report.js @@ -0,0 +1,218 @@ +(function (window, document) { + "use strict"; + + function changeElementClass(element, classValue) { + if (element.getAttribute("className")) { + element.setAttribute("className", classValue); + } else { + element.setAttribute("class", classValue); + } + } + + function getClassAttribute(element) { + if (element.getAttribute("className")) { + return element.getAttribute("className"); + } else { + return element.getAttribute("class"); + } + } + + function addClass(element, classValue) { + changeElementClass(element, getClassAttribute(element) + " " + classValue); + } + + function removeClass(element, classValue) { + changeElementClass(element, getClassAttribute(element).replace(classValue, "")); + } + + function getCheckBox() { + return document.getElementById("line-wrapping-toggle"); + } + + function getLabelForCheckBox() { + return document.getElementById("label-for-line-wrapping-toggle"); + } + + function findCodeBlocks() { + const codeBlocks = []; + const tabContainers = getTabContainers(); + for (let i = 0; i < tabContainers.length; i++) { + const spans = tabContainers[i].getElementsByTagName("span"); + for (let i = 0; i < spans.length; ++i) { + if (spans[i].className.indexOf("code") >= 0) { + codeBlocks.push(spans[i]); + } + } + } + return codeBlocks; + } + + function forAllCodeBlocks(operation) { + const codeBlocks = findCodeBlocks(); + + for (let i = 0; i < codeBlocks.length; ++i) { + operation(codeBlocks[i], "wrapped"); + } + } + + function toggleLineWrapping() { + const checkBox = getCheckBox(); + + if (checkBox.checked) { + forAllCodeBlocks(addClass); + } else { + forAllCodeBlocks(removeClass); + } + } + + function initControls() { + if (findCodeBlocks().length > 0) { + const checkBox = getCheckBox(); + const label = getLabelForCheckBox(); + + checkBox.onclick = toggleLineWrapping; + checkBox.checked = false; + + removeClass(label, "hidden"); + } + } + + class TabManager { + baseId; + tabs; + titles; + headers; + + constructor(baseId, tabs, titles, headers) { + this.baseId = baseId; + this.tabs = tabs; + this.titles = titles; + this.headers = headers; + } + + select(i) { + this.deselectAll(); + + changeElementClass(this.tabs[i], "tab selected"); + changeElementClass(this.headers[i], "selected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + const a = document.createElement("a"); + + a.appendChild(document.createTextNode(this.titles[i])); + this.headers[i].appendChild(a); + } + + deselectAll() { + for (let i = 0; i < this.tabs.length; i++) { + changeElementClass(this.tabs[i], "tab deselected"); + changeElementClass(this.headers[i], "deselected"); + + while (this.headers[i].firstChild) { + this.headers[i].removeChild(this.headers[i].firstChild); + } + + const a = document.createElement("a"); + + const id = this.baseId + "-tab" + i; + a.setAttribute("id", id); + a.setAttribute("href", "#tab" + i); + a.onclick = () => { + this.select(i); + return false; + }; + a.appendChild(document.createTextNode(this.titles[i])); + + this.headers[i].appendChild(a); + } + } + } + + function getTabContainers() { + const tabContainers = Array.from(document.getElementsByClassName("tab-container")); + + // Used by existing TabbedPageRenderer users, which have not adjusted to use TabsRenderer yet. + const legacyContainer = document.getElementById("tabs"); + if (legacyContainer) { + tabContainers.push(legacyContainer); + } + + return tabContainers; + } + + function initTabs() { + let tabGroups = 0; + + function createTab(num, container) { + const tabElems = findTabs(container); + const tabManager = new TabManager("tabs" + num, tabElems, findTitles(tabElems), findHeaders(container)); + tabManager.select(0); + } + + const tabContainers = getTabContainers(); + + for (let i = 0; i < tabContainers.length; i++) { + createTab(tabGroups, tabContainers[i]); + tabGroups++; + } + + return true; + } + + function findTabs(container) { + return findChildElements(container, "DIV", "tab"); + } + + function findHeaders(container) { + const owner = findChildElements(container, "UL", "tabLinks"); + return findChildElements(owner[0], "LI", null); + } + + function findTitles(tabs) { + const titles = []; + + for (let i = 0; i < tabs.length; i++) { + const tab = tabs[i]; + const header = findChildElements(tab, "H2", null)[0]; + + header.parentNode.removeChild(header); + + if (header.innerText) { + titles.push(header.innerText); + } else { + titles.push(header.textContent); + } + } + + return titles; + } + + function findChildElements(container, name, targetClass) { + const elements = []; + const children = container.childNodes; + + for (let i = 0; i < children.length; i++) { + const child = children.item(i); + + if (child.nodeType === 1 && child.nodeName === name) { + if (targetClass && child.className.indexOf(targetClass) < 0) { + continue; + } + + elements.push(child); + } + } + + return elements; + } + + // Entry point. + + window.onload = function() { + initTabs(); + initControls(); + }; +} (window, window.document)); diff --git a/backend/build/reports/tests/test/packages/capstone.backend.html b/backend/build/reports/tests/test/packages/capstone.backend.html new file mode 100644 index 0000000..5216b48 --- /dev/null +++ b/backend/build/reports/tests/test/packages/capstone.backend.html @@ -0,0 +1,115 @@ + + + + + +Test results - Package capstone.backend + + + + + +
+

Package capstone.backend

+ +
+ + + + + +
+
+ + + + + + + +
+
+
1
+

tests

+
+
+
+
1
+

failures

+
+
+
+
0
+

ignored

+
+
+
+
0.017s
+

duration

+
+
+
+
+
+
0%
+

successful

+
+
+
+
+ +
+

Failed tests

+ +
+
+

Classes

+ + + + + + + + + + + + + + + + + + + +
ClassTestsFailuresIgnoredDurationSuccess rate
+BackendApplicationTests +1100.017s0%
+
+
+ +
+ + diff --git a/backend/build/resolvedMainClassName b/backend/build/resolvedMainClassName new file mode 100644 index 0000000..0b07d34 --- /dev/null +++ b/backend/build/resolvedMainClassName @@ -0,0 +1 @@ +capstone.backend.BackendApplication \ No newline at end of file diff --git a/backend/build/resources/main/application.properties b/backend/build/resources/main/application.properties index a64650c..9c92144 100644 --- a/backend/build/resources/main/application.properties +++ b/backend/build/resources/main/application.properties @@ -2,11 +2,10 @@ spring.application.name=backend spring.security.user.name=admin spring.security.user.password=1234 -spring.datasource.url=jdbc:mysql://localhost:3306/scheduler +spring.datasource.url=jdbc:mysql://localhost:3306/scheduler?serverTimezone=Asia/Seoul spring.datasource.username=root spring.datasource.password=wldn3030 - spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect @@ -14,3 +13,6 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.cache=false + +logging.level.org.springframework.web=DEBUG +logging.level.org.springframework.http.converter.json=DEBUG \ No newline at end of file diff --git a/backend/build/resources/main/templates/login.html b/backend/build/resources/main/templates/login.html new file mode 100644 index 0000000..ff3a463 --- /dev/null +++ b/backend/build/resources/main/templates/login.html @@ -0,0 +1,12 @@ + + +로그인 + +

로그인

+
+
+
+ +
+ + diff --git a/backend/build/resources/main/templates/task-form.html b/backend/build/resources/main/templates/task-form.html index 4b851c3..bbfeb06 100644 --- a/backend/build/resources/main/templates/task-form.html +++ b/backend/build/resources/main/templates/task-form.html @@ -1,52 +1,46 @@ - + Task 등록 -

Task 등록하기

-
-
-

- -
-

+ +
+

-

+

-

+

-

- -
-

- -
-

- - - -

- - - -

- - +
+ + +
+ + +
+ + +
+ + +
+ +
diff --git a/backend/build/resources/main/templates/task-list.html b/backend/build/resources/main/templates/task-list.html new file mode 100644 index 0000000..d54a903 --- /dev/null +++ b/backend/build/resources/main/templates/task-list.html @@ -0,0 +1,43 @@ + + + + + 나의 작업 목록 + + +

나의 작업 목록

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
제목설명카테고리시작 시간종료 시간우선순위선호도 반복완료
제목설명카테고리시작종료우선선호도 반복완료
+ +
++ 새 작업 추가하기 + + + diff --git a/backend/build/resources/main/templates/user-form.html b/backend/build/resources/main/templates/user-form.html index a02d2d5..eaca8b1 100644 --- a/backend/build/resources/main/templates/user-form.html +++ b/backend/build/resources/main/templates/user-form.html @@ -1,32 +1,20 @@ - - - 회원가입 - +회원가입 - -

회원가입 폼

- +

회원가입

-
-

- -
-

- -
-

- -
-
+
+
+

- - +
+
- + + diff --git a/backend/build/test-results/test/TEST-capstone.backend.BackendApplicationTests.xml b/backend/build/test-results/test/TEST-capstone.backend.BackendApplicationTests.xml new file mode 100644 index 0000000..fdb5c4c --- /dev/null +++ b/backend/build/test-results/test/TEST-capstone.backend.BackendApplicationTests.xml @@ -0,0 +1,1540 @@ + + + + + java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@12c78f36 testClass = capstone.backend.BackendApplicationTests, locations = [], classes = [capstone.backend.BackendApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.OnFailureConditionReportContextCustomizerFactory$OnFailureConditionReportContextCustomizer@3ecd267f, org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@6c5945a7, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@78365cfa, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@3a0d172f, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@6c25e6c4, org.springframework.boot.test.web.reactor.netty.DisableReactorResourceFactoryGlobalResourcesContextCustomizerFactory$DisableReactorResourceFactoryGlobalResourcesContextCustomizerCustomizer@73dce0e6, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@a2adb2dd], resourceBasePath = "src/main/webapp", contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] + at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) + at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) + at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:200) + at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:139) + at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) + at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:160) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) + at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) + at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) + at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) + at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) + at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) + at java.base/java.util.Optional.orElseGet(Optional.java:364) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct) + at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1812) + at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) + at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) + at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) + at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:347) + at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) + at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) + at app//org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:970) + at app//org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) + at app//org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) + at app//org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) + at app//org.springframework.boot.SpringApplication.run(SpringApplication.java:318) + at app//org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:144) + at app//org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) + at app//org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) + at app//org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1461) + at app//org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:563) + at app//org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:144) + at app//org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:110) + at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) + at app//org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) + ... 19 more +Caused by: org.hibernate.DuplicateMappingException: Entity classes [capstone.backend.TimeBlock] and [capstone.backend.timeblock.domain.TimeBlock] share the entity name 'TimeBlock' (entity names must be distinct) + at app//org.hibernate.boot.internal.InFlightMetadataCollectorImpl.addEntityBinding(InFlightMetadataCollectorImpl.java:360) + at app//org.hibernate.boot.model.internal.EntityBinder.bindEntityClass(EntityBinder.java:262) + at app//org.hibernate.boot.model.internal.AnnotationBinder.bindClass(AnnotationBinder.java:401) + at app//org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:257) + at app//org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:281) + at app//org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:324) + at app//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1442) + at app//org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1513) + at app//org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:66) + at app//org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:390) + at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:419) + at app//org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:400) + at app//org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:366) + at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1859) + at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1808) + ... 39 more + + + + + diff --git a/backend/build/test-results/test/binary/output.bin b/backend/build/test-results/test/binary/output.bin new file mode 100644 index 0000000..33fa126 Binary files /dev/null and b/backend/build/test-results/test/binary/output.bin differ diff --git a/backend/build/test-results/test/binary/output.bin.idx b/backend/build/test-results/test/binary/output.bin.idx new file mode 100644 index 0000000..ba1390d Binary files /dev/null and b/backend/build/test-results/test/binary/output.bin.idx differ diff --git a/backend/build/test-results/test/binary/results.bin b/backend/build/test-results/test/binary/results.bin new file mode 100644 index 0000000..0d97ac3 Binary files /dev/null and b/backend/build/test-results/test/binary/results.bin differ diff --git a/backend/build/tmp/bootJar/MANIFEST.MF b/backend/build/tmp/bootJar/MANIFEST.MF new file mode 100644 index 0000000..f10066f --- /dev/null +++ b/backend/build/tmp/bootJar/MANIFEST.MF @@ -0,0 +1,12 @@ +Manifest-Version: 1.0 +Main-Class: org.springframework.boot.loader.launch.JarLauncher +Start-Class: capstone.backend.BackendApplication +Spring-Boot-Version: 3.4.4 +Spring-Boot-Classes: BOOT-INF/classes/ +Spring-Boot-Lib: BOOT-INF/lib/ +Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx +Spring-Boot-Layers-Index: BOOT-INF/layers.idx +Build-Jdk-Spec: 17 +Implementation-Title: backend +Implementation-Version: 0.0.1-SNAPSHOT + diff --git a/backend/build/tmp/compileJava/compileTransaction/stash-dir/SecurityConfig.class.uniqueId0 b/backend/build/tmp/compileJava/compileTransaction/stash-dir/SecurityConfig.class.uniqueId0 new file mode 100644 index 0000000..ec1d7ab Binary files /dev/null and b/backend/build/tmp/compileJava/compileTransaction/stash-dir/SecurityConfig.class.uniqueId0 differ diff --git a/backend/build/tmp/compileJava/compileTransaction/stash-dir/Task$TaskBuilder.class.uniqueId2 b/backend/build/tmp/compileJava/compileTransaction/stash-dir/Task$TaskBuilder.class.uniqueId2 deleted file mode 100644 index d81f7cf..0000000 Binary files a/backend/build/tmp/compileJava/compileTransaction/stash-dir/Task$TaskBuilder.class.uniqueId2 and /dev/null differ diff --git a/backend/build/tmp/compileJava/compileTransaction/stash-dir/Task.class.uniqueId0 b/backend/build/tmp/compileJava/compileTransaction/stash-dir/Task.class.uniqueId0 deleted file mode 100644 index 38ab17a..0000000 Binary files a/backend/build/tmp/compileJava/compileTransaction/stash-dir/Task.class.uniqueId0 and /dev/null differ diff --git a/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskController.class.uniqueId4 b/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskController.class.uniqueId4 deleted file mode 100644 index 4e230b2..0000000 Binary files a/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskController.class.uniqueId4 and /dev/null differ diff --git a/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskRepository.class.uniqueId3 b/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskRepository.class.uniqueId3 deleted file mode 100644 index 7ce97b6..0000000 Binary files a/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskRepository.class.uniqueId3 and /dev/null differ diff --git a/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskService.class.uniqueId1 b/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskService.class.uniqueId1 deleted file mode 100644 index ba3d03e..0000000 Binary files a/backend/build/tmp/compileJava/compileTransaction/stash-dir/TaskService.class.uniqueId1 and /dev/null differ diff --git a/backend/build/tmp/compileJava/previous-compilation-data.bin b/backend/build/tmp/compileJava/previous-compilation-data.bin index 7cd62e1..02a5812 100644 Binary files a/backend/build/tmp/compileJava/previous-compilation-data.bin and b/backend/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/backend/build/tmp/compileTestJava/previous-compilation-data.bin b/backend/build/tmp/compileTestJava/previous-compilation-data.bin new file mode 100644 index 0000000..550b032 Binary files /dev/null and b/backend/build/tmp/compileTestJava/previous-compilation-data.bin differ diff --git a/backend/build/tmp/jar/MANIFEST.MF b/backend/build/tmp/jar/MANIFEST.MF new file mode 100644 index 0000000..59499bc --- /dev/null +++ b/backend/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,2 @@ +Manifest-Version: 1.0 + diff --git a/backend/src/main/java/capstone/backend/BackendApplication.java b/backend/src/main/java/capstone/backend/BackendApplication.java index ce399a8..61f6e99 100644 --- a/backend/src/main/java/capstone/backend/BackendApplication.java +++ b/backend/src/main/java/capstone/backend/BackendApplication.java @@ -1,14 +1,19 @@ package capstone.backend; +import capstone.backend.time.service.PreferredTimeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @SpringBootApplication -@EnableJpaRepositories(basePackages = "capstone.backend") // 이거 추가! public class BackendApplication { + + public static void main(String[] args) { SpringApplication.run(BackendApplication.class, args); } + } diff --git a/backend/src/main/java/capstone/backend/TimeBlock.java b/backend/src/main/java/capstone/backend/TimeBlock.java deleted file mode 100644 index cf2c73a..0000000 --- a/backend/src/main/java/capstone/backend/TimeBlock.java +++ /dev/null @@ -1,31 +0,0 @@ -package capstone.backend; - -import capstone.backend.user.User; -import jakarta.persistence.*; -import lombok.*; - -import java.time.LocalDateTime; - -@Entity -@Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class TimeBlock { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private LocalDateTime startTime; // 블로킹 시작 시간 - private LocalDateTime endTime; // 블로킹 종료 시간 - - private String category; // 카테고리 (예: "공부", "휴식", "식사" 등) - - /** - * 해당 블록은 하나의 사용자(User)에 속함 - */ - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; -} \ No newline at end of file diff --git a/backend/src/main/java/capstone/backend/auth/AuthController.java b/backend/src/main/java/capstone/backend/auth/AuthController.java new file mode 100644 index 0000000..7bb6a84 --- /dev/null +++ b/backend/src/main/java/capstone/backend/auth/AuthController.java @@ -0,0 +1,50 @@ +package capstone.backend.auth; + + +import capstone.backend.security.JwtTokenProvider; +import capstone.backend.user.domain.User; +import capstone.backend.user.repository.UserRepository; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api") +@RequiredArgsConstructor +public class AuthController { + + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + private final JwtTokenProvider jwtTokenProvider; + + @PostMapping("/login") + public TokenResponse login(@RequestBody LoginRequest request) { + User user = userRepository.findByEmail(request.email) + .orElseThrow(() -> new RuntimeException("존재하지 않는 사용자입니다.")); + + if (!passwordEncoder.matches(request.password, user.getPassword())) { + throw new RuntimeException("비밀번호가 일치하지 않습니다."); + } + + String token = jwtTokenProvider.createToken(user); + return new TokenResponse(token); + } + + @Getter + @Setter + static class LoginRequest { + private String email; + private String password; + } + + @Getter @AllArgsConstructor + static class TokenResponse { + private String token; + } +} \ No newline at end of file diff --git a/backend/src/main/java/capstone/backend/auth/controller/LoginController.java b/backend/src/main/java/capstone/backend/auth/controller/LoginController.java new file mode 100644 index 0000000..bfd0ca4 --- /dev/null +++ b/backend/src/main/java/capstone/backend/auth/controller/LoginController.java @@ -0,0 +1,25 @@ +package capstone.backend.auth.controller; + +import capstone.backend.auth.dto.LoginRequestDto; +import capstone.backend.auth.dto.TokenResponseDto; +import capstone.backend.auth.service.AuthService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/api") +public class LoginController { + + private final AuthService authService; + + @PostMapping + public ResponseEntity login(@RequestBody LoginRequestDto requestDto) { + String token = authService.authenticateAndGenerateToken(requestDto); + return ResponseEntity.ok(new TokenResponseDto(token)); + } +} diff --git a/backend/src/main/java/capstone/backend/auth/dto/LoginRequestDto.java b/backend/src/main/java/capstone/backend/auth/dto/LoginRequestDto.java new file mode 100644 index 0000000..7a03ffa --- /dev/null +++ b/backend/src/main/java/capstone/backend/auth/dto/LoginRequestDto.java @@ -0,0 +1,11 @@ +package capstone.backend.auth.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LoginRequestDto { + private String email; + private String password; +} diff --git a/backend/src/main/java/capstone/backend/auth/dto/TokenResponseDto.java b/backend/src/main/java/capstone/backend/auth/dto/TokenResponseDto.java new file mode 100644 index 0000000..724a80a --- /dev/null +++ b/backend/src/main/java/capstone/backend/auth/dto/TokenResponseDto.java @@ -0,0 +1,10 @@ +package capstone.backend.auth.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class TokenResponseDto { + private String token; +} diff --git a/backend/src/main/java/capstone/backend/auth/service/AuthService.java b/backend/src/main/java/capstone/backend/auth/service/AuthService.java new file mode 100644 index 0000000..7cc2daa --- /dev/null +++ b/backend/src/main/java/capstone/backend/auth/service/AuthService.java @@ -0,0 +1,32 @@ +package capstone.backend.auth.service; + +import capstone.backend.auth.dto.LoginRequestDto; +import capstone.backend.security.JwtTokenProvider; +import capstone.backend.user.domain.User; +import capstone.backend.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.*; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AuthService { + + private final AuthenticationManager authenticationManager; + private final JwtTokenProvider jwtTokenProvider; + private final UserRepository userRepository; + private final UserDetailsService userDetailsService; + + public String authenticateAndGenerateToken(LoginRequestDto requestDto) { + Authentication authentication = authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken(requestDto.getEmail(), requestDto.getPassword()) + ); + + User user = userRepository.findByEmail(requestDto.getEmail()) + .orElseThrow(() -> new RuntimeException("사용자를 찾을 수 없습니다")); + + return jwtTokenProvider.createToken(user); + } +} \ No newline at end of file diff --git a/backend/src/main/java/capstone/backend/config/CorsConfig.java b/backend/src/main/java/capstone/backend/config/CorsConfig.java new file mode 100644 index 0000000..b4cabb0 --- /dev/null +++ b/backend/src/main/java/capstone/backend/config/CorsConfig.java @@ -0,0 +1,18 @@ +package capstone.backend.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") // 모든 경로에 대해 + .allowedOrigins("http://localhost:5000") // Flask 서버 + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true); + } +} diff --git a/backend/src/main/java/capstone/backend/config/SecurityConfig.java b/backend/src/main/java/capstone/backend/config/SecurityConfig.java index 722f8fc..4861ab7 100644 --- a/backend/src/main/java/capstone/backend/config/SecurityConfig.java +++ b/backend/src/main/java/capstone/backend/config/SecurityConfig.java @@ -1,25 +1,47 @@ package capstone.backend.config; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; +import capstone.backend.security.JwtAuthenticationEntryPoint; +import capstone.backend.security.JwtAuthenticationFilter; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.*; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.configuration.*; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.*; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; @Configuration -@EnableWebSecurity +@RequiredArgsConstructor public class SecurityConfig { + private final JwtAuthenticationFilter jwtAuthenticationFilter; + private final JwtAuthenticationEntryPoint jwtEntryPoint; + @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http - .csrf().disable() - .authorizeRequests() - .anyRequest().permitAll() // 🔓 모든 요청 허용 - .and() - .httpBasic().disable() // 🔐 기본 인증 꺼짐 - .formLogin().disable(); // 🔐 폼 로그인 꺼짐 + return http + .csrf(csrf -> csrf.disable()) + .exceptionHandling(e -> e.authenticationEntryPoint(jwtEntryPoint)) + .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests(auth -> auth + .requestMatchers("/api/login", "/api/users", "/api/auth/**", "/api/events", "/signup", "/login", "/users/new", "/users", "/api/tasks", "/api/tasks/batch").permitAll() + .anyRequest().authenticated() + ) + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) + .build(); + } + + @Bean + public AuthenticationManager authenticationManager( + AuthenticationConfiguration config) throws Exception { + return config.getAuthenticationManager(); + } - return http.build(); + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); } -} +} \ No newline at end of file diff --git a/backend/src/main/java/capstone/backend/schedule/Task.java b/backend/src/main/java/capstone/backend/schedule/Task.java deleted file mode 100644 index 75af26c..0000000 --- a/backend/src/main/java/capstone/backend/schedule/Task.java +++ /dev/null @@ -1,54 +0,0 @@ -package capstone.backend.schedule; - -import capstone.backend.user.User; -import jakarta.persistence.*; -import lombok.*; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@Entity -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class Task { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String title; - - private String description; - - @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) - private LocalDateTime startTime; - - @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) - private LocalDateTime endTime; - - private Boolean completed = false; // 기본값 false - - @Enumerated(EnumType.STRING) - @Column(nullable = false) - private Category category; - - @Column(nullable = false) - private Integer priority; // int → Integer (DB null 문제 방지) - - @Column(nullable = false) - private Integer preference; // int → Integer - - @Column(nullable = false) - private Boolean isRepeated = false; // 기본값 false - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; -} - - - diff --git a/backend/src/main/java/capstone/backend/schedule/TaskController.java b/backend/src/main/java/capstone/backend/schedule/TaskController.java deleted file mode 100644 index 08e5b83..0000000 --- a/backend/src/main/java/capstone/backend/schedule/TaskController.java +++ /dev/null @@ -1,34 +0,0 @@ -package capstone.backend.schedule; - -import capstone.backend.user.User; -import capstone.backend.user.UserRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.ModelAndView; - -@Controller -@RequestMapping("/tasks") -@RequiredArgsConstructor -public class TaskController { - - private final TaskService taskService; - private final UserRepository userRepository; - - @GetMapping("/new") - public ModelAndView newTaskForm() { - ModelAndView mav = new ModelAndView("task-form"); - mav.addObject("task", new Task()); - return mav; - } - - @PostMapping - public String createTask(@ModelAttribute Task task) { - User user = userRepository.findById(1L) - .orElseThrow(() -> new IllegalArgumentException("사용자 없음")); - task.setUser(user); - taskService.save(task); - return "redirect:/tasks/new"; - } -} - diff --git a/backend/src/main/java/capstone/backend/schedule/TaskRepository.java b/backend/src/main/java/capstone/backend/schedule/TaskRepository.java deleted file mode 100644 index 64f0b52..0000000 --- a/backend/src/main/java/capstone/backend/schedule/TaskRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package capstone.backend.schedule; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface TaskRepository extends JpaRepository { -} diff --git a/backend/src/main/java/capstone/backend/schedule/TaskService.java b/backend/src/main/java/capstone/backend/schedule/TaskService.java deleted file mode 100644 index f370740..0000000 --- a/backend/src/main/java/capstone/backend/schedule/TaskService.java +++ /dev/null @@ -1,15 +0,0 @@ -package capstone.backend.schedule; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class TaskService { - - private final TaskRepository taskRepository; - - public Task save(Task task) { - return taskRepository.save(task); - } -} diff --git a/backend/src/main/java/capstone/backend/schedule/controller/TaskController.java b/backend/src/main/java/capstone/backend/schedule/controller/TaskController.java new file mode 100644 index 0000000..db616df --- /dev/null +++ b/backend/src/main/java/capstone/backend/schedule/controller/TaskController.java @@ -0,0 +1,103 @@ +package capstone.backend.schedule.controller; + +import capstone.backend.schedule.dto.TaskRequestDTO; +import capstone.backend.schedule.repository.TaskRepository; +import capstone.backend.schedule.service.TaskService; +import capstone.backend.schedule.domain.Task; +import capstone.backend.user.CustomUserDetails; +import capstone.backend.user.domain.User; +import capstone.backend.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/api/tasks") +@RequiredArgsConstructor +public class TaskController { + + private final TaskRepository taskRepository; + + private final TaskService taskService; + private final UserRepository userRepository; + + @GetMapping("/new") + public String newTaskForm(Model model) { + model.addAttribute("task", new Task()); + return "task-form"; + } + +// @PostMapping +// public Task createTask(@ModelAttribute Task task, +// @AuthenticationPrincipal UserDetails userDetails) { +// +// // Spring Security 세션에 저장된 email 기반으로 실제 User 엔티티 조회 +// User user = userRepository.findByEmail(userDetails.getUsername()) +// .orElseThrow(() -> new RuntimeException("유저 정보를 찾을 수 없습니다.")); +// +// task.setUser(user); // 🔥 연관관계 설정 +// taskService.save(task); +// return taskService.save(task); +// } + + @GetMapping + public String listTasks(Model model, + @AuthenticationPrincipal UserDetails userDetails) { + + User user = userRepository.findByEmail(userDetails.getUsername()) + .orElseThrow(() -> new RuntimeException("유저 정보를 찾을 수 없습니다.")); + + model.addAttribute("tasks", taskService.getTasksByUser(user)); + return "task-list"; + } + + @PostMapping + public ResponseEntity createTask(@RequestBody TaskRequestDTO requestDto, + @AuthenticationPrincipal CustomUserDetails userDetails) { + if (userDetails == null) { + System.out.println("❌ userDetails가 null입니다. JWT 인증이 실패했을 수 있습니다."); + return ResponseEntity.status(401).body("인증 실패"); + } + + System.out.println("✅ TaskController: POST 요청 들어옴"); + taskService.createTask(requestDto, userDetails.getUser()); + return ResponseEntity.ok("Task 저장 완료"); + } + + @PostMapping("/batch") + public ResponseEntity createBatchTasksWithoutAuth(@RequestBody List taskDtos) { + + for (TaskRequestDTO dto : taskDtos) { + System.out.println("📨 요청 Task: " + dto.getTitle() + " / userId: " + dto.getUserId()); + User user = userRepository.findById(dto.getUserId()) + .orElseThrow(() -> new RuntimeException("유저 정보를 찾을 수 없습니다.")); + + + Task task = Task.builder() + .title(dto.getTitle()) + .description(dto.getDescription()) + .category(dto.getCategory()) + .isRepeated(dto.isRepeatEvent()) + .completed(dto.isCompleted()) + .priority(dto.getPriority()) + .preference(dto.getPreference()) + .startTime(dto.getStartTime()) + .endTime(dto.getEndTime()) + .user(user) + .build(); + System.out.println("✅ 저장 Task: " + task.getTitle()); + taskRepository.save(task); + } + + return ResponseEntity.ok(Map.of("message", "일정 저장 완료", "count", taskDtos.size())); + } +} + + + diff --git a/backend/src/main/java/capstone/backend/schedule/Category.java b/backend/src/main/java/capstone/backend/schedule/domain/Category.java similarity index 65% rename from backend/src/main/java/capstone/backend/schedule/Category.java rename to backend/src/main/java/capstone/backend/schedule/domain/Category.java index 9a38bb4..b33541d 100644 --- a/backend/src/main/java/capstone/backend/schedule/Category.java +++ b/backend/src/main/java/capstone/backend/schedule/domain/Category.java @@ -1,5 +1,5 @@ -package capstone.backend.schedule; - -public enum Category { - STUDY, EXERCISE, TEST, TASK, MEETING, TRAVEL, ETC -} +package capstone.backend.schedule.domain; + +public enum Category { + STUDY, EXERCISE, TEST, TASK, MEETING, TRAVEL, ETC +} diff --git a/backend/src/main/java/capstone/backend/schedule/domain/Task.java b/backend/src/main/java/capstone/backend/schedule/domain/Task.java new file mode 100644 index 0000000..1cf617e --- /dev/null +++ b/backend/src/main/java/capstone/backend/schedule/domain/Task.java @@ -0,0 +1,41 @@ +package capstone.backend.schedule.domain; + +import capstone.backend.user.domain.User; +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; +import java.time.OffsetDateTime; + +@Entity +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Task { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String title; + private String description; + private String category; + private boolean isRepeated; + private boolean completed; + private int priority; + private int preference; // ✅ 선호도 추가 + + private OffsetDateTime startTime; + private OffsetDateTime endTime; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false) + private User user; +} + + + + + diff --git a/backend/src/main/java/capstone/backend/schedule/dto/TaskRequestDTO.java b/backend/src/main/java/capstone/backend/schedule/dto/TaskRequestDTO.java new file mode 100644 index 0000000..2dd2543 --- /dev/null +++ b/backend/src/main/java/capstone/backend/schedule/dto/TaskRequestDTO.java @@ -0,0 +1,30 @@ +package capstone.backend.schedule.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; +import java.time.OffsetDateTime; + +@Getter +@Setter +public class TaskRequestDTO { + + private Long userId; + + private String title; + private String description; + private String category; + private boolean repeatEvent; + private boolean completed; + private int priority; + private int preference; + + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX") + private OffsetDateTime startTime; + + + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX") + private OffsetDateTime endTime; +} diff --git a/backend/src/main/java/capstone/backend/schedule/repository/TaskRepository.java b/backend/src/main/java/capstone/backend/schedule/repository/TaskRepository.java new file mode 100644 index 0000000..3dd0056 --- /dev/null +++ b/backend/src/main/java/capstone/backend/schedule/repository/TaskRepository.java @@ -0,0 +1,11 @@ +package capstone.backend.schedule.repository; + +import capstone.backend.schedule.domain.Task; +import capstone.backend.user.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface TaskRepository extends JpaRepository { + List findByUser(User user); // 로그인한 사용자 기준으로 조회 +} diff --git a/backend/src/main/java/capstone/backend/schedule/service/AutoScheduleService.java b/backend/src/main/java/capstone/backend/schedule/service/AutoScheduleService.java new file mode 100644 index 0000000..f5d54f9 --- /dev/null +++ b/backend/src/main/java/capstone/backend/schedule/service/AutoScheduleService.java @@ -0,0 +1,60 @@ +//package capstone.backend.schedule.service; +// +//import capstone.backend.schedule.dto.TaskRequestDTO; +//import capstone.backend.schedule.repository.TaskRepository; +//import capstone.backend.user.repository.UserRepository; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import lombok.RequiredArgsConstructor; +//import org.springframework.scheduling.annotation.Scheduled; +//import org.springframework.stereotype.Service; +// +//import java.io.File; +// +//@Service +//@RequiredArgsConstructor +//public class AutoScheduleService { +// +// private final TaskRepository taskRepository; +// private final UserRepository userRepository; +// private final ObjectMapper objectMapper; +// +// @Scheduled(fixedDelay = 3600000) // ✅ 매 시간마다 실행 (원하면 수동 호출로 변경 가능) +// public void importTasksFromJson() { +// try { +// File file = new File("src/main/resources/generated_schedule.json"); +// if (!file.exists()) { +// System.out.println("⚠️ 일정 JSON 파일이 존재하지 않습니다."); +// return; +// } +// +// List tasks = objectMapper.readValue( +// file, new TypeReference<>() {} +// ); +// +// // 임시로 userId=1 고정 (실제 앱에서는 로그인 사용자 or 매핑 사용자 지정 필요) +// User user = userRepository.findById(1L).orElseThrow(); +// +// for (TaskRequestDTO dto : tasks) { +// Task task = Task.builder() +// .title(dto.getTitle()) +// .description(dto.getDescription()) +// .category(dto.getCategory()) +// .isRepeated(dto.isRepeatEvent()) +// .completed(dto.isCompleted()) +// .priority(dto.getPriority()) +// .preference(dto.getPreference()) +// .startTime(dto.getStartTime()) +// .endTime(dto.getEndTime()) +// .user(user) +// .build(); +// +// taskRepository.save(task); +// } +// +// System.out.println("✅ 자동 스케줄 저장 완료!"); +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +//} \ No newline at end of file diff --git a/backend/src/main/java/capstone/backend/schedule/service/TaskService.java b/backend/src/main/java/capstone/backend/schedule/service/TaskService.java new file mode 100644 index 0000000..ee27366 --- /dev/null +++ b/backend/src/main/java/capstone/backend/schedule/service/TaskService.java @@ -0,0 +1,43 @@ +package capstone.backend.schedule.service; + +import capstone.backend.schedule.domain.Task; +import capstone.backend.schedule.dto.TaskRequestDTO; +import capstone.backend.schedule.repository.TaskRepository; +import capstone.backend.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class TaskService { + + private final TaskRepository taskRepository; + + public Task save(Task task) { + return taskRepository.save(task); + } + + public void createTask(TaskRequestDTO dto, User user) { + + DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; + Task task = Task.builder() + .title(dto.getTitle()) + .description(dto.getDescription()) + .category(dto.getCategory()) + .isRepeated(dto.isRepeatEvent()) + .completed(dto.isCompleted()) + .priority(dto.getPriority()) + .preference(dto.getPreference()) + .startTime(dto.getStartTime()) + .endTime(dto.getEndTime()) + .user(user) + .build(); + taskRepository.save(task); + } + public List getTasksByUser(User user) { + return taskRepository.findByUser(user); + } +} diff --git a/backend/src/main/java/capstone/backend/security/JwtAuthenticationEntryPoint.java b/backend/src/main/java/capstone/backend/security/JwtAuthenticationEntryPoint.java new file mode 100644 index 0000000..01c87ba --- /dev/null +++ b/backend/src/main/java/capstone/backend/security/JwtAuthenticationEntryPoint.java @@ -0,0 +1,18 @@ +package capstone.backend.security; + +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Component +public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "인증 실패: 토큰이 없거나 유효하지 않습니다."); + } +} diff --git a/backend/src/main/java/capstone/backend/security/JwtAuthenticationFilter.java b/backend/src/main/java/capstone/backend/security/JwtAuthenticationFilter.java new file mode 100644 index 0000000..bd3af17 --- /dev/null +++ b/backend/src/main/java/capstone/backend/security/JwtAuthenticationFilter.java @@ -0,0 +1,55 @@ +package capstone.backend.security; + +import capstone.backend.user.CustomUserDetails; +import capstone.backend.user.service.CustomUserDetailsService; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class JwtAuthenticationFilter extends OncePerRequestFilter { + + private final JwtTokenProvider jwtTokenProvider; + private final CustomUserDetailsService customUserDetailsService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + + String header = request.getHeader("Authorization"); + + if (header != null && header.startsWith("Bearer ")) { + String token = header.substring(7); + + if (jwtTokenProvider.validateToken(token)) { + String email = jwtTokenProvider.getEmailFromToken(token); + + // 🔐 꼭 CustomUserDetails로 캐스팅 + CustomUserDetails userDetails = (CustomUserDetails) customUserDetailsService.loadUserByUsername(email); + + // 🔐 인증 객체 생성 및 SecurityContext에 등록 + UsernamePasswordAuthenticationToken authentication = + new UsernamePasswordAuthenticationToken( + userDetails, + null, + userDetails.getAuthorities() + ); + + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } + + filterChain.doFilter(request, response); + } +} \ No newline at end of file diff --git a/backend/src/main/java/capstone/backend/security/JwtTokenProvider.java b/backend/src/main/java/capstone/backend/security/JwtTokenProvider.java new file mode 100644 index 0000000..37f3404 --- /dev/null +++ b/backend/src/main/java/capstone/backend/security/JwtTokenProvider.java @@ -0,0 +1,50 @@ +package capstone.backend.security; + +import capstone.backend.user.domain.User; +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; +import org.springframework.stereotype.Component; + +import java.security.Key; +import java.util.Date; + +@Component +public class JwtTokenProvider { + + private final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); + private final long EXPIRATION = 1000L * 60 * 60 * 24; // 24시간 + + // ✅ JWT 토큰 생성 + public String createToken(User user) { + return Jwts.builder() + .setSubject(user.getEmail()) + .claim("userId", user.getId()) + .setIssuedAt(new Date()) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)) + .signWith(key) + .compact(); + } + + // ✅ 토큰에서 사용자 이메일 추출 + public String getEmailFromToken(String token) { + return Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token) + .getBody() + .getSubject(); + } + + // ✅ 토큰 유효성 검증 + public boolean validateToken(String token) { + try { + Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token); + return true; + } catch (JwtException | IllegalArgumentException e) { + return false; + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/capstone/backend/time/controller/PreferredTimeController.java b/backend/src/main/java/capstone/backend/time/controller/PreferredTimeController.java deleted file mode 100644 index cd65107..0000000 --- a/backend/src/main/java/capstone/backend/time/controller/PreferredTimeController.java +++ /dev/null @@ -1,32 +0,0 @@ -package capstone.backend.time.controller; - - -import capstone.backend.time.domain.PreferredTime; -import capstone.backend.time.domain.TimePurpose; -import capstone.backend.time.domain.TimeSlot; -import capstone.backend.time.service.PreferredTimeService; -import capstone.backend.user.User; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping("/api/preferred-times") -@RequiredArgsConstructor -public class PreferredTimeController { - - private final PreferredTimeService preferredTimeService; - - @PostMapping - public PreferredTime createPreferredTime(@RequestParam Long userId, @RequestParam TimeSlot timeSlot, @RequestParam TimePurpose purpose) { - - User user = userService.findById(userId); - return preferredTimeService.savePreferredTime(user, timeSlot, purpose); - } - - @GetMapping - public List getAllPreferredTimes() { - return preferredTimeService.findAll(); - } -} diff --git a/backend/src/main/java/capstone/backend/time/domain/PreferredTime.java b/backend/src/main/java/capstone/backend/time/domain/PreferredTime.java index d44995b..aa8cd12 100644 --- a/backend/src/main/java/capstone/backend/time/domain/PreferredTime.java +++ b/backend/src/main/java/capstone/backend/time/domain/PreferredTime.java @@ -1,47 +1,24 @@ package capstone.backend.time.domain; -import capstone.backend.user.User; +import capstone.backend.user.domain.User; import jakarta.persistence.*; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; +@Entity @Getter +@Setter @NoArgsConstructor -@Entity +@AllArgsConstructor +@Builder public class PreferredTime { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @Enumerated(EnumType.STRING) - private TimeSlot timeSlot; - - @Enumerated(EnumType.STRING) - private TimePurpose purpose; - - public PreferredTime(User user, TimeSlot timeSlot, TimePurpose purpose) { - this.user = user; - this.timeSlot = timeSlot; - this.purpose = purpose; - } - - public int getStartHour() { - return timeSlot.getStartHour(); - } - - public int getEndHour() { - return timeSlot.getEndHour(); - } - - - - - - + private String timeSlot; + @ManyToOne + private User user; } + diff --git a/backend/src/main/java/capstone/backend/time/domain/TimePurpose.java b/backend/src/main/java/capstone/backend/time/domain/TimePurpose.java deleted file mode 100644 index ac3e61e..0000000 --- a/backend/src/main/java/capstone/backend/time/domain/TimePurpose.java +++ /dev/null @@ -1,9 +0,0 @@ -package capstone.backend.time.domain; - -public enum TimePurpose { - FOCUSED_WORK, - LIGHT_TASKS, - ROUTINE_REVIEW, - RELAXATION, - FREE -} diff --git a/backend/src/main/java/capstone/backend/time/domain/TimeSlot.java b/backend/src/main/java/capstone/backend/time/domain/TimeSlot.java deleted file mode 100644 index 17d7974..0000000 --- a/backend/src/main/java/capstone/backend/time/domain/TimeSlot.java +++ /dev/null @@ -1,32 +0,0 @@ -package capstone.backend.time.domain; - -public enum TimeSlot { - - MORNING(6, 12), - AFTERNOON(12, 18), - EVENING(18, 22), - DAWN(22, 6); - - private final int startHour; - private final int endHour; - - TimeSlot(int startHour, int endHour) { - this.startHour = startHour; - this.endHour = endHour; - } - - public int getStartHour() { - return startHour; - } - - public int getEndHour() { - return endHour; - } - - public static TimeSlot fromHour(int hour) { - if (hour >= 6 && hour < 12) return MORNING; - if (hour >= 12 && hour < 18) return AFTERNOON; - if (hour >= 18 && hour < 22) return EVENING; - return DAWN; - } -} diff --git a/backend/src/main/java/capstone/backend/time/repository/PreferredTimeRepository.java b/backend/src/main/java/capstone/backend/time/repository/PreferredTimeRepository.java index 259e03b..4cb4851 100644 --- a/backend/src/main/java/capstone/backend/time/repository/PreferredTimeRepository.java +++ b/backend/src/main/java/capstone/backend/time/repository/PreferredTimeRepository.java @@ -1,7 +1,10 @@ package capstone.backend.time.repository; import capstone.backend.time.domain.PreferredTime; +import capstone.backend.user.domain.User; import org.springframework.data.jpa.repository.JpaRepository; public interface PreferredTimeRepository extends JpaRepository { + boolean existsByUser(User user); + } diff --git a/backend/src/main/java/capstone/backend/time/service/PreferredTimeService.java b/backend/src/main/java/capstone/backend/time/service/PreferredTimeService.java index 14d1431..093cc21 100644 --- a/backend/src/main/java/capstone/backend/time/service/PreferredTimeService.java +++ b/backend/src/main/java/capstone/backend/time/service/PreferredTimeService.java @@ -1,30 +1,43 @@ package capstone.backend.time.service; - import capstone.backend.time.domain.PreferredTime; -import capstone.backend.time.domain.TimePurpose; -import capstone.backend.time.domain.TimeSlot; import capstone.backend.time.repository.PreferredTimeRepository; -import capstone.backend.user.User; +import capstone.backend.user.domain.User; +import capstone.backend.user.repository.UserRepository; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import org.springframework.context.event.EventListener; +import org.springframework.boot.context.event.ApplicationReadyEvent; + @Service @RequiredArgsConstructor public class PreferredTimeService { + private final UserRepository userRepository; private final PreferredTimeRepository preferredTimeRepository; - //PreferredTime 저장 - public PreferredTime savePreferredTime(User user, TimeSlot slot, TimePurpose purpose){ - PreferredTime preferredTime = new PreferredTime(user, slot, purpose); - return preferredTimeRepository.save(preferredTime); - } + @EventListener(ApplicationReadyEvent.class) + public void initPreferredTime() { + List users = userRepository.findAll(); + + for (User user : users) { + // 이미 preferred_time에 해당 유저가 있으면 생략 + boolean exists = preferredTimeRepository.existsByUser(user); + if (!exists && user.getPreferredTime() != null) { + PreferredTime time = PreferredTime.builder() + .user(user) + .timeSlot(user.getPreferredTime().name()) + .build(); + preferredTimeRepository.save(time); + System.out.println("✅ 저장됨: " + time.getTimeSlot() + " - " + user.getUsername()); + } + } - //전체 조회 - public List findAll(){ - return preferredTimeRepository.findAll(); + System.out.println("✅ ApplicationReadyEvent = PreferredTimeService 실행 완료"); } } diff --git a/backend/src/main/java/capstone/backend/timeblock/domain/TimeBlock.java b/backend/src/main/java/capstone/backend/timeblock/domain/TimeBlock.java index 34121fb..b9f246a 100644 --- a/backend/src/main/java/capstone/backend/timeblock/domain/TimeBlock.java +++ b/backend/src/main/java/capstone/backend/timeblock/domain/TimeBlock.java @@ -1,10 +1,14 @@ package capstone.backend.timeblock.domain; -import jakarta.persistence.Column; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; - +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder public class TimeBlock { @Id diff --git a/backend/src/main/java/capstone/backend/user/CustomUserDetails.java b/backend/src/main/java/capstone/backend/user/CustomUserDetails.java new file mode 100644 index 0000000..fcb881b --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/CustomUserDetails.java @@ -0,0 +1,43 @@ +package capstone.backend.user; + +import capstone.backend.user.domain.User; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; +import java.util.Collections; + +public class CustomUserDetails implements UserDetails { + + private final User user; + + public CustomUserDetails(User user) { + this.user = user; + } + + public User getUser() { + return user; + } + + @Override + public Collection getAuthorities() { + return Collections.emptyList(); // 권한 없음 + } + + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getEmail(); // 또는 username 필드 + } + + @Override public boolean isAccountNonExpired() { return true; } + @Override public boolean isAccountNonLocked() { return true; } + @Override public boolean isCredentialsNonExpired() { return true; } + @Override public boolean isEnabled() { return true; } +} + + diff --git a/backend/src/main/java/capstone/backend/user/PreferredTime.java b/backend/src/main/java/capstone/backend/user/PreferredTime.java deleted file mode 100644 index bccbc25..0000000 --- a/backend/src/main/java/capstone/backend/user/PreferredTime.java +++ /dev/null @@ -1,8 +0,0 @@ -package capstone.backend.user; - -public enum PreferredTime { - DAWN, // 새벽 - MORNING, // 오전 - AFTERNOON, // 오후 - EVENING // (선택) 저녁 -} diff --git a/backend/src/main/java/capstone/backend/user/User.java b/backend/src/main/java/capstone/backend/user/User.java deleted file mode 100644 index 8c64181..0000000 --- a/backend/src/main/java/capstone/backend/user/User.java +++ /dev/null @@ -1,26 +0,0 @@ -package capstone.backend.user; - -import jakarta.persistence.*; -import lombok.*; - -@Entity -@Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class User { - - @Id // 기본 키(primary key) 지정 - @GeneratedValue(strategy = GenerationType.IDENTITY) // auto-increment 전략 - private Long id; - - @Column(nullable = false, unique = true) // 중복 불가, 필수값 - private String username; // 사용자 이름 또는 ID - - private String password; // 비밀번호 (※ 추후 암호화 필요) - - private String email; // 이메일 주소 - - @Enumerated(EnumType.STRING) - private PreferredTime preferredTime; // 사용자가 선호하는 시간대 ( -} diff --git a/backend/src/main/java/capstone/backend/user/UserController.java b/backend/src/main/java/capstone/backend/user/UserController.java deleted file mode 100644 index 86c1df1..0000000 --- a/backend/src/main/java/capstone/backend/user/UserController.java +++ /dev/null @@ -1,26 +0,0 @@ -package capstone.backend.user; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.*; - -@Controller -@RequestMapping("/users") -@RequiredArgsConstructor -public class UserController { - - private final UserService userService; - - @GetMapping("/new") - public String newUserForm() { - return "user-form"; - } - - @PostMapping - public String createUser(@ModelAttribute User user) { - userService.save(user); - return "redirect:/tasks/new"; - } -} - - diff --git a/backend/src/main/java/capstone/backend/user/UserRepository.java b/backend/src/main/java/capstone/backend/user/UserRepository.java deleted file mode 100644 index 239cd6b..0000000 --- a/backend/src/main/java/capstone/backend/user/UserRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package capstone.backend.user; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface UserRepository extends JpaRepository { - // 필요시 커스텀 메서드 추가 가능 -} diff --git a/backend/src/main/java/capstone/backend/user/UserService.java b/backend/src/main/java/capstone/backend/user/UserService.java deleted file mode 100644 index 940057a..0000000 --- a/backend/src/main/java/capstone/backend/user/UserService.java +++ /dev/null @@ -1,14 +0,0 @@ -package capstone.backend.user; - -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class UserService { - private final UserRepository userRepository; - - public User save(User user) { - return userRepository.save(user); - } -} diff --git a/backend/src/main/java/capstone/backend/user/controller/ExperienceController.java b/backend/src/main/java/capstone/backend/user/controller/ExperienceController.java new file mode 100644 index 0000000..2bfea99 --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/controller/ExperienceController.java @@ -0,0 +1,25 @@ +package capstone.backend.user.controller; + +import capstone.backend.user.service.ExperienceService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/experience") +public class ExperienceController { + + private final ExperienceService experienceService; + + @PostMapping("/reward") + public ResponseEntity reward( + @RequestParam Long userId, + @RequestParam int successCount) { + experienceService.rewardExperience(userId, successCount); + return ResponseEntity.ok("경험치 추가 완료"); + } +} diff --git a/backend/src/main/java/capstone/backend/user/controller/UserController.java b/backend/src/main/java/capstone/backend/user/controller/UserController.java new file mode 100644 index 0000000..eb2ae01 --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/controller/UserController.java @@ -0,0 +1,42 @@ +package capstone.backend.user.controller; + +import capstone.backend.user.domain.User; +import capstone.backend.user.dto.UserSignupRequestDto; +import capstone.backend.user.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +public class UserController { + + private final UserService userService; + private final PasswordEncoder passwordEncoder; + + @GetMapping("/users/new") + public String userForm() { + return "user-form"; // templates/user-form.html + } + + @PostMapping("/users") + public String createUser(@ModelAttribute User user) { + user.setPassword(passwordEncoder.encode(user.getPassword())); + userService.save(user); + return "redirect:/login"; + } + + @GetMapping("/login") + public String loginForm() { + return "login"; // templates/login.html + } + + @PostMapping("/signup") + public ResponseEntity signup(@RequestBody UserSignupRequestDto requestDto) { + System.out.println("회원가입 요청 도착: " + requestDto.getEmail()); + userService.signup(requestDto); // 서비스에 DTO 전달 + return ResponseEntity.ok("회원가입 성공"); + } +} diff --git a/backend/src/main/java/capstone/backend/user/domain/PreferredTime.java b/backend/src/main/java/capstone/backend/user/domain/PreferredTime.java new file mode 100644 index 0000000..ba26d2b --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/domain/PreferredTime.java @@ -0,0 +1,5 @@ +package capstone.backend.user.domain; + +public enum PreferredTime { + MORNING, AFTERNOON, EVENING +} diff --git a/backend/src/main/java/capstone/backend/user/domain/User.java b/backend/src/main/java/capstone/backend/user/domain/User.java new file mode 100644 index 0000000..cb99f42 --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/domain/User.java @@ -0,0 +1,73 @@ +package capstone.backend.user.domain; + +import jakarta.persistence.*; +import lombok.*; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; +import java.util.Collections; + +@Entity +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class User implements UserDetails { + + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String username; + private String password; + private String email; + + @Enumerated(EnumType.STRING) + private PreferredTime preferredTime; + + @Override public Collection getAuthorities() { return Collections.emptyList(); } + @Override public boolean isAccountNonExpired() { return true; } + @Override public boolean isAccountNonLocked() { return true; } + @Override public boolean isCredentialsNonExpired() { return true; } + @Override public boolean isEnabled() { return true; } + + + // 경험치 및 랭크 관련 필드 + private int experience = 0; + + @Enumerated(EnumType.STRING) + @Column(name = "user_rank") + private Rank userRank = Rank.BRONZE; + + public enum Rank { + BRONZE, SILVER, GOLD, DIAMOND + } + + // ✅ 경험치 추가 메서드 (성공 횟수에 따라 경험치 증가량 달라짐) + public void addExperience(int successCount) { + int expGained = calculateExp(successCount); + this.experience += expGained; + updateRank(); + System.out.println("✅ 성공 " + successCount + "회 → 경험치 " + expGained + " 증가 (총: " + experience + ")"); + } + + // 경험치 증가량 계산 로직 (예: 성공횟수에 따라 가중치) + // 하루에 성공한 횟수 입력 + private int calculateExp(int successCount) { + if (successCount <= 0) return 0; + else if (successCount == 1) return 5; + else if (successCount <= 3) return 10; + else if (successCount <= 5) return 15; + else return 20 + (successCount - 5) * 2; // 6회 이상은 추가 보너스 + } + + // ✅ 랭크 갱신 + public void updateRank() { + if (experience >= 500) userRank = Rank.DIAMOND; + else if (experience >= 300) userRank = Rank.GOLD; + else if (experience >= 100) userRank = Rank.SILVER; + else userRank = Rank.BRONZE; + } + + +} diff --git a/backend/src/main/java/capstone/backend/user/dto/LoginRequestDto.java b/backend/src/main/java/capstone/backend/user/dto/LoginRequestDto.java new file mode 100644 index 0000000..52b2483 --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/dto/LoginRequestDto.java @@ -0,0 +1,13 @@ +package capstone.backend.user.dto; + + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class LoginRequestDto { + + private String email; + private String password; +} diff --git a/backend/src/main/java/capstone/backend/user/dto/UserSignupRequestDto.java b/backend/src/main/java/capstone/backend/user/dto/UserSignupRequestDto.java new file mode 100644 index 0000000..25b8bca --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/dto/UserSignupRequestDto.java @@ -0,0 +1,16 @@ +package capstone.backend.user.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UserSignupRequestDto { + + private String email; + private String password; + private String username; + + // 기본 생성자 필수 (스프링에서 JSON → 객체 매핑 시 필요) + public UserSignupRequestDto() {} +} \ No newline at end of file diff --git a/backend/src/main/java/capstone/backend/user/repository/UserRepository.java b/backend/src/main/java/capstone/backend/user/repository/UserRepository.java new file mode 100644 index 0000000..09b643f --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/repository/UserRepository.java @@ -0,0 +1,18 @@ +package capstone.backend.user.repository; + +import capstone.backend.user.domain.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + + @Query("SELECT u FROM User u") + List findAllUsers(); // 전체 유저 강제 조회 + + Optional findByEmail(String email); // ← 이거 추가! + + +} diff --git a/backend/src/main/java/capstone/backend/user/service/CustomUserDetailsService.java b/backend/src/main/java/capstone/backend/user/service/CustomUserDetailsService.java new file mode 100644 index 0000000..f993936 --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/service/CustomUserDetailsService.java @@ -0,0 +1,26 @@ +package capstone.backend.user.service; + +import capstone.backend.user.CustomUserDetails; +import capstone.backend.user.domain.User; +import capstone.backend.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CustomUserDetailsService implements UserDetailsService { + + private final UserRepository userRepository; + + @Override + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + User user = userRepository.findByEmail(email) + .orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다: " + email)); + return new CustomUserDetails(user); + } +} + + diff --git a/backend/src/main/java/capstone/backend/user/service/ExperienceService.java b/backend/src/main/java/capstone/backend/user/service/ExperienceService.java new file mode 100644 index 0000000..be452a6 --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/service/ExperienceService.java @@ -0,0 +1,21 @@ +package capstone.backend.user.service; + +import capstone.backend.user.domain.User; +import capstone.backend.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ExperienceService { + + private final UserRepository userRepository; + + public void rewardExperience(Long userId, int successCount) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new RuntimeException("사용자 없음")); + + user.addExperience(successCount); // 경험치 추가 + 랭크 갱신 + userRepository.save(user); + } +} diff --git a/backend/src/main/java/capstone/backend/user/service/UserService.java b/backend/src/main/java/capstone/backend/user/service/UserService.java new file mode 100644 index 0000000..0154aef --- /dev/null +++ b/backend/src/main/java/capstone/backend/user/service/UserService.java @@ -0,0 +1,36 @@ +package capstone.backend.user.service; + +import capstone.backend.user.domain.User; +import capstone.backend.user.dto.UserSignupRequestDto; +import capstone.backend.user.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserService { + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + + + public void save(User user) { + userRepository.save(user); + } + + public void signup(UserSignupRequestDto dto) { + User user = User.builder() + .email(dto.getEmail()) + .password(passwordEncoder.encode(dto.getPassword())) + .username(dto.getUsername()) + .build(); + + System.out.println("🔔 UserService.signup() 실행됨!"); + + + userRepository.save(user); + } + + +} + diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index ddef8d7..9c92144 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -2,7 +2,7 @@ spring.application.name=backend spring.security.user.name=admin spring.security.user.password=1234 -spring.datasource.url=jdbc:mysql://localhost:3306/scheduler +spring.datasource.url=jdbc:mysql://localhost:3306/scheduler?serverTimezone=Asia/Seoul spring.datasource.username=root spring.datasource.password=wldn3030 @@ -13,3 +13,6 @@ spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.cache=false + +logging.level.org.springframework.web=DEBUG +logging.level.org.springframework.http.converter.json=DEBUG \ No newline at end of file diff --git a/backend/src/main/resources/templates/login.html b/backend/src/main/resources/templates/login.html new file mode 100644 index 0000000..ff3a463 --- /dev/null +++ b/backend/src/main/resources/templates/login.html @@ -0,0 +1,12 @@ + + +로그인 + +

로그인

+
+
+
+ +
+ + diff --git a/backend/src/main/resources/templates/task-form.html b/backend/src/main/resources/templates/task-form.html index 4b851c3..bbfeb06 100644 --- a/backend/src/main/resources/templates/task-form.html +++ b/backend/src/main/resources/templates/task-form.html @@ -1,52 +1,46 @@ - + Task 등록 -

Task 등록하기

-
-
-

- -
-

+ +
+

-

+

-

+

-

- -
-

- -
-

- - - -

- - - -

- - +
+ + +
+ + +
+ + +
+ + +
+ +
diff --git a/backend/src/main/resources/templates/task-list.html b/backend/src/main/resources/templates/task-list.html new file mode 100644 index 0000000..d54a903 --- /dev/null +++ b/backend/src/main/resources/templates/task-list.html @@ -0,0 +1,43 @@ + + + + + 나의 작업 목록 + + +

나의 작업 목록

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
제목설명카테고리시작 시간종료 시간우선순위선호도 반복완료
제목설명카테고리시작종료우선선호도 반복완료
+ +
++ 새 작업 추가하기 + + + diff --git a/backend/src/main/resources/templates/user-form.html b/backend/src/main/resources/templates/user-form.html index a02d2d5..eaca8b1 100644 --- a/backend/src/main/resources/templates/user-form.html +++ b/backend/src/main/resources/templates/user-form.html @@ -1,32 +1,20 @@ - - - 회원가입 - +회원가입 - -

회원가입 폼

- +

회원가입

-
-

- -
-

- -
-

- -
-
+
+
+

- - +
+
- + +