diff --git a/.gitignore b/.gitignore index 223eba7..f810dc1 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ out/ /src/main/resources/application-dev.yml /src/main/resources/application.yml /src/test/resources/application-test.yml +application.yml # Elastic Beanstalk Files .elasticbeanstalk/* diff --git a/build.gradle b/build.gradle index b8aeebe..3e8f736 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,8 @@ plugins { id 'java' id 'org.springframework.boot' version '3.3.0' id 'io.spring.dependency-management' version '1.1.5' + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.plugin.spring' version '1.9.24' } ext { @@ -13,7 +15,7 @@ version = '0.0.1-SNAPSHOT' java { toolchain { - languageVersion = JavaLanguageVersion.of(17) + languageVersion = JavaLanguageVersion.of(19) } } @@ -53,68 +55,15 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } tasks.named('test') { useJUnitPlatform() } -task makeZipForDeploy(type: Exec) { - commandLine 'sh', '-c', ''' - echo "Starting custom commands" - ls -la - pwd - echo "Current date:" $(date) - ./gradlew clean build -Dspring.profiles.active=prod -x test - rm -rf deploy - mkdir deploy - cp build/libs/cardcapture-0.0.1-SNAPSHOT.jar deploy/ - cp -R .platform deploy/ - cp Procfile deploy/ - rm -f deployment-package.zip - cd deploy - zip -r ../deployment-package.zip . - ''' -} - -task buildDockerCompose(type: Exec) { - commandLine 'sh', '-c', ''' - echo "Starting custom commands" - ls -la - pwd - echo "Current date:" $(date) - - # Step 1: Build the Spring Boot project - ./gradlew clean build -Dspring.profiles.active=prod -x test - - # Step 2: Prepare the deployment package - rm -rf deploy - mkdir deploy - cp build/libs/cardcapture-0.0.1-SNAPSHOT.jar deploy/ - cp build/libs/cardcapture-0.0.1-SNAPSHOT.jar src/main/java/app/cardcapture/build - cp -R .platform deploy/ - cp Procfile deploy/ - rm -f deployment-package.zip - cd deploy - zip -r ../deployment-package.zip . - - echo "Building Docker image" - - # Step 3: Specify the path to Dockerfile - docker build -t cardcapture-app:latest -f /Users/inpink/Downloads/cardcapture/src/main/java/app/cardcapture/build/Dockerfile . - chmod -R 755 deploy - chmod 644 deploy/cardcapture-0.0.1-SNAPSHOT.jar - - echo "Starting Docker Compose" - - # Step 4: Run docker-compose from the correct path - docker-compose -f /Users/inpink/Downloads/cardcapture/src/main/java/app/cardcapture/build/docker-compose.yml down - docker-compose -f /Users/inpink/Downloads/cardcapture/src/main/java/app/cardcapture/build/docker-compose.yml up -d - ''' -} - dependencyManagement { imports { mavenBom "org.springframework.ai:spring-ai-bom:$springAiVersion" } -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..622e554 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,33 @@ +kotlin.code.style=official + +### Project ### +group=app.cardcapture.account +version=1.0 + +### Spring ### +springDependencyManagementVersion=1.1.5 +springbootVersion=3.3.0 +springMockkVersion=4.0.0 + +### Jetbrain ### +jetbrainKotlinVersion=1.9.22 +jvmTarget=19 + +### Database ### +mysqlConnectorVersion=8.0.33 + +### Kotest ### +kotestVersion=5.7.2 +kotestExtensionSpringVersion=1.1.3 + +### TestContainer ### +testContainerVersion=1.19.3 + +### Netx ### +netxVersion=0.4.8 + +### H2version ### +h2Version=1.4.200 + +### SpringDoc ### +springDocVersion=2.3.0 diff --git a/server/account/api/build.gradle b/server/account/api/build.gradle new file mode 100644 index 0000000..f57d908 --- /dev/null +++ b/server/account/api/build.gradle @@ -0,0 +1,49 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'io.spring.dependency-management' + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.plugin.spring' +} + +group = 'app.cardcapture.account' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(19) + } +} + +repositories { + mavenCentral() + maven { url 'https://repo.spring.io/milestone' } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + implementation 'com.auth0:java-jwt:3.18.1' + implementation 'io.sentry:sentry-spring-boot-starter-jakarta:7.14.0' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + implementation 'com.google.guava:guava:33.3.1-jre' + implementation project(':server:account:application') + implementation project(':server:common:api') +// implementation project(":server:user:api") + + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + runtimeOnly 'com.mysql:mysql-connector-j' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.security:spring-security-test' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/server/account/api/gradle/wrapper/gradle-wrapper.jar b/server/account/api/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e644113 Binary files /dev/null and b/server/account/api/gradle/wrapper/gradle-wrapper.jar differ diff --git a/server/account/api/gradle/wrapper/gradle-wrapper.properties b/server/account/api/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a441313 --- /dev/null +++ b/server/account/api/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/main/java/app/cardcapture/auth/google/controller/GoogleAuthController.java b/server/account/api/src/main/java/app/cardcapture/account/api/GoogleAuthController.java similarity index 82% rename from src/main/java/app/cardcapture/auth/google/controller/GoogleAuthController.java rename to server/account/api/src/main/java/app/cardcapture/account/api/GoogleAuthController.java index 16b6f3c..079dd99 100644 --- a/src/main/java/app/cardcapture/auth/google/controller/GoogleAuthController.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/GoogleAuthController.java @@ -1,13 +1,12 @@ -package app.cardcapture.auth.google.controller; +package app.cardcapture.account.api; -import app.cardcapture.auth.google.service.GoogleAuthService; -import app.cardcapture.auth.jwt.dto.JwtResponseDto; -import app.cardcapture.auth.jwt.dto.RefreshTokenRequestDto; -import app.cardcapture.auth.jwt.service.JwtComponent; -import app.cardcapture.common.dto.SuccessResponseDto; +import app.cardcapture.account.api.request.RefreshTokenRequestDto; +import app.cardcapture.account.api.response.JwtResponseDto; +import app.cardcapture.account.api.service.GoogleAuthService; +import app.cardcapture.account.api.service.JwtComponent; +import app.cardcapture.common.api.dto.SuccessResponseDto; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.transaction.Transactional; import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; @@ -29,7 +28,6 @@ public class GoogleAuthController { @GetMapping("/redirect") @Operation(summary = "구글 리다이렉트 엔드포인트", description = "구글 리다이렉트를 통해 받은 auth code를 받습니다. auth code를 이용하여 유저 정보를 가져올 것입니다.") - @Transactional public ResponseEntity> getGoogleRedirect( @RequestParam(name = "code") String authCode ) { diff --git a/src/main/java/app/cardcapture/auth/jwt/controller/TokenController.java b/server/account/api/src/main/java/app/cardcapture/account/api/TokenController.java similarity index 87% rename from src/main/java/app/cardcapture/auth/jwt/controller/TokenController.java rename to server/account/api/src/main/java/app/cardcapture/account/api/TokenController.java index 3879d3d..0507a08 100644 --- a/src/main/java/app/cardcapture/auth/jwt/controller/TokenController.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/TokenController.java @@ -1,7 +1,7 @@ -package app.cardcapture.auth.jwt.controller; +package app.cardcapture.account.api; -import app.cardcapture.auth.jwt.service.TokenBlacklistService; -import app.cardcapture.common.dto.SuccessResponseDto; +import app.cardcapture.account.api.service.TokenBlacklistService; +import app.cardcapture.common.api.dto.SuccessResponseDto; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; diff --git a/src/main/java/app/cardcapture/auth/google/config/GoogleAuthConfig.java b/server/account/api/src/main/java/app/cardcapture/account/api/config/GoogleAuthConfig.java similarity index 93% rename from src/main/java/app/cardcapture/auth/google/config/GoogleAuthConfig.java rename to server/account/api/src/main/java/app/cardcapture/account/api/config/GoogleAuthConfig.java index b264222..547b149 100644 --- a/src/main/java/app/cardcapture/auth/google/config/GoogleAuthConfig.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/config/GoogleAuthConfig.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.google.config; +package app.cardcapture.account.api.config; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/app/cardcapture/auth/jwt/config/JwtConfig.java b/server/account/api/src/main/java/app/cardcapture/account/api/config/JwtConfig.java similarity index 96% rename from src/main/java/app/cardcapture/auth/jwt/config/JwtConfig.java rename to server/account/api/src/main/java/app/cardcapture/account/api/config/JwtConfig.java index d2aa70b..bf4a199 100644 --- a/src/main/java/app/cardcapture/auth/jwt/config/JwtConfig.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/config/JwtConfig.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.jwt.config; +package app.cardcapture.account.api.config; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; diff --git a/src/main/java/app/cardcapture/auth/jwt/domain/Claims.java b/server/account/api/src/main/java/app/cardcapture/account/api/domain/Claims.java similarity index 92% rename from src/main/java/app/cardcapture/auth/jwt/domain/Claims.java rename to server/account/api/src/main/java/app/cardcapture/account/api/domain/Claims.java index 28e2288..9dd395a 100644 --- a/src/main/java/app/cardcapture/auth/jwt/domain/Claims.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/domain/Claims.java @@ -1,6 +1,6 @@ -package app.cardcapture.auth.jwt.domain; +package app.cardcapture.account.api.domain; -import app.cardcapture.common.utils.TimeUtils; +import app.cardcapture.common.api.utils.TimeUtils; import com.auth0.jwt.interfaces.DecodedJWT; import java.util.List; import lombok.Getter; diff --git a/src/main/java/app/cardcapture/auth/jwt/domain/entity/TokenBlacklist.java b/server/account/api/src/main/java/app/cardcapture/account/api/domain/entity/TokenBlacklist.java similarity index 91% rename from src/main/java/app/cardcapture/auth/jwt/domain/entity/TokenBlacklist.java rename to server/account/api/src/main/java/app/cardcapture/account/api/domain/entity/TokenBlacklist.java index 5502b3a..fa975a4 100644 --- a/src/main/java/app/cardcapture/auth/jwt/domain/entity/TokenBlacklist.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/domain/entity/TokenBlacklist.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.jwt.domain.entity; +package app.cardcapture.account.api.domain.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -7,7 +7,6 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; -import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/app/cardcapture/auth/jwt/exception/InvalidTokenException.java b/server/account/api/src/main/java/app/cardcapture/account/api/domain/exception/InvalidTokenException.java similarity index 84% rename from src/main/java/app/cardcapture/auth/jwt/exception/InvalidTokenException.java rename to server/account/api/src/main/java/app/cardcapture/account/api/domain/exception/InvalidTokenException.java index fdb788b..602a58e 100644 --- a/src/main/java/app/cardcapture/auth/jwt/exception/InvalidTokenException.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/domain/exception/InvalidTokenException.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.jwt.exception; +package app.cardcapture.account.api.domain.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/src/main/java/app/cardcapture/auth/jwt/exception/TokenBlacklistedException.java b/server/account/api/src/main/java/app/cardcapture/account/api/domain/exception/TokenBlacklistedException.java similarity index 84% rename from src/main/java/app/cardcapture/auth/jwt/exception/TokenBlacklistedException.java rename to server/account/api/src/main/java/app/cardcapture/account/api/domain/exception/TokenBlacklistedException.java index a781207..0f3e6ea 100644 --- a/src/main/java/app/cardcapture/auth/jwt/exception/TokenBlacklistedException.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/domain/exception/TokenBlacklistedException.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.jwt.exception; +package app.cardcapture.account.api.domain.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/src/main/java/app/cardcapture/auth/jwt/filter/JwtAuthenticationTokenFilter.java b/server/account/api/src/main/java/app/cardcapture/account/api/filter/JwtAuthenticationTokenFilter.java similarity index 92% rename from src/main/java/app/cardcapture/auth/jwt/filter/JwtAuthenticationTokenFilter.java rename to server/account/api/src/main/java/app/cardcapture/account/api/filter/JwtAuthenticationTokenFilter.java index adcc4e6..6afc6ef 100644 --- a/src/main/java/app/cardcapture/auth/jwt/filter/JwtAuthenticationTokenFilter.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/filter/JwtAuthenticationTokenFilter.java @@ -1,11 +1,11 @@ -package app.cardcapture.auth.jwt.filter; - -import app.cardcapture.auth.jwt.domain.Claims; -import app.cardcapture.auth.jwt.service.JwtComponent; -import app.cardcapture.common.dto.ErrorCode; -import app.cardcapture.common.dto.ErrorResponseDto; -import app.cardcapture.security.PrincipalDetails; -import app.cardcapture.security.PrincipalUserDetailsService; +package app.cardcapture.account.api.filter; + +import app.cardcapture.account.api.domain.Claims; +import app.cardcapture.account.api.service.JwtComponent; +import app.cardcapture.common.api.dto.ErrorCode; +import app.cardcapture.common.api.dto.ErrorResponseDto; +import app.cardcapture.security.api.PrincipalDetails; +import app.cardcapture.security.api.PrincipalUserDetailsService; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; diff --git a/src/main/java/app/cardcapture/auth/jwt/repository/TokenBlacklistRepository.java b/server/account/api/src/main/java/app/cardcapture/account/api/repository/TokenBlacklistRepository.java similarity index 69% rename from src/main/java/app/cardcapture/auth/jwt/repository/TokenBlacklistRepository.java rename to server/account/api/src/main/java/app/cardcapture/account/api/repository/TokenBlacklistRepository.java index 7fca06c..ac68cfd 100644 --- a/src/main/java/app/cardcapture/auth/jwt/repository/TokenBlacklistRepository.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/repository/TokenBlacklistRepository.java @@ -1,6 +1,6 @@ -package app.cardcapture.auth.jwt.repository; +package app.cardcapture.account.api.repository; -import app.cardcapture.auth.jwt.domain.entity.TokenBlacklist; +import app.cardcapture.account.api.domain.entity.TokenBlacklist; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/app/cardcapture/auth/google/dto/GoogleTokenRequestDto.java b/server/account/api/src/main/java/app/cardcapture/account/api/request/GoogleTokenRequestDto.java similarity index 87% rename from src/main/java/app/cardcapture/auth/google/dto/GoogleTokenRequestDto.java rename to server/account/api/src/main/java/app/cardcapture/account/api/request/GoogleTokenRequestDto.java index 0616777..ebb0164 100644 --- a/src/main/java/app/cardcapture/auth/google/dto/GoogleTokenRequestDto.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/request/GoogleTokenRequestDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.google.dto; +package app.cardcapture.account.api.request; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/app/cardcapture/auth/jwt/dto/RefreshTokenRequestDto.java b/server/account/api/src/main/java/app/cardcapture/account/api/request/RefreshTokenRequestDto.java similarity index 74% rename from src/main/java/app/cardcapture/auth/jwt/dto/RefreshTokenRequestDto.java rename to server/account/api/src/main/java/app/cardcapture/account/api/request/RefreshTokenRequestDto.java index 3bc1963..d51b16a 100644 --- a/src/main/java/app/cardcapture/auth/jwt/dto/RefreshTokenRequestDto.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/request/RefreshTokenRequestDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.jwt.dto; +package app.cardcapture.account.api.request; import jakarta.validation.constraints.NotBlank; diff --git a/src/main/java/app/cardcapture/auth/google/dto/GoogleTokenResponseDto.java b/server/account/api/src/main/java/app/cardcapture/account/api/response/GoogleTokenResponseDto.java similarity index 88% rename from src/main/java/app/cardcapture/auth/google/dto/GoogleTokenResponseDto.java rename to server/account/api/src/main/java/app/cardcapture/account/api/response/GoogleTokenResponseDto.java index e9d395d..8da71d0 100644 --- a/src/main/java/app/cardcapture/auth/google/dto/GoogleTokenResponseDto.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/response/GoogleTokenResponseDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.google.dto; +package app.cardcapture.account.api.response; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; diff --git a/src/main/java/app/cardcapture/auth/jwt/dto/JwtResponseDto.java b/server/account/api/src/main/java/app/cardcapture/account/api/response/JwtResponseDto.java similarity index 77% rename from src/main/java/app/cardcapture/auth/jwt/dto/JwtResponseDto.java rename to server/account/api/src/main/java/app/cardcapture/account/api/response/JwtResponseDto.java index 593a49e..a4ff0a3 100644 --- a/src/main/java/app/cardcapture/auth/jwt/dto/JwtResponseDto.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/response/JwtResponseDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.auth.jwt.dto; +package app.cardcapture.account.api.response; import jakarta.validation.constraints.NotBlank; diff --git a/src/main/java/app/cardcapture/auth/google/service/GoogleAuthService.java b/server/account/api/src/main/java/app/cardcapture/account/api/service/GoogleAuthService.java similarity index 83% rename from src/main/java/app/cardcapture/auth/google/service/GoogleAuthService.java rename to server/account/api/src/main/java/app/cardcapture/account/api/service/GoogleAuthService.java index da5f267..7819ec1 100644 --- a/src/main/java/app/cardcapture/auth/google/service/GoogleAuthService.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/service/GoogleAuthService.java @@ -1,15 +1,14 @@ -package app.cardcapture.auth.google.service; +package app.cardcapture.account.api.service; -import app.cardcapture.auth.google.config.GoogleAuthConfig; -import app.cardcapture.auth.google.dto.GoogleTokenResponseDto; -import app.cardcapture.auth.jwt.dto.JwtResponseDto; -import app.cardcapture.auth.jwt.service.JwtComponent; -import app.cardcapture.common.dto.ErrorCode; -import app.cardcapture.common.exception.BusinessLogicException; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.dto.UserGoogleAuthResponseDto; -import app.cardcapture.user.repository.UserRepository; -import app.cardcapture.user.service.UserService; +import app.cardcapture.account.api.config.GoogleAuthConfig; +import app.cardcapture.account.api.response.GoogleTokenResponseDto; +import app.cardcapture.account.api.response.JwtResponseDto; +import app.cardcapture.common.api.dto.ErrorCode; +import app.cardcapture.common.api.exception.BusinessLogicException; +import app.cardcapture.user.api.domain.entity.User; +import app.cardcapture.user.api.dto.UserGoogleAuthResponseDto; +import app.cardcapture.user.api.repository.UserRepository; +import app.cardcapture.user.api.service.UserService; import com.google.common.annotations.VisibleForTesting; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -31,6 +30,7 @@ public class GoogleAuthService { private final UserRepository userRepository; private final UserService userService; + // transactional 여기로 옮겨야함 public JwtResponseDto handleGoogleRedirect(String authCode) { User user = handleGoogleAuthentication(authCode); return jwtComponent.issueJwt(user); diff --git a/src/main/java/app/cardcapture/auth/jwt/service/JwtComponent.java b/server/account/api/src/main/java/app/cardcapture/account/api/service/JwtComponent.java similarity index 88% rename from src/main/java/app/cardcapture/auth/jwt/service/JwtComponent.java rename to server/account/api/src/main/java/app/cardcapture/account/api/service/JwtComponent.java index cf8c238..781c28f 100644 --- a/src/main/java/app/cardcapture/auth/jwt/service/JwtComponent.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/service/JwtComponent.java @@ -1,15 +1,15 @@ -package app.cardcapture.auth.jwt.service; - -import app.cardcapture.auth.jwt.config.JwtConfig; -import app.cardcapture.auth.jwt.domain.Claims; -import app.cardcapture.auth.jwt.dto.JwtResponseDto; -import app.cardcapture.auth.jwt.dto.RefreshTokenRequestDto; -import app.cardcapture.auth.jwt.exception.InvalidTokenException; -import app.cardcapture.auth.jwt.exception.TokenBlacklistedException; -import app.cardcapture.common.utils.TimeUtils; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; -import app.cardcapture.user.service.UserService; +package app.cardcapture.account.api.service; + +import app.cardcapture.account.api.config.JwtConfig; +import app.cardcapture.account.api.domain.Claims; +import app.cardcapture.account.api.domain.exception.InvalidTokenException; +import app.cardcapture.account.api.domain.exception.TokenBlacklistedException; +import app.cardcapture.account.api.request.RefreshTokenRequestDto; +import app.cardcapture.account.api.response.JwtResponseDto; +import app.cardcapture.common.api.utils.TimeUtils; +import app.cardcapture.user.api.domain.entity.User; +import app.cardcapture.user.api.domain.entity.UserRole; +import app.cardcapture.user.api.service.UserService; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.algorithms.Algorithm; @@ -19,11 +19,9 @@ import java.time.ZoneId; import java.util.Set; import lombok.Getter; -import org.springframework.stereotype.Component; import java.util.Date; -@Component @Getter public class JwtComponent { diff --git a/src/main/java/app/cardcapture/auth/jwt/service/TokenBlacklistService.java b/server/account/api/src/main/java/app/cardcapture/account/api/service/TokenBlacklistService.java similarity index 78% rename from src/main/java/app/cardcapture/auth/jwt/service/TokenBlacklistService.java rename to server/account/api/src/main/java/app/cardcapture/account/api/service/TokenBlacklistService.java index 86d6346..a393195 100644 --- a/src/main/java/app/cardcapture/auth/jwt/service/TokenBlacklistService.java +++ b/server/account/api/src/main/java/app/cardcapture/account/api/service/TokenBlacklistService.java @@ -1,8 +1,8 @@ -package app.cardcapture.auth.jwt.service; +package app.cardcapture.account.api.service; -import app.cardcapture.auth.jwt.config.JwtConfig; -import app.cardcapture.auth.jwt.domain.entity.TokenBlacklist; -import app.cardcapture.auth.jwt.repository.TokenBlacklistRepository; +import app.cardcapture.account.api.config.JwtConfig; +import app.cardcapture.account.api.domain.entity.TokenBlacklist; +import app.cardcapture.account.api.repository.TokenBlacklistRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; diff --git a/server/account/application/build.gradle b/server/account/application/build.gradle new file mode 100644 index 0000000..4ea612d --- /dev/null +++ b/server/account/application/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'java' + id 'org.jetbrains.kotlin.jvm' +} + +group = 'app.cardcapture.account' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(19) + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + +// implementation project(':server:account:domain') +} \ No newline at end of file diff --git a/server/account/application/gradle/wrapper/gradle-wrapper.jar b/server/account/application/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e644113 Binary files /dev/null and b/server/account/application/gradle/wrapper/gradle-wrapper.jar differ diff --git a/server/account/application/gradle/wrapper/gradle-wrapper.properties b/server/account/application/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a441313 --- /dev/null +++ b/server/account/application/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/src/main/java/app/cardcapture/ai/common/AiImage.java b/server/ai/common/AiImage.java similarity index 100% rename from src/main/java/app/cardcapture/ai/common/AiImage.java rename to server/ai/common/AiImage.java diff --git a/src/main/java/app/cardcapture/ai/common/AiModel.java b/server/ai/common/AiModel.java similarity index 100% rename from src/main/java/app/cardcapture/ai/common/AiModel.java rename to server/ai/common/AiModel.java diff --git a/src/main/java/app/cardcapture/ai/common/repository/AiImageRepository.java b/server/ai/common/repository/AiImageRepository.java similarity index 100% rename from src/main/java/app/cardcapture/ai/common/repository/AiImageRepository.java rename to server/ai/common/repository/AiImageRepository.java diff --git a/src/main/java/app/cardcapture/ai/common/service/AiInstructionGenerator.java b/server/ai/common/service/AiInstructionGenerator.java similarity index 100% rename from src/main/java/app/cardcapture/ai/common/service/AiInstructionGenerator.java rename to server/ai/common/service/AiInstructionGenerator.java diff --git a/src/main/java/app/cardcapture/ai/openai/config/OpenAiConfig.java b/server/ai/openai/config/OpenAiConfig.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/config/OpenAiConfig.java rename to server/ai/openai/config/OpenAiConfig.java diff --git a/src/main/java/app/cardcapture/ai/openai/config/OpenAiImageConfig.java b/server/ai/openai/config/OpenAiImageConfig.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/config/OpenAiImageConfig.java rename to server/ai/openai/config/OpenAiImageConfig.java diff --git a/src/main/java/app/cardcapture/ai/openai/config/StabilityAiConfig.java b/server/ai/openai/config/StabilityAiConfig.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/config/StabilityAiConfig.java rename to server/ai/openai/config/StabilityAiConfig.java diff --git a/src/main/java/app/cardcapture/ai/openai/config/StabilityAiImageConfig.java b/server/ai/openai/config/StabilityAiImageConfig.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/config/StabilityAiImageConfig.java rename to server/ai/openai/config/StabilityAiImageConfig.java diff --git a/src/main/java/app/cardcapture/ai/openai/dto/AiImageChangeReqeustDto.java b/server/ai/openai/dto/AiImageChangeReqeustDto.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/dto/AiImageChangeReqeustDto.java rename to server/ai/openai/dto/AiImageChangeReqeustDto.java diff --git a/src/main/java/app/cardcapture/ai/openai/dto/AiImageChangeResponseDto.java b/server/ai/openai/dto/AiImageChangeResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/dto/AiImageChangeResponseDto.java rename to server/ai/openai/dto/AiImageChangeResponseDto.java diff --git a/src/main/java/app/cardcapture/ai/openai/dto/AiImagePromptDto.java b/server/ai/openai/dto/AiImagePromptDto.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/dto/AiImagePromptDto.java rename to server/ai/openai/dto/AiImagePromptDto.java diff --git a/src/main/java/app/cardcapture/ai/openai/dto/AiTranslationResponseDto.java b/server/ai/openai/dto/AiTranslationResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/dto/AiTranslationResponseDto.java rename to server/ai/openai/dto/AiTranslationResponseDto.java diff --git a/src/main/java/app/cardcapture/ai/openai/service/OpenAiFacadeService.java b/server/ai/openai/service/OpenAiFacadeService.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/service/OpenAiFacadeService.java rename to server/ai/openai/service/OpenAiFacadeService.java diff --git a/src/main/java/app/cardcapture/ai/openai/service/OpenAiImageService.java b/server/ai/openai/service/OpenAiImageService.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/service/OpenAiImageService.java rename to server/ai/openai/service/OpenAiImageService.java diff --git a/src/main/java/app/cardcapture/ai/openai/service/OpenAiTextService.java b/server/ai/openai/service/OpenAiTextService.java similarity index 100% rename from src/main/java/app/cardcapture/ai/openai/service/OpenAiTextService.java rename to server/ai/openai/service/OpenAiTextService.java diff --git a/src/main/java/app/cardcapture/ai/stabilityai/service/StabilityAiImageService.java b/server/ai/stabilityai/service/StabilityAiImageService.java similarity index 100% rename from src/main/java/app/cardcapture/ai/stabilityai/service/StabilityAiImageService.java rename to server/ai/stabilityai/service/StabilityAiImageService.java diff --git a/src/main/java/app/cardcapture/batch/BatchController.java b/server/batch/BatchController.java similarity index 100% rename from src/main/java/app/cardcapture/batch/BatchController.java rename to server/batch/BatchController.java diff --git a/src/main/java/app/cardcapture/batch/DummyDataGenerator.java b/server/batch/DummyDataGenerator.java similarity index 100% rename from src/main/java/app/cardcapture/batch/DummyDataGenerator.java rename to server/batch/DummyDataGenerator.java diff --git a/src/main/java/app/cardcapture/batch/UserJdbcRepository.java b/server/batch/UserJdbcRepository.java similarity index 100% rename from src/main/java/app/cardcapture/batch/UserJdbcRepository.java rename to server/batch/UserJdbcRepository.java diff --git a/server/common/api/build.gradle b/server/common/api/build.gradle new file mode 100644 index 0000000..92c4566 --- /dev/null +++ b/server/common/api/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'io.spring.dependency-management' + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.plugin.spring' +} + +group = 'app.cardcapture.account' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(19) + } +} + +repositories { + mavenCentral() + maven { url 'https://repo.spring.io/milestone' } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + implementation 'com.auth0:java-jwt:3.18.1' + implementation 'io.sentry:sentry-spring-boot-starter-jakarta:7.14.0' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + implementation 'com.google.guava:guava:33.3.1-jre' +// implementation project(':server:account:application') +// implementation project(":server:user:api") +// implementation project(":server:security:api") + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.security:spring-security-test' +} + +tasks.named('test') { + useJUnitPlatform() +} \ No newline at end of file diff --git a/src/main/java/app/cardcapture/common/config/CorsConfig.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/CorsConfig.java similarity index 93% rename from src/main/java/app/cardcapture/common/config/CorsConfig.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/config/CorsConfig.java index a16e196..c239b4a 100644 --- a/src/main/java/app/cardcapture/common/config/CorsConfig.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/CorsConfig.java @@ -1,6 +1,5 @@ -package app.cardcapture.common.config; +package app.cardcapture.common.api.config; -import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.util.StringUtils; @@ -8,7 +7,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration -@Getter public class CorsConfig implements WebMvcConfigurer { @Value("${cors.origins}") diff --git a/src/main/java/app/cardcapture/common/config/JacksonConfig.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/JacksonConfig.java similarity index 90% rename from src/main/java/app/cardcapture/common/config/JacksonConfig.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/config/JacksonConfig.java index a7666b1..49db225 100644 --- a/src/main/java/app/cardcapture/common/config/JacksonConfig.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/JacksonConfig.java @@ -1,4 +1,4 @@ -package app.cardcapture.common.config; +package app.cardcapture.common.api.config; import com.fasterxml.jackson.core.JsonParser.Feature; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/app/cardcapture/common/config/OpenSearchConfig.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/OpenSearchConfig.java similarity index 98% rename from src/main/java/app/cardcapture/common/config/OpenSearchConfig.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/config/OpenSearchConfig.java index 45be08d..f97b01e 100644 --- a/src/main/java/app/cardcapture/common/config/OpenSearchConfig.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/OpenSearchConfig.java @@ -1,4 +1,4 @@ -package app.cardcapture.common.config; +package app.cardcapture.common.api.config; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.HttpHost; diff --git a/src/main/java/app/cardcapture/common/config/RestClientConfig.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/RestClientConfig.java similarity index 90% rename from src/main/java/app/cardcapture/common/config/RestClientConfig.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/config/RestClientConfig.java index 169c7e0..6687260 100644 --- a/src/main/java/app/cardcapture/common/config/RestClientConfig.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/RestClientConfig.java @@ -1,4 +1,4 @@ -package app.cardcapture.common.config; +package app.cardcapture.common.api.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -6,6 +6,7 @@ @Configuration public class RestClientConfig { + @Bean public RestClient restClient() { return RestClient.create(); diff --git a/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/ScheduleConfig.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/config/ScheduleConfig.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/app/cardcapture/common/dto/ErrorCode.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/ErrorCode.java similarity index 88% rename from src/main/java/app/cardcapture/common/dto/ErrorCode.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/ErrorCode.java index ed7b913..ade9e37 100644 --- a/src/main/java/app/cardcapture/common/dto/ErrorCode.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/ErrorCode.java @@ -1,11 +1,7 @@ -package app.cardcapture.common.dto; +package app.cardcapture.common.api.dto; -import lombok.Getter; -import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -@Getter -@RequiredArgsConstructor public enum ErrorCode { DUPLICATED_USER(HttpStatus.CONFLICT, "User already exists"), SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "Server error"), @@ -37,5 +33,13 @@ public enum ErrorCode { private final HttpStatus httpStatus; private final String message; + ErrorCode(HttpStatus httpStatus, String message) { + this.httpStatus = httpStatus; + this.message = message; + } + + public String getMessage() { + return message; + } } diff --git a/src/main/java/app/cardcapture/common/dto/ErrorResponseDto.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/ErrorResponseDto.java similarity index 93% rename from src/main/java/app/cardcapture/common/dto/ErrorResponseDto.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/ErrorResponseDto.java index d164073..ebd2204 100644 --- a/src/main/java/app/cardcapture/common/dto/ErrorResponseDto.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/ErrorResponseDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.common.dto; +package app.cardcapture.common.api.dto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/ImageDto.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/ImageDto.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/app/cardcapture/common/dto/SuccessResponseDto.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/SuccessResponseDto.java similarity index 60% rename from src/main/java/app/cardcapture/common/dto/SuccessResponseDto.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/SuccessResponseDto.java index 1af6a7f..e0f86c6 100644 --- a/src/main/java/app/cardcapture/common/dto/SuccessResponseDto.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/dto/SuccessResponseDto.java @@ -1,14 +1,13 @@ -package app.cardcapture.common.dto; +package app.cardcapture.common.api.dto; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor public class SuccessResponseDto { private final T data; + public SuccessResponseDto(T data) { + this.data = data; + } + public static SuccessResponseDto create(T data) { return new SuccessResponseDto<>(data); } diff --git a/src/main/java/app/cardcapture/common/exception/BusinessLogicException.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/exception/BusinessLogicException.java similarity index 77% rename from src/main/java/app/cardcapture/common/exception/BusinessLogicException.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/exception/BusinessLogicException.java index c54e247..46480e1 100644 --- a/src/main/java/app/cardcapture/common/exception/BusinessLogicException.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/exception/BusinessLogicException.java @@ -1,9 +1,7 @@ -package app.cardcapture.common.exception; +package app.cardcapture.common.api.exception; -import app.cardcapture.common.dto.ErrorCode; -import lombok.Getter; +import app.cardcapture.common.api.dto.ErrorCode; -@Getter public class BusinessLogicException extends RuntimeException { private final ErrorCode errorCode; diff --git a/src/main/java/app/cardcapture/common/exception/GlobalExceptionHandler.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/exception/GlobalExceptionHandler.java similarity index 98% rename from src/main/java/app/cardcapture/common/exception/GlobalExceptionHandler.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/exception/GlobalExceptionHandler.java index 97fd713..ee92421 100644 --- a/src/main/java/app/cardcapture/common/exception/GlobalExceptionHandler.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/exception/GlobalExceptionHandler.java @@ -1,4 +1,4 @@ -package app.cardcapture.common.exception; +package app.cardcapture.common.api.exception; import app.cardcapture.common.dto.ErrorCode; import app.cardcapture.common.dto.ErrorResponseDto; diff --git a/src/main/java/app/cardcapture/common/swagger/config/SwaggerConfig.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/swagger/config/SwaggerConfig.java similarity index 91% rename from src/main/java/app/cardcapture/common/swagger/config/SwaggerConfig.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/swagger/config/SwaggerConfig.java index e8fbfcf..e426366 100644 --- a/src/main/java/app/cardcapture/common/swagger/config/SwaggerConfig.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/swagger/config/SwaggerConfig.java @@ -1,4 +1,4 @@ -package app.cardcapture.common.swagger.config; +package app.cardcapture.common.api.swagger.config; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; @@ -7,14 +7,12 @@ import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Bean; import java.util.List; @Configuration -@ConfigurationProperties public class SwaggerConfig { private String swaggerUrl; @@ -46,4 +44,4 @@ public OpenAPI openAPI() { .scheme("bearer") .bearerFormat("JWT"))); } -} \ No newline at end of file +} diff --git a/src/main/java/app/cardcapture/common/utils/StringUtils.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/utils/StringUtils.java similarity index 85% rename from src/main/java/app/cardcapture/common/utils/StringUtils.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/utils/StringUtils.java index 3458b77..118240b 100644 --- a/src/main/java/app/cardcapture/common/utils/StringUtils.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/utils/StringUtils.java @@ -1,4 +1,4 @@ -package app.cardcapture.common.utils; +package app.cardcapture.common.api.utils; import java.time.LocalDateTime; import java.util.UUID; diff --git a/src/main/java/app/cardcapture/common/utils/TimeUtils.java b/server/common/api/src/main/kotlin/app.cardcapture.common.api/utils/TimeUtils.java similarity index 95% rename from src/main/java/app/cardcapture/common/utils/TimeUtils.java rename to server/common/api/src/main/kotlin/app.cardcapture.common.api/utils/TimeUtils.java index 5d398ff..cc24285 100644 --- a/src/main/java/app/cardcapture/common/utils/TimeUtils.java +++ b/server/common/api/src/main/kotlin/app.cardcapture.common.api/utils/TimeUtils.java @@ -1,4 +1,4 @@ -package app.cardcapture.common.utils; +package app.cardcapture.common.api.utils; import java.time.LocalDateTime; import java.time.ZoneId; diff --git a/src/main/java/app/cardcapture/monitoring/HealthController.java b/server/monitoring/HealthController.java similarity index 100% rename from src/main/java/app/cardcapture/monitoring/HealthController.java rename to server/monitoring/HealthController.java diff --git a/server/payment/api/build.gradle b/server/payment/api/build.gradle new file mode 100644 index 0000000..9650817 --- /dev/null +++ b/server/payment/api/build.gradle @@ -0,0 +1,50 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'io.spring.dependency-management' + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.plugin.spring' +} + +group = 'app.cardcapture.account' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(19) + } +} + +repositories { + mavenCentral() + maven { url 'https://repo.spring.io/milestone' } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + implementation 'com.auth0:java-jwt:3.18.1' + implementation 'io.sentry:sentry-spring-boot-starter-jakarta:7.14.0' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' + implementation 'com.google.guava:guava:33.3.1-jre' +// implementation project(':server:account:application') +// implementation project(':server:common:api') +// implementation project(":server:user:api") + implementation project(":server:security:api") + + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + runtimeOnly 'com.mysql:mysql-connector-j' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.security:spring-security-test' +} + +tasks.named('test') { + useJUnitPlatform() +} \ No newline at end of file diff --git a/src/main/java/app/cardcapture/payment/business/domain/DisplayProduct.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/DisplayProduct.java similarity index 96% rename from src/main/java/app/cardcapture/payment/business/domain/DisplayProduct.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/DisplayProduct.java index a645323..8586d23 100644 --- a/src/main/java/app/cardcapture/payment/business/domain/DisplayProduct.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/DisplayProduct.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.business.domain; +package app.cardcapture.payment.api.business.domain; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/app/cardcapture/payment/business/domain/NewUserProductCategory.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/NewUserProductCategory.java similarity index 85% rename from src/main/java/app/cardcapture/payment/business/domain/NewUserProductCategory.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/NewUserProductCategory.java index d385a61..3976629 100644 --- a/src/main/java/app/cardcapture/payment/business/domain/NewUserProductCategory.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/NewUserProductCategory.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.business.domain; +package app.cardcapture.payment.api.business.domain; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/app/cardcapture/payment/business/domain/ProductCategory.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/ProductCategory.java similarity index 88% rename from src/main/java/app/cardcapture/payment/business/domain/ProductCategory.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/ProductCategory.java index 228d510..82a5694 100644 --- a/src/main/java/app/cardcapture/payment/business/domain/ProductCategory.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/ProductCategory.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.business.domain; +package app.cardcapture.payment.api.business.domain; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/app/cardcapture/payment/business/domain/embed/PaymentProduct.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/embed/PaymentProduct.java similarity index 81% rename from src/main/java/app/cardcapture/payment/business/domain/embed/PaymentProduct.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/embed/PaymentProduct.java index 66f16ad..34c9e8d 100644 --- a/src/main/java/app/cardcapture/payment/business/domain/embed/PaymentProduct.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/embed/PaymentProduct.java @@ -1,9 +1,9 @@ -package app.cardcapture.payment.business.domain.embed; +package app.cardcapture.payment.api.business.domain.embed; -import app.cardcapture.common.dto.ErrorCode; -import app.cardcapture.common.exception.BusinessLogicException; -import app.cardcapture.payment.business.domain.DisplayProduct; -import app.cardcapture.payment.business.domain.ProductCategory; +import app.cardcapture.common.api.dto.ErrorCode; +import app.cardcapture.common.api.exception.BusinessLogicException; +import app.cardcapture.payment.api.business.domain.DisplayProduct; +import app.cardcapture.payment.api.business.domain.ProductCategory; import jakarta.persistence.Column; import jakarta.persistence.Embeddable; import jakarta.persistence.EnumType; diff --git a/src/main/java/app/cardcapture/payment/business/domain/entity/UserProductCategory.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/entity/UserProductCategory.java similarity index 90% rename from src/main/java/app/cardcapture/payment/business/domain/entity/UserProductCategory.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/entity/UserProductCategory.java index cfd5c61..b790260 100644 --- a/src/main/java/app/cardcapture/payment/business/domain/entity/UserProductCategory.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/domain/entity/UserProductCategory.java @@ -1,7 +1,7 @@ -package app.cardcapture.payment.business.domain.entity; +package app.cardcapture.payment.api.business.domain.entity; -import app.cardcapture.payment.business.domain.ProductCategory; -import app.cardcapture.user.domain.entity.User; +import app.cardcapture.payment.api.business.domain.ProductCategory; +import app.cardcapture.user.api.domain.entity.User; import jakarta.persistence.Column; import jakarta.persistence.ConstraintMode; import jakarta.persistence.Entity; diff --git a/src/main/java/app/cardcapture/payment/business/dto/ProductDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/ProductDto.java similarity index 63% rename from src/main/java/app/cardcapture/payment/business/dto/ProductDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/ProductDto.java index 1b9dc0e..198597e 100644 --- a/src/main/java/app/cardcapture/payment/business/dto/ProductDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/ProductDto.java @@ -1,7 +1,7 @@ -package app.cardcapture.payment.business.dto; +package app.cardcapture.payment.api.business.dto; -import app.cardcapture.payment.business.domain.ProductCategory; -import app.cardcapture.payment.business.domain.embed.PaymentProduct; +import app.cardcapture.payment.api.business.domain.ProductCategory; +import app.cardcapture.payment.api.business.domain.embed.PaymentProduct; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/app/cardcapture/payment/business/dto/UserProductCategoriesResponseDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/UserProductCategoriesResponseDto.java similarity index 84% rename from src/main/java/app/cardcapture/payment/business/dto/UserProductCategoriesResponseDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/UserProductCategoriesResponseDto.java index 19e78cd..e428afd 100644 --- a/src/main/java/app/cardcapture/payment/business/dto/UserProductCategoriesResponseDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/UserProductCategoriesResponseDto.java @@ -1,7 +1,7 @@ -package app.cardcapture.payment.business.dto; +package app.cardcapture.payment.api.business.dto; -import app.cardcapture.payment.business.domain.ProductCategory; -import app.cardcapture.payment.business.domain.entity.UserProductCategory; +import app.cardcapture.payment.api.business.domain.ProductCategory; +import app.cardcapture.payment.api.business.domain.entity.UserProductCategory; import jakarta.validation.constraints.NotNull; import java.util.ArrayList; diff --git a/src/main/java/app/cardcapture/payment/business/dto/UserProductCategoryDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/UserProductCategoryDto.java similarity index 70% rename from src/main/java/app/cardcapture/payment/business/dto/UserProductCategoryDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/UserProductCategoryDto.java index a2f6f38..69be5ca 100644 --- a/src/main/java/app/cardcapture/payment/business/dto/UserProductCategoryDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/dto/UserProductCategoryDto.java @@ -1,7 +1,7 @@ -package app.cardcapture.payment.business.dto; +package app.cardcapture.payment.api.business.dto; -import app.cardcapture.payment.business.domain.ProductCategory; -import app.cardcapture.payment.business.domain.entity.UserProductCategory; +import app.cardcapture.payment.api.business.domain.ProductCategory; +import app.cardcapture.payment.api.business.domain.entity.UserProductCategory; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/app/cardcapture/payment/business/repository/UserProductCategoryRepository.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/repository/UserProductCategoryRepository.java similarity index 85% rename from src/main/java/app/cardcapture/payment/business/repository/UserProductCategoryRepository.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/repository/UserProductCategoryRepository.java index 6f37434..cf15eaa 100644 --- a/src/main/java/app/cardcapture/payment/business/repository/UserProductCategoryRepository.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/business/repository/UserProductCategoryRepository.java @@ -1,8 +1,8 @@ -package app.cardcapture.payment.business.repository; +package app.cardcapture.payment.api.business.repository; -import app.cardcapture.payment.business.domain.ProductCategory; -import app.cardcapture.payment.business.domain.entity.UserProductCategory; -import app.cardcapture.user.domain.entity.User; +import app.cardcapture.payment.api.business.domain.ProductCategory; +import app.cardcapture.payment.api.business.domain.entity.UserProductCategory; +import app.cardcapture.user.api.domain.entity.User; import jakarta.persistence.LockModeType; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; diff --git a/src/main/java/app/cardcapture/payment/common/config/PaymentConfig.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/config/PaymentConfig.java similarity index 90% rename from src/main/java/app/cardcapture/payment/common/config/PaymentConfig.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/config/PaymentConfig.java index bb9e6d5..36e7595 100644 --- a/src/main/java/app/cardcapture/payment/common/config/PaymentConfig.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/config/PaymentConfig.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.common.config; +package app.cardcapture.payment.api.common.config; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; diff --git a/src/main/java/app/cardcapture/payment/common/controller/PaymentCommonController.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/controller/PaymentCommonController.java similarity index 85% rename from src/main/java/app/cardcapture/payment/common/controller/PaymentCommonController.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/controller/PaymentCommonController.java index db459b8..f2cb480 100644 --- a/src/main/java/app/cardcapture/payment/common/controller/PaymentCommonController.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/controller/PaymentCommonController.java @@ -1,13 +1,13 @@ -package app.cardcapture.payment.common.controller; +package app.cardcapture.payment.api.common.controller; -import app.cardcapture.payment.portone.dto.PortoneWebhookReqeustDto; -import app.cardcapture.common.dto.SuccessResponseDto; -import app.cardcapture.payment.common.dto.PaymentStartCheckRequestDto; -import app.cardcapture.payment.common.dto.PaymentStartCheckResponseDto; -import app.cardcapture.payment.common.dto.PaymentStatusRequestDto; -import app.cardcapture.payment.common.dto.PaymentStatusResponseDto; -import app.cardcapture.payment.common.service.PaymentCommonService; -import app.cardcapture.security.PrincipalDetails; +import app.cardcapture.common.api.dto.SuccessResponseDto; +import app.cardcapture.payment.api.common.dto.PaymentStartCheckRequestDto; +import app.cardcapture.payment.api.common.dto.PaymentStartCheckResponseDto; +import app.cardcapture.payment.api.common.dto.PaymentStatusRequestDto; +import app.cardcapture.payment.api.common.dto.PaymentStatusResponseDto; +import app.cardcapture.payment.api.common.service.PaymentCommonService; +import app.cardcapture.payment.api.portone.dto.PortoneWebhookReqeustDto; +import app.cardcapture.security.api.PrincipalDetails; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; + @RestController @Tag(name = "payment common", description = "The single payment API") @RequestMapping("/api/v1/payment/single") diff --git a/src/main/java/app/cardcapture/payment/common/domain/PaymentStatus.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/PaymentStatus.java similarity index 74% rename from src/main/java/app/cardcapture/payment/common/domain/PaymentStatus.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/PaymentStatus.java index 9cd91e4..8407b1e 100644 --- a/src/main/java/app/cardcapture/payment/common/domain/PaymentStatus.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/PaymentStatus.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.common.domain; +package app.cardcapture.payment.api.common.domain; public enum PaymentStatus { ARRIVED, READY, CANCELLED, FAILED, PAY_PENDING, PAID, PARTIAL_CANCELLED, SERVER_REQUEST_CANCELLED, FINAL_PAID; diff --git a/src/main/java/app/cardcapture/payment/common/domain/entity/Payment.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/entity/Payment.java similarity index 87% rename from src/main/java/app/cardcapture/payment/common/domain/entity/Payment.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/entity/Payment.java index 38b4aab..99fb9c7 100644 --- a/src/main/java/app/cardcapture/payment/common/domain/entity/Payment.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/entity/Payment.java @@ -1,8 +1,8 @@ -package app.cardcapture.payment.common.domain.entity; +package app.cardcapture.payment.api.common.domain.entity; -import app.cardcapture.payment.business.domain.embed.PaymentProduct; -import app.cardcapture.payment.common.domain.PaymentStatus; -import app.cardcapture.user.domain.entity.User; +import app.cardcapture.payment.api.business.domain.embed.PaymentProduct; +import app.cardcapture.payment.api.common.domain.PaymentStatus; +import app.cardcapture.user.api.domain.entity.User; import jakarta.persistence.Column; import jakarta.persistence.ConstraintMode; import jakarta.persistence.ElementCollection; diff --git a/src/main/java/app/cardcapture/payment/common/domain/entity/TotalSales.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/entity/TotalSales.java similarity index 92% rename from src/main/java/app/cardcapture/payment/common/domain/entity/TotalSales.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/entity/TotalSales.java index 34997f6..adc5641 100644 --- a/src/main/java/app/cardcapture/payment/common/domain/entity/TotalSales.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/domain/entity/TotalSales.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.common.domain.entity; +package app.cardcapture.payment.api.common.domain.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/app/cardcapture/payment/common/dto/PaymentStartCheckRequestDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStartCheckRequestDto.java similarity index 80% rename from src/main/java/app/cardcapture/payment/common/dto/PaymentStartCheckRequestDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStartCheckRequestDto.java index 59c023a..99ae528 100644 --- a/src/main/java/app/cardcapture/payment/common/dto/PaymentStartCheckRequestDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStartCheckRequestDto.java @@ -1,6 +1,6 @@ -package app.cardcapture.payment.common.dto; +package app.cardcapture.payment.api.common.dto; -import app.cardcapture.payment.business.dto.ProductDto; +import app.cardcapture.payment.api.business.dto.ProductDto; import jakarta.validation.Valid; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotEmpty; diff --git a/src/main/java/app/cardcapture/payment/common/dto/PaymentStartCheckResponseDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStartCheckResponseDto.java similarity index 71% rename from src/main/java/app/cardcapture/payment/common/dto/PaymentStartCheckResponseDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStartCheckResponseDto.java index b5136f7..54c216d 100644 --- a/src/main/java/app/cardcapture/payment/common/dto/PaymentStartCheckResponseDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStartCheckResponseDto.java @@ -1,6 +1,6 @@ -package app.cardcapture.payment.common.dto; +package app.cardcapture.payment.api.common.dto; -import app.cardcapture.payment.common.domain.entity.Payment; +import app.cardcapture.payment.api.common.domain.entity.Payment; import jakarta.validation.constraints.NotBlank; public record PaymentStartCheckResponseDto( diff --git a/src/main/java/app/cardcapture/payment/common/dto/PaymentStatusRequestDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStatusRequestDto.java similarity index 73% rename from src/main/java/app/cardcapture/payment/common/dto/PaymentStatusRequestDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStatusRequestDto.java index e6bae50..e4e9e24 100644 --- a/src/main/java/app/cardcapture/payment/common/dto/PaymentStatusRequestDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStatusRequestDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.common.dto; +package app.cardcapture.payment.api.common.dto; import jakarta.validation.constraints.NotBlank; diff --git a/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStatusResponseDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStatusResponseDto.java new file mode 100644 index 0000000..e2f9d36 --- /dev/null +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/dto/PaymentStatusResponseDto.java @@ -0,0 +1,9 @@ +package app.cardcapture.payment.api.common.dto; + +import app.cardcapture.payment.api.common.domain.PaymentStatus; + +public record PaymentStatusResponseDto( + PaymentStatus paymentStatus +) { + +} diff --git a/src/main/java/app/cardcapture/payment/common/repository/PaymentRepository.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/repository/PaymentRepository.java similarity index 89% rename from src/main/java/app/cardcapture/payment/common/repository/PaymentRepository.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/repository/PaymentRepository.java index 6833ee7..209ea47 100644 --- a/src/main/java/app/cardcapture/payment/common/repository/PaymentRepository.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/repository/PaymentRepository.java @@ -1,6 +1,6 @@ -package app.cardcapture.payment.common.repository; +package app.cardcapture.payment.api.common.repository; -import app.cardcapture.payment.common.domain.entity.Payment; +import app.cardcapture.payment.api.common.domain.entity.Payment; import jakarta.persistence.LockModeType; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/java/app/cardcapture/payment/common/repository/TotalSalesRepository.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/repository/TotalSalesRepository.java similarity index 81% rename from src/main/java/app/cardcapture/payment/common/repository/TotalSalesRepository.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/repository/TotalSalesRepository.java index b7b0f43..5a4095b 100644 --- a/src/main/java/app/cardcapture/payment/common/repository/TotalSalesRepository.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/repository/TotalSalesRepository.java @@ -1,6 +1,6 @@ -package app.cardcapture.payment.common.repository; +package app.cardcapture.payment.api.common.repository; -import app.cardcapture.payment.common.domain.entity.TotalSales; +import app.cardcapture.payment.api.common.domain.entity.TotalSales; import jakarta.persistence.LockModeType; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; diff --git a/src/main/java/app/cardcapture/payment/common/service/PaymentCommonService.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/service/PaymentCommonService.java similarity index 86% rename from src/main/java/app/cardcapture/payment/common/service/PaymentCommonService.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/service/PaymentCommonService.java index 44ddd05..8fc2f68 100644 --- a/src/main/java/app/cardcapture/payment/common/service/PaymentCommonService.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/service/PaymentCommonService.java @@ -1,25 +1,26 @@ -package app.cardcapture.payment.common.service; - -import app.cardcapture.common.dto.ErrorCode; -import app.cardcapture.payment.portone.dto.PortoneWebhookReqeustDto; -import app.cardcapture.common.exception.BusinessLogicException; -import app.cardcapture.payment.business.domain.ProductCategory; -import app.cardcapture.payment.business.domain.embed.PaymentProduct; -import app.cardcapture.payment.business.domain.entity.UserProductCategory; -import app.cardcapture.payment.business.dto.ProductDto; -import app.cardcapture.payment.business.repository.UserProductCategoryRepository; -import app.cardcapture.payment.common.config.PaymentConfig; -import app.cardcapture.payment.portone.config.PortoneConfig; -import app.cardcapture.payment.common.domain.PaymentStatus; -import app.cardcapture.payment.common.domain.entity.Payment; -import app.cardcapture.payment.common.domain.entity.TotalSales; -import app.cardcapture.payment.common.dto.PaymentStartCheckRequestDto; -import app.cardcapture.payment.common.dto.PaymentStartCheckResponseDto; -import app.cardcapture.payment.common.dto.PaymentStatusResponseDto; -import app.cardcapture.payment.portone.dto.PortonePaymentInquiryResponseDto; -import app.cardcapture.payment.common.repository.PaymentRepository; -import app.cardcapture.payment.common.repository.TotalSalesRepository; -import app.cardcapture.user.domain.entity.User; +package app.cardcapture.payment.api.common.service; + +import app.cardcapture.common.api.dto.ErrorCode; +import app.cardcapture.common.api.exception.BusinessLogicException; +import app.cardcapture.payment.api.business.domain.ProductCategory; +import app.cardcapture.payment.api.business.domain.embed.PaymentProduct; +import app.cardcapture.payment.api.business.domain.entity.UserProductCategory; +import app.cardcapture.payment.api.business.dto.ProductDto; +import app.cardcapture.payment.api.business.repository.UserProductCategoryRepository; +import app.cardcapture.payment.api.common.config.PaymentConfig; +import app.cardcapture.payment.api.common.domain.PaymentStatus; +import app.cardcapture.payment.api.common.domain.entity.Payment; +import app.cardcapture.payment.api.common.domain.entity.TotalSales; +import app.cardcapture.payment.api.common.dto.PaymentStartCheckRequestDto; +import app.cardcapture.payment.api.common.dto.PaymentStartCheckResponseDto; +import app.cardcapture.payment.api.common.dto.PaymentStatusResponseDto; +import app.cardcapture.payment.api.common.repository.PaymentRepository; +import app.cardcapture.payment.api.common.repository.TotalSalesRepository; +import app.cardcapture.payment.api.portone.config.PortoneConfig; +import app.cardcapture.payment.api.portone.dto.PortonePaymentInquiryResponseDto; +import app.cardcapture.payment.api.portone.dto.PortoneWebhookReqeustDto; +import app.cardcapture.user.api.domain.entity.User; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatusCode; @@ -28,11 +29,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestClient; -import java.util.List; import java.util.UUID; -import static app.cardcapture.payment.common.domain.PaymentStatus.*; - @Service @Slf4j @RequiredArgsConstructor @@ -89,7 +87,7 @@ public PaymentStartCheckResponseDto startCheck( totalSales.setAccumulatedSales(newTotalSales); totalSalesRepository.save(totalSales); - payment.setPaymentStatus(ARRIVED); + payment.setPaymentStatus(PaymentStatus.ARRIVED); Payment savedPayment = paymentRepository.save(payment); return PaymentStartCheckResponseDto.from(savedPayment); @@ -171,7 +169,7 @@ public Payment checkAndAddProductCategoryWithPortone(String unchekcedPaymentId) // TODO: 각 경우에 맞게 다시 설계해야함 안전하게 모든 경우의 수 다 적는것도 방법? ㄴㄴ // FINAL_PAID와 PAID는 변동이 없음 - if (FINAL_PAID.equals(payment.getPaymentStatus()) && PAID.equals(paymentStatus)) { + if (PaymentStatus.FINAL_PAID.equals(payment.getPaymentStatus()) && PaymentStatus.PAID.equals(paymentStatus)) { log.info("이미 PAID 상태입니다."); return payment; } @@ -180,7 +178,7 @@ public Payment checkAndAddProductCategoryWithPortone(String unchekcedPaymentId) User user = payment.getUser(); - if (PAID.equals(paymentStatus)) { //PAID 됐을때만 +1 + if (PaymentStatus.PAID.equals(paymentStatus)) { //PAID 됐을때만 +1 return addProductCategoryQuantity(user, payment); } @@ -238,7 +236,7 @@ public Payment addProductCategoryQuantity(User user, Payment payment) { userProductCategory.setUser(user); userProductCategoryRepository.save(userProductCategory); } - payment.setPaymentStatus(FINAL_PAID); + payment.setPaymentStatus(PaymentStatus.FINAL_PAID); payment.setVoucherIssued(true); log.info("이용권이 발급되었습니다." + payment.getPaymentStatus() + payment.isVoucherIssued()); diff --git a/src/main/java/app/cardcapture/payment/common/service/PaymentScheduledService.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/service/PaymentScheduledService.java similarity index 83% rename from src/main/java/app/cardcapture/payment/common/service/PaymentScheduledService.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/service/PaymentScheduledService.java index 19f0040..b02bba5 100644 --- a/src/main/java/app/cardcapture/payment/common/service/PaymentScheduledService.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/common/service/PaymentScheduledService.java @@ -1,8 +1,8 @@ -package app.cardcapture.payment.common.service; +package app.cardcapture.payment.api.common.service; -import app.cardcapture.payment.common.domain.PaymentStatus; -import app.cardcapture.payment.common.domain.entity.Payment; -import app.cardcapture.payment.common.repository.PaymentRepository; +import app.cardcapture.payment.api.common.domain.PaymentStatus; +import app.cardcapture.payment.api.common.domain.entity.Payment; +import app.cardcapture.payment.api.common.repository.PaymentRepository; import java.time.LocalDateTime; import java.util.List; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/app/cardcapture/payment/portone/config/PortoneConfig.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/config/PortoneConfig.java similarity index 90% rename from src/main/java/app/cardcapture/payment/portone/config/PortoneConfig.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/config/PortoneConfig.java index cdb7ac4..30dee05 100644 --- a/src/main/java/app/cardcapture/payment/portone/config/PortoneConfig.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/config/PortoneConfig.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.portone.config; +package app.cardcapture.payment.api.portone.config; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.annotation.JsonNaming; diff --git a/src/main/java/app/cardcapture/payment/portone/dto/PortonePaymentInquiryResponseDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortonePaymentInquiryResponseDto.java similarity index 96% rename from src/main/java/app/cardcapture/payment/portone/dto/PortonePaymentInquiryResponseDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortonePaymentInquiryResponseDto.java index 0918da3..0c871dc 100644 --- a/src/main/java/app/cardcapture/payment/portone/dto/PortonePaymentInquiryResponseDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortonePaymentInquiryResponseDto.java @@ -1,6 +1,6 @@ -package app.cardcapture.payment.portone.dto; +package app.cardcapture.payment.api.portone.dto; -import app.cardcapture.common.utils.TimeUtils; +import app.cardcapture.common.api.utils.TimeUtils; import jakarta.validation.constraints.NotNull; import java.time.ZonedDateTime; import java.util.List; diff --git a/src/main/java/app/cardcapture/payment/portone/dto/PortonePaymentRequestDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortonePaymentRequestDto.java similarity index 84% rename from src/main/java/app/cardcapture/payment/portone/dto/PortonePaymentRequestDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortonePaymentRequestDto.java index 689a89f..1ee030b 100644 --- a/src/main/java/app/cardcapture/payment/portone/dto/PortonePaymentRequestDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortonePaymentRequestDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.payment.portone.dto; +package app.cardcapture.payment.api.portone.dto; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; diff --git a/src/main/java/app/cardcapture/payment/portone/dto/PortoneWebhookReqeustDto.java b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortoneWebhookReqeustDto.java similarity index 79% rename from src/main/java/app/cardcapture/payment/portone/dto/PortoneWebhookReqeustDto.java rename to server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortoneWebhookReqeustDto.java index b1cd0c6..49f2118 100644 --- a/src/main/java/app/cardcapture/payment/portone/dto/PortoneWebhookReqeustDto.java +++ b/server/payment/api/src/main/kotlin/app/cardcapture/payment/api/portone/dto/PortoneWebhookReqeustDto.java @@ -1,6 +1,6 @@ -package app.cardcapture.payment.portone.dto; +package app.cardcapture.payment.api.portone.dto; -import app.cardcapture.common.utils.TimeUtils; +import app.cardcapture.common.api.utils.TimeUtils; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import java.time.ZonedDateTime; diff --git a/src/main/java/app/cardcapture/s3/config/S3Config.java b/server/s3/config/S3Config.java similarity index 100% rename from src/main/java/app/cardcapture/s3/config/S3Config.java rename to server/s3/config/S3Config.java diff --git a/src/main/java/app/cardcapture/s3/controller/S3Controller.java b/server/s3/controller/S3Controller.java similarity index 100% rename from src/main/java/app/cardcapture/s3/controller/S3Controller.java rename to server/s3/controller/S3Controller.java diff --git a/src/main/java/app/cardcapture/s3/dto/PresignedUrlResponseDto.java b/server/s3/dto/PresignedUrlResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/s3/dto/PresignedUrlResponseDto.java rename to server/s3/dto/PresignedUrlResponseDto.java diff --git a/src/main/java/app/cardcapture/s3/service/S3Service.java b/server/s3/service/S3Service.java similarity index 100% rename from src/main/java/app/cardcapture/s3/service/S3Service.java rename to server/s3/service/S3Service.java diff --git a/server/security/api/build.gradle b/server/security/api/build.gradle new file mode 100644 index 0000000..f25dc79 --- /dev/null +++ b/server/security/api/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'io.spring.dependency-management' + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.plugin.spring' +} + +group = 'app.cardcapture.account' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(19) + } +} + +repositories { + mavenCentral() + maven { url 'https://repo.spring.io/milestone' } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + implementation 'com.auth0:java-jwt:3.18.1' + implementation 'io.sentry:sentry-spring-boot-starter-jakarta:7.14.0' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' +// implementation project(":server:user:api") + + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + runtimeOnly 'com.mysql:mysql-connector-j' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.security:spring-security-test' +} + +tasks.named('test') { + useJUnitPlatform() +} \ No newline at end of file diff --git a/src/main/java/app/cardcapture/sticker/controller/StickerController.java b/server/sticker/controller/StickerController.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/controller/StickerController.java rename to server/sticker/controller/StickerController.java diff --git a/src/main/java/app/cardcapture/sticker/domain/entity/Sticker.java b/server/sticker/domain/entity/Sticker.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/domain/entity/Sticker.java rename to server/sticker/domain/entity/Sticker.java diff --git a/src/main/java/app/cardcapture/sticker/domain/entity/StickerTag.java b/server/sticker/domain/entity/StickerTag.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/domain/entity/StickerTag.java rename to server/sticker/domain/entity/StickerTag.java diff --git a/src/main/java/app/cardcapture/sticker/dto/StickerResponseDto.java b/server/sticker/dto/StickerResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/dto/StickerResponseDto.java rename to server/sticker/dto/StickerResponseDto.java diff --git a/src/main/java/app/cardcapture/sticker/dto/StickerSaveRequestDto.java b/server/sticker/dto/StickerSaveRequestDto.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/dto/StickerSaveRequestDto.java rename to server/sticker/dto/StickerSaveRequestDto.java diff --git a/src/main/java/app/cardcapture/sticker/dto/TagDto.java b/server/sticker/dto/TagDto.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/dto/TagDto.java rename to server/sticker/dto/TagDto.java diff --git a/src/main/java/app/cardcapture/sticker/repository/StickerRepository.java b/server/sticker/repository/StickerRepository.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/repository/StickerRepository.java rename to server/sticker/repository/StickerRepository.java diff --git a/src/main/java/app/cardcapture/sticker/repository/StickerTagRepository.java b/server/sticker/repository/StickerTagRepository.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/repository/StickerTagRepository.java rename to server/sticker/repository/StickerTagRepository.java diff --git a/src/main/java/app/cardcapture/sticker/service/StickerService.java b/server/sticker/service/StickerService.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/service/StickerService.java rename to server/sticker/service/StickerService.java diff --git a/src/main/java/app/cardcapture/sticker/service/StickerTagService.java b/server/sticker/service/StickerTagService.java similarity index 100% rename from src/main/java/app/cardcapture/sticker/service/StickerTagService.java rename to server/sticker/service/StickerTagService.java diff --git a/src/main/java/app/cardcapture/template/controller/TemplateController.java b/server/template/controller/TemplateController.java similarity index 100% rename from src/main/java/app/cardcapture/template/controller/TemplateController.java rename to server/template/controller/TemplateController.java diff --git a/src/main/java/app/cardcapture/template/domain/TemplateAttribute.java b/server/template/domain/TemplateAttribute.java similarity index 100% rename from src/main/java/app/cardcapture/template/domain/TemplateAttribute.java rename to server/template/domain/TemplateAttribute.java diff --git a/src/main/java/app/cardcapture/template/domain/embed/Emphasis.java b/server/template/domain/embed/Emphasis.java similarity index 100% rename from src/main/java/app/cardcapture/template/domain/embed/Emphasis.java rename to server/template/domain/embed/Emphasis.java diff --git a/src/main/java/app/cardcapture/template/domain/embed/PhraseDetails.java b/server/template/domain/embed/PhraseDetails.java similarity index 100% rename from src/main/java/app/cardcapture/template/domain/embed/PhraseDetails.java rename to server/template/domain/embed/PhraseDetails.java diff --git a/src/main/java/app/cardcapture/template/domain/entity/Prompt.java b/server/template/domain/entity/Prompt.java similarity index 100% rename from src/main/java/app/cardcapture/template/domain/entity/Prompt.java rename to server/template/domain/entity/Prompt.java diff --git a/src/main/java/app/cardcapture/template/domain/entity/Template.java b/server/template/domain/entity/Template.java similarity index 100% rename from src/main/java/app/cardcapture/template/domain/entity/Template.java rename to server/template/domain/entity/Template.java diff --git a/src/main/java/app/cardcapture/template/domain/entity/TemplateTag.java b/server/template/domain/entity/TemplateTag.java similarity index 100% rename from src/main/java/app/cardcapture/template/domain/entity/TemplateTag.java rename to server/template/domain/entity/TemplateTag.java diff --git a/src/main/java/app/cardcapture/template/dto/PhraseDetailsRequestDto.java b/server/template/dto/PhraseDetailsRequestDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/PhraseDetailsRequestDto.java rename to server/template/dto/PhraseDetailsRequestDto.java diff --git a/src/main/java/app/cardcapture/template/dto/PhraseDetailsResponseDto.java b/server/template/dto/PhraseDetailsResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/PhraseDetailsResponseDto.java rename to server/template/dto/PhraseDetailsResponseDto.java diff --git a/src/main/java/app/cardcapture/template/dto/PosterMainImageDto.java b/server/template/dto/PosterMainImageDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/PosterMainImageDto.java rename to server/template/dto/PosterMainImageDto.java diff --git a/src/main/java/app/cardcapture/template/dto/PromptRequestDto.java b/server/template/dto/PromptRequestDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/PromptRequestDto.java rename to server/template/dto/PromptRequestDto.java diff --git a/src/main/java/app/cardcapture/template/dto/PromptResponseDto.java b/server/template/dto/PromptResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/PromptResponseDto.java rename to server/template/dto/PromptResponseDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateEditorResponseDto.java b/server/template/dto/TemplateEditorResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateEditorResponseDto.java rename to server/template/dto/TemplateEditorResponseDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateEmptyResponseDto.java b/server/template/dto/TemplateEmptyResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateEmptyResponseDto.java rename to server/template/dto/TemplateEmptyResponseDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateOpenSearchResponseDto.java b/server/template/dto/TemplateOpenSearchResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateOpenSearchResponseDto.java rename to server/template/dto/TemplateOpenSearchResponseDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateRequestDto.java b/server/template/dto/TemplateRequestDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateRequestDto.java rename to server/template/dto/TemplateRequestDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateResponseDto.java b/server/template/dto/TemplateResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateResponseDto.java rename to server/template/dto/TemplateResponseDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateSearchResponseDto.java b/server/template/dto/TemplateSearchResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateSearchResponseDto.java rename to server/template/dto/TemplateSearchResponseDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateTagRequestDto.java b/server/template/dto/TemplateTagRequestDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateTagRequestDto.java rename to server/template/dto/TemplateTagRequestDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateTagResponseDto.java b/server/template/dto/TemplateTagResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateTagResponseDto.java rename to server/template/dto/TemplateTagResponseDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateUpdateRequestDto.java b/server/template/dto/TemplateUpdateRequestDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateUpdateRequestDto.java rename to server/template/dto/TemplateUpdateRequestDto.java diff --git a/src/main/java/app/cardcapture/template/dto/TemplateUpdateResponseDto.java b/server/template/dto/TemplateUpdateResponseDto.java similarity index 100% rename from src/main/java/app/cardcapture/template/dto/TemplateUpdateResponseDto.java rename to server/template/dto/TemplateUpdateResponseDto.java diff --git a/src/main/java/app/cardcapture/template/repository/PromptRepository.java b/server/template/repository/PromptRepository.java similarity index 100% rename from src/main/java/app/cardcapture/template/repository/PromptRepository.java rename to server/template/repository/PromptRepository.java diff --git a/src/main/java/app/cardcapture/template/repository/TemplateRepository.java b/server/template/repository/TemplateRepository.java similarity index 100% rename from src/main/java/app/cardcapture/template/repository/TemplateRepository.java rename to server/template/repository/TemplateRepository.java diff --git a/src/main/java/app/cardcapture/template/repository/TemplateTagRepository.java b/server/template/repository/TemplateTagRepository.java similarity index 100% rename from src/main/java/app/cardcapture/template/repository/TemplateTagRepository.java rename to server/template/repository/TemplateTagRepository.java diff --git a/src/main/java/app/cardcapture/template/service/TemplateSearchService.java b/server/template/service/TemplateSearchService.java similarity index 100% rename from src/main/java/app/cardcapture/template/service/TemplateSearchService.java rename to server/template/service/TemplateSearchService.java diff --git a/src/main/java/app/cardcapture/template/service/TemplateService.java b/server/template/service/TemplateService.java similarity index 100% rename from src/main/java/app/cardcapture/template/service/TemplateService.java rename to server/template/service/TemplateService.java diff --git a/src/main/java/app/cardcapture/template/service/TemplateTagService.java b/server/template/service/TemplateTagService.java similarity index 100% rename from src/main/java/app/cardcapture/template/service/TemplateTagService.java rename to server/template/service/TemplateTagService.java diff --git a/src/main/java/app/cardcapture/template/validation/ValidPhrase.java b/server/template/validation/ValidPhrase.java similarity index 100% rename from src/main/java/app/cardcapture/template/validation/ValidPhrase.java rename to server/template/validation/ValidPhrase.java diff --git a/src/main/java/app/cardcapture/template/validation/ValidPhraseValidator.java b/server/template/validation/ValidPhraseValidator.java similarity index 100% rename from src/main/java/app/cardcapture/template/validation/ValidPhraseValidator.java rename to server/template/validation/ValidPhraseValidator.java diff --git a/server/user/api/build.gradle b/server/user/api/build.gradle new file mode 100644 index 0000000..db5b499 --- /dev/null +++ b/server/user/api/build.gradle @@ -0,0 +1,48 @@ +plugins { + id 'java' + id 'org.springframework.boot' + id 'io.spring.dependency-management' + id 'org.jetbrains.kotlin.jvm' + id 'org.jetbrains.kotlin.plugin.spring' +} + +group = 'app.cardcapture.account' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(19) + } +} + +repositories { + mavenCentral() + maven { url 'https://repo.spring.io/milestone' } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' + implementation 'com.auth0:java-jwt:3.18.1' + implementation 'io.sentry:sentry-spring-boot-starter-jakarta:7.14.0' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' +// implementation project(':server:account:application') + implementation project(':server:common:api') +// implementation project(":server:payment:api") + + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + + runtimeOnly 'com.mysql:mysql-connector-j' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.security:spring-security-test' +} + +tasks.named('test') { + useJUnitPlatform() +} \ No newline at end of file diff --git a/src/main/java/app/cardcapture/security/PrincipalDetails.java b/server/user/api/src/main/kotlin/app/cardcapture/security/api/PrincipalDetails.java similarity index 85% rename from src/main/java/app/cardcapture/security/PrincipalDetails.java rename to server/user/api/src/main/kotlin/app/cardcapture/security/api/PrincipalDetails.java index 4b3be9c..9cda482 100644 --- a/src/main/java/app/cardcapture/security/PrincipalDetails.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/security/api/PrincipalDetails.java @@ -1,20 +1,20 @@ -package app.cardcapture.security; +package app.cardcapture.security.api; -import app.cardcapture.user.domain.entity.User; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import app.cardcapture.user.api.domain.entity.User; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.ArrayList; import java.util.Collection; -@Getter -@RequiredArgsConstructor public class PrincipalDetails implements UserDetails { private final User user; + public PrincipalDetails(User user) { + this.user = user; + } + @Override public String getPassword() { return ""; @@ -56,4 +56,8 @@ public boolean isCredentialsNonExpired() { public boolean isEnabled() { return UserDetails.super.isEnabled(); } + + public User getUser() { + return user; + } } diff --git a/src/main/java/app/cardcapture/security/PrincipalUserDetailsService.java b/server/user/api/src/main/kotlin/app/cardcapture/security/api/PrincipalUserDetailsService.java similarity index 72% rename from src/main/java/app/cardcapture/security/PrincipalUserDetailsService.java rename to server/user/api/src/main/kotlin/app/cardcapture/security/api/PrincipalUserDetailsService.java index 2acf1a4..c8dc535 100644 --- a/src/main/java/app/cardcapture/security/PrincipalUserDetailsService.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/security/api/PrincipalUserDetailsService.java @@ -1,18 +1,20 @@ -package app.cardcapture.security; +package app.cardcapture.security.api; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.repository.UserRepository; -import lombok.RequiredArgsConstructor; +import app.cardcapture.user.api.domain.entity.User; +import app.cardcapture.user.api.repository.UserRepository; 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 PrincipalUserDetailsService implements UserDetailsService { private final UserRepository userRepository; + public PrincipalUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + @Override public UserDetails loadUserByUsername(String id) throws UsernameNotFoundException { User principal = userRepository.findUserAndUserRolesByUserId(Long.valueOf(id)) diff --git a/src/main/java/app/cardcapture/security/config/SecurityConfig.java b/server/user/api/src/main/kotlin/app/cardcapture/security/api/config/SecurityConfig.java similarity index 91% rename from src/main/java/app/cardcapture/security/config/SecurityConfig.java rename to server/user/api/src/main/kotlin/app/cardcapture/security/api/config/SecurityConfig.java index a37948e..bffe62f 100644 --- a/src/main/java/app/cardcapture/security/config/SecurityConfig.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/security/api/config/SecurityConfig.java @@ -1,7 +1,6 @@ -package app.cardcapture.security.config; +package app.cardcapture.security.api.config; -import app.cardcapture.auth.jwt.filter.JwtAuthenticationTokenFilter; -import lombok.RequiredArgsConstructor; +import app.cardcapture.account.api.jwt.filter.JwtAuthenticationTokenFilter; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -14,7 +13,6 @@ @Configuration @EnableWebSecurity -@RequiredArgsConstructor public class SecurityConfig { private final JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; diff --git a/src/main/java/app/cardcapture/user/controller/UserController.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/controller/UserController.java similarity index 82% rename from src/main/java/app/cardcapture/user/controller/UserController.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/controller/UserController.java index 213305d..ef5737b 100644 --- a/src/main/java/app/cardcapture/user/controller/UserController.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/controller/UserController.java @@ -1,20 +1,20 @@ -package app.cardcapture.user.controller; - -import app.cardcapture.common.dto.SuccessResponseDto; -import app.cardcapture.payment.business.domain.entity.UserProductCategory; -import app.cardcapture.payment.business.dto.UserProductCategoriesResponseDto; -import app.cardcapture.security.PrincipalDetails; -import app.cardcapture.user.dto.UserMapper; -import app.cardcapture.user.dto.UserProfileResponseDto; -import app.cardcapture.user.service.UserService; +package app.cardcapture.user.api.controller; + +import app.cardcapture.payment.api.business.domain.entity.UserProductCategory; +import app.cardcapture.payment.api.business.dto.UserProductCategoriesResponseDto; +import app.cardcapture.common.api.dto.SuccessResponseDto; +import app.cardcapture.security.api.PrincipalDetails; +import app.cardcapture.user.api.dto.UserMapper; +import app.cardcapture.user.api.dto.UserProfileResponseDto; +import app.cardcapture.user.api.service.UserService; import io.swagger.v3.oas.annotations.Operation; +import java.util.List; import lombok.AllArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import java.util.List; import org.springframework.web.bind.annotation.RestController; @RestController diff --git a/src/main/java/app/cardcapture/user/domain/Role.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/Role.java similarity index 52% rename from src/main/java/app/cardcapture/user/domain/Role.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/Role.java index 505d383..aa08308 100644 --- a/src/main/java/app/cardcapture/user/domain/Role.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/Role.java @@ -1,4 +1,4 @@ -package app.cardcapture.user.domain; +package app.cardcapture.user.api.domain; public enum Role { USER, SELLER, ADMIN diff --git a/src/main/java/app/cardcapture/user/domain/UserRoleId.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/UserRoleId.java similarity index 94% rename from src/main/java/app/cardcapture/user/domain/UserRoleId.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/UserRoleId.java index b9ad8db..ba1198f 100644 --- a/src/main/java/app/cardcapture/user/domain/UserRoleId.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/UserRoleId.java @@ -1,4 +1,4 @@ -package app.cardcapture.user.domain; +package app.cardcapture.user.api.domain; import java.io.Serializable; import java.util.Objects; diff --git a/src/main/java/app/cardcapture/user/domain/entity/User.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/entity/User.java similarity index 94% rename from src/main/java/app/cardcapture/user/domain/entity/User.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/entity/User.java index 668a175..9e6d0a1 100644 --- a/src/main/java/app/cardcapture/user/domain/entity/User.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/entity/User.java @@ -1,7 +1,7 @@ -package app.cardcapture.user.domain.entity; +package app.cardcapture.user.api.domain.entity; import app.cardcapture.payment.business.domain.entity.UserProductCategory; -import app.cardcapture.payment.common.domain.entity.Payment; +import app.cardcapture.payment.api.common.domain.entity.Payment; import app.cardcapture.template.domain.entity.Template; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/src/main/java/app/cardcapture/user/domain/entity/UserRole.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/entity/UserRole.java similarity index 86% rename from src/main/java/app/cardcapture/user/domain/entity/UserRole.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/entity/UserRole.java index 524c9be..68f5841 100644 --- a/src/main/java/app/cardcapture/user/domain/entity/UserRole.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/domain/entity/UserRole.java @@ -1,7 +1,7 @@ -package app.cardcapture.user.domain.entity; +package app.cardcapture.user.api.domain.entity; -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.UserRoleId; +import app.cardcapture.user.api.domain.UserRoleId; +import app.cardcapture.user.api.domain.Role; import jakarta.persistence.Column; import jakarta.persistence.ConstraintMode; import jakarta.persistence.Entity; @@ -10,8 +10,6 @@ import jakarta.persistence.Enumerated; import jakarta.persistence.FetchType; import jakarta.persistence.ForeignKey; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.IdClass; import jakarta.persistence.JoinColumn; diff --git a/src/main/java/app/cardcapture/user/dto/UserGoogleAuthResponseDto.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserGoogleAuthResponseDto.java similarity index 94% rename from src/main/java/app/cardcapture/user/dto/UserGoogleAuthResponseDto.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserGoogleAuthResponseDto.java index 635d75c..615d68a 100644 --- a/src/main/java/app/cardcapture/user/dto/UserGoogleAuthResponseDto.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserGoogleAuthResponseDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.user.dto; +package app.cardcapture.user.api.dto; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.PropertyNamingStrategies; diff --git a/src/main/java/app/cardcapture/user/dto/UserMapper.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserMapper.java similarity index 89% rename from src/main/java/app/cardcapture/user/dto/UserMapper.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserMapper.java index dcc0d26..b50e28b 100644 --- a/src/main/java/app/cardcapture/user/dto/UserMapper.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserMapper.java @@ -1,6 +1,6 @@ -package app.cardcapture.user.dto; +package app.cardcapture.user.api.dto; -import app.cardcapture.user.domain.entity.User; +import app.cardcapture.user.api.domain.entity.User; import org.springframework.stereotype.Component; @Component diff --git a/src/main/java/app/cardcapture/user/dto/UserProfileResponseDto.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserProfileResponseDto.java similarity index 81% rename from src/main/java/app/cardcapture/user/dto/UserProfileResponseDto.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserProfileResponseDto.java index 2826ced..70ed856 100644 --- a/src/main/java/app/cardcapture/user/dto/UserProfileResponseDto.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/dto/UserProfileResponseDto.java @@ -1,4 +1,4 @@ -package app.cardcapture.user.dto; +package app.cardcapture.user.api.dto; import java.time.LocalDateTime; diff --git a/src/main/java/app/cardcapture/user/repository/UserRepository.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/repository/UserRepository.java similarity index 85% rename from src/main/java/app/cardcapture/user/repository/UserRepository.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/repository/UserRepository.java index 10c1a68..f5f5980 100644 --- a/src/main/java/app/cardcapture/user/repository/UserRepository.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/repository/UserRepository.java @@ -1,6 +1,6 @@ -package app.cardcapture.user.repository; +package app.cardcapture.user.api.repository; -import app.cardcapture.user.domain.entity.User; +import app.cardcapture.user.api.domain.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; diff --git a/src/main/java/app/cardcapture/user/repository/UserRoleRepository.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/repository/UserRoleRepository.java similarity index 54% rename from src/main/java/app/cardcapture/user/repository/UserRoleRepository.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/repository/UserRoleRepository.java index 1f9b83c..26260a5 100644 --- a/src/main/java/app/cardcapture/user/repository/UserRoleRepository.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/repository/UserRoleRepository.java @@ -1,8 +1,8 @@ -package app.cardcapture.user.repository; +package app.cardcapture.user.api.repository; -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; +import app.cardcapture.user.api.domain.Role; +import app.cardcapture.user.api.domain.entity.User; +import app.cardcapture.user.api.domain.entity.UserRole; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/app/cardcapture/user/service/UserService.java b/server/user/api/src/main/kotlin/app/cardcapture/user/api/service/UserService.java similarity index 84% rename from src/main/java/app/cardcapture/user/service/UserService.java rename to server/user/api/src/main/kotlin/app/cardcapture/user/api/service/UserService.java index d3f3727..eae2a56 100644 --- a/src/main/java/app/cardcapture/user/service/UserService.java +++ b/server/user/api/src/main/kotlin/app/cardcapture/user/api/service/UserService.java @@ -1,17 +1,17 @@ -package app.cardcapture.user.service; - -import app.cardcapture.common.dto.ErrorCode; -import app.cardcapture.common.exception.BusinessLogicException; -import app.cardcapture.payment.business.domain.NewUserProductCategory; -import app.cardcapture.payment.business.domain.entity.UserProductCategory; -import app.cardcapture.payment.business.repository.UserProductCategoryRepository; -import app.cardcapture.payment.common.service.PaymentCommonService; -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; -import app.cardcapture.user.dto.UserGoogleAuthResponseDto; -import app.cardcapture.user.repository.UserRepository; -import app.cardcapture.user.repository.UserRoleRepository; +package app.cardcapture.user.api.service; + +import app.cardcapture.common.api.dto.ErrorCode; +import app.cardcapture.common.api.exception.BusinessLogicException; +import app.cardcapture.payment.api.business.domain.NewUserProductCategory; +import app.cardcapture.payment.api.business.domain.entity.UserProductCategory; +import app.cardcapture.payment.api.business.repository.UserProductCategoryRepository; +import app.cardcapture.payment.api.common.service.PaymentCommonService; +import app.cardcapture.user.api.domain.Role; +import app.cardcapture.user.api.domain.entity.User; +import app.cardcapture.user.api.domain.entity.UserRole; +import app.cardcapture.user.api.dto.UserGoogleAuthResponseDto; +import app.cardcapture.user.api.repository.UserRepository; +import app.cardcapture.user.api.repository.UserRoleRepository; import java.time.LocalDateTime; import java.util.Set; import lombok.AllArgsConstructor; diff --git a/settings.gradle b/settings.gradle index 1817ce2..28bc5f1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,19 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.jvm' version '1.9.24' + } +} rootProject.name = 'cardcapture' + +include ":server:account:application" +include ":server:account:api" +include ":server:user:api" +include ":server:common:api" +include ":server:payment:api" +include ":server:security:api" +project(":server:account:api").projectDir = file("server/account/api") +project(':server:account:application').projectDir = file('server/account/application') +project(":server:common:api").projectDir = file("server/common/api") +project(":server:user:api").projectDir = file("server/user/api") +project(":server:payment:api").projectDir = file("server/payment/api") +project(":server:security:api").projectDir = file("server/security/api") \ No newline at end of file diff --git a/src/main/java/app/cardcapture/CardcaptureApplication.java b/src/main/java/app/cardcapture/CardcaptureApplication.java deleted file mode 100644 index 20062e6..0000000 --- a/src/main/java/app/cardcapture/CardcaptureApplication.java +++ /dev/null @@ -1,15 +0,0 @@ -package app.cardcapture; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.ConfigurationPropertiesScan; - -@SpringBootApplication -@ConfigurationPropertiesScan -public class CardcaptureApplication { - - public static void main(String[] args) { - SpringApplication.run(CardcaptureApplication.class, args); - } - -} diff --git a/src/main/java/app/cardcapture/ai/openai/controller/Person.java b/src/main/java/app/cardcapture/ai/openai/controller/Person.java deleted file mode 100644 index fb80200..0000000 --- a/src/main/java/app/cardcapture/ai/openai/controller/Person.java +++ /dev/null @@ -1,32 +0,0 @@ -package app.cardcapture.ai.openai.controller; - -@Deprecated -public class Person { - - private String name; - private int age; - - public Person() { - } - - public Person(String name, int age) { - this.name = name; - this.age = age; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/src/main/java/app/cardcapture/common/config/JpaConfig.java b/src/main/java/app/cardcapture/common/config/JpaConfig.java deleted file mode 100644 index c2b5938..0000000 --- a/src/main/java/app/cardcapture/common/config/JpaConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package app.cardcapture.common.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; - -@Configuration -@EnableJpaAuditing -public class JpaConfig { - -} diff --git a/src/main/java/app/cardcapture/common/config/ScheduleConfig.java b/src/main/java/app/cardcapture/common/config/ScheduleConfig.java deleted file mode 100644 index 625d568..0000000 --- a/src/main/java/app/cardcapture/common/config/ScheduleConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package app.cardcapture.common.config; - -import javax.sql.DataSource; -import net.javacrumbs.shedlock.core.LockProvider; -import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider; -import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.annotation.EnableScheduling; - -@Configuration -@EnableScheduling -@EnableSchedulerLock(defaultLockAtMostFor = "10m") -class ScheduleConfig { - - @Bean - public LockProvider lockProvider(DataSource dataSource) { - return new JdbcTemplateLockProvider(dataSource); - } -} diff --git a/src/main/java/app/cardcapture/common/dto/ImageDto.java b/src/main/java/app/cardcapture/common/dto/ImageDto.java deleted file mode 100644 index 0ed4b7b..0000000 --- a/src/main/java/app/cardcapture/common/dto/ImageDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package app.cardcapture.common.dto; - -public record ImageDto( - String path, - String name, - String url, - byte[] raw, - String prompt, - Long aiImageId -){ - -} diff --git a/src/main/java/app/cardcapture/payment/common/dto/PaymentStatusResponseDto.java b/src/main/java/app/cardcapture/payment/common/dto/PaymentStatusResponseDto.java deleted file mode 100644 index adca272..0000000 --- a/src/main/java/app/cardcapture/payment/common/dto/PaymentStatusResponseDto.java +++ /dev/null @@ -1,9 +0,0 @@ -package app.cardcapture.payment.common.dto; - -import app.cardcapture.payment.common.domain.PaymentStatus; - -public record PaymentStatusResponseDto( - PaymentStatus paymentStatus -) { - -} diff --git a/src/main/kotlin/app/cardcapture/CardcaptureApplication.kt b/src/main/kotlin/app/cardcapture/CardcaptureApplication.kt new file mode 100644 index 0000000..315d4e7 --- /dev/null +++ b/src/main/kotlin/app/cardcapture/CardcaptureApplication.kt @@ -0,0 +1,18 @@ +package app.cardcapture + +import org.springframework.boot.SpringApplication +import org.springframework.boot.autoconfigure.SpringBootApplication + + +@SpringBootApplication +class CardcaptureApplication { + + companion object { + + @JvmStatic + fun main(args: Array) { + SpringApplication.run(CardcaptureApplication::class.java, *args) + } + + } +} \ No newline at end of file diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico deleted file mode 100644 index 569ab43..0000000 Binary files a/src/main/resources/static/favicon.ico and /dev/null differ diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html deleted file mode 100644 index 566549b..0000000 --- a/src/main/resources/static/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Title - - - - - \ No newline at end of file diff --git a/src/main/resources/static/me.html b/src/main/resources/static/me.html deleted file mode 100644 index fa6d5f0..0000000 --- a/src/main/resources/static/me.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - User Info - - - -

User Info

- - -

-
-
diff --git a/src/main/resources/static/s3.html b/src/main/resources/static/s3.html
deleted file mode 100644
index 84fbf85..0000000
--- a/src/main/resources/static/s3.html
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-    
-    
-    S3 API Tester
-    
-
-
-
-

S3 API Tester

- -
-

Generate Presigned URL

- - - - -
-
- -
-

Delete File

- - -
-
-
- - - - \ No newline at end of file diff --git a/src/test/java/app/cardcapture/CardcaptureApplicationTests.java b/src/test/java/app/cardcapture/CardcaptureApplicationTests.java deleted file mode 100644 index 6c52f62..0000000 --- a/src/test/java/app/cardcapture/CardcaptureApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package app.cardcapture; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class CardcaptureApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/app/cardcapture/auth/google/config/GoogleAuthConfigStub.java b/src/test/java/app/cardcapture/auth/google/config/GoogleAuthConfigStub.java deleted file mode 100644 index 89a959e..0000000 --- a/src/test/java/app/cardcapture/auth/google/config/GoogleAuthConfigStub.java +++ /dev/null @@ -1,57 +0,0 @@ -package app.cardcapture.auth.google.config; - -public class GoogleAuthConfigStub extends GoogleAuthConfig { - - private GoogleAuthConfigStub() { - super(); - } - - public static GoogleAuthConfigStub createStub() { - return new GoogleAuthConfigStub(); - } - - @Override - public String getBaseUrl() { - return "https://accounts.google.com/o/oauth2/v2/auth"; - } - - @Override - public String getScope() { - return "profile email"; - } - - @Override - public String getRedirectUri() { - return "http://localhost:8080/api/v1/auth/google/redirect"; - } - - @Override - public String getResponseType() { - return "code"; - } - - @Override - public String getClientId() { - return "your-client-id"; - } - - @Override - public String getClientSecret() { - return "your-client-secret"; - } - - @Override - public String getOauthUrl() { - return "https://oauth2.googleapis.com/token"; - } - - @Override - public String getApiUrl() { - return "https://www.googleapis.com/oauth2/v3/userinfo"; - } - - @Override - public String getGrantType() { - return "authorization_code"; - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/auth/google/controller/GoogleAuthControllerTest.java b/src/test/java/app/cardcapture/auth/google/controller/GoogleAuthControllerTest.java deleted file mode 100644 index 3085cfb..0000000 --- a/src/test/java/app/cardcapture/auth/google/controller/GoogleAuthControllerTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package app.cardcapture.auth.google.controller; - -import app.cardcapture.auth.google.service.GoogleAuthService; -import app.cardcapture.auth.jwt.dto.JwtResponseDto; -import app.cardcapture.security.EstablishedSecurityControllerTest; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; - -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@WebMvcTest(GoogleAuthController.class) -public class GoogleAuthControllerTest extends EstablishedSecurityControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private GoogleAuthService googleAuthService; - - private JwtResponseDto jwtResponseDto; - - @BeforeEach - void setUp() { - jwtResponseDto = new JwtResponseDto("test_access_token", "test_refresh_token"); - } - - @Test - public void getGoogleRedirect_success() throws Exception { - // Given - String authCode = "test_auth_code"; - given(googleAuthService.handleGoogleRedirect(authCode)).willReturn(jwtResponseDto); - - // When - ResultActions resultActions = mockMvc.perform( - MockMvcRequestBuilders.get("/api/v1/auth/google/redirect") - .param("code", authCode) - .accept(MediaType.APPLICATION_JSON) - .contentType(MediaType.APPLICATION_JSON)); - - // Then - resultActions.andExpect(status().isOk()) - .andExpect(jsonPath("$.data.accessToken").value("test_access_token")) - .andExpect(jsonPath("$.data.refreshToken").value("test_refresh_token")); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/auth/google/service/GoogleAuthServiceTest.java b/src/test/java/app/cardcapture/auth/google/service/GoogleAuthServiceTest.java deleted file mode 100644 index bf67c2f..0000000 --- a/src/test/java/app/cardcapture/auth/google/service/GoogleAuthServiceTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package app.cardcapture.auth.google.service; - -import app.cardcapture.auth.google.config.GoogleAuthConfigStub; -import app.cardcapture.auth.google.dto.GoogleTokenResponseDto; -import app.cardcapture.auth.jwt.service.JwtComponent; -import app.cardcapture.common.exception.BusinessLogicException; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.dto.UserGoogleAuthResponseDto; -import app.cardcapture.user.repository.UserRepository; -import app.cardcapture.user.service.UserService; -import java.time.LocalDateTime; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.test.web.client.MockRestServiceServer; - -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestClient.Builder; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.content; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.method; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; -import static org.springframework.test.web.client.response.MockRestResponseCreators.withServerError; -import static org.springframework.test.web.client.response.MockRestResponseCreators.withSuccess; - -@RestClientTest -@ExtendWith(MockitoExtension.class) -public class GoogleAuthServiceTest { - - private GoogleAuthConfigStub googleAuthConfig; - - @Mock - private UserService userService; - - @MockBean - private JwtComponent jwtComponent; - - @MockBean - private UserRepository userRepository; - - @Autowired - private MockRestServiceServer server; - - // 테스트 타겟은 autowired 등으로 주입하지 말고 실제 객체 만들어 쓰기. 1. 우리가 의존성을 직접 관리해야 우리가 의도한대로 테스트환경을 구성할 수 있음. 2. 그러면 이제 googleAUthconfig도 굳이 stub으로 안만들어도 됨. - private GoogleAuthService googleAuthService; - - @Autowired - private Builder restClientBuilder; - - @BeforeEach - public void setUp() { - server = MockRestServiceServer.bindTo(restClientBuilder).build(); - googleAuthConfig = GoogleAuthConfigStub.createStub(); - googleAuthService = new GoogleAuthService(jwtComponent, googleAuthConfig, restClientBuilder, userRepository, userService); - } - - @Test - public void 구글_리디렉션을_처리할_수_있다() throws Exception { - // given - String authCode = "auth-code"; - GoogleTokenResponseDto googleTokenResponse = new GoogleTokenResponseDto("access-token", - "refresh-token", "id-token", "token-type", 3600); - - UserGoogleAuthResponseDto userGoogleAuthResponse = new UserGoogleAuthResponseDto("googleId", - "email", true, "name", "givenName", "familyName", "picture", LocalDateTime.now(), - LocalDateTime.now()); - - User user = new User(); - user.setGoogleId("googleId"); - - MultiValueMap expectedBody = buildMultiValueBody(authCode); - - this.server.expect(requestTo(googleAuthConfig.getOauthUrl())) - .andExpect(method(HttpMethod.POST)) - .andExpect(content().contentType(MediaType.valueOf("application/x-www-form-urlencoded;charset=UTF-8"))) - .andExpect(content().formData(expectedBody)) - .andRespond(withSuccess("{ \"access_token\": \"access-token\" }", MediaType.APPLICATION_JSON)); - - // when - GoogleTokenResponseDto googleTokenResponseDto = googleAuthService.retrieveGoogleToken(authCode); - - // then - assertThat(googleTokenResponseDto).isNotNull(); - assertThat(googleTokenResponseDto.accessToken()).isEqualTo("access-token"); - } - - private MultiValueMap buildMultiValueBody(String authCode) { - MultiValueMap formData = new LinkedMultiValueMap<>(); - formData.add("code", authCode); - formData.add("client_id", googleAuthConfig.getClientId()); - formData.add("client_secret", googleAuthConfig.getClientSecret()); - formData.add("redirect_uri", googleAuthConfig.getRedirectUri()); - formData.add("grant_type", googleAuthConfig.getGrantType()); - return formData; - } - - @Test - public void 구글_토큰을_받아오는_중_에러가_발생하면_예외가_던져진다() { - // given - String authCode = "auth-code"; - - this.server.expect(requestTo("https://oauth2.googleapis.com/token")) - .andRespond(withServerError()); - - // when & then - assertThrows(BusinessLogicException.class, - () -> googleAuthService.retrieveGoogleToken(authCode)); - } - - @Test - public void 유저정보를_조회할_수_있다() { - // given - String accessToken = "access-token"; - - this.server.expect(requestTo("https://www.googleapis.com/oauth2/v3/userinfo")) - .andRespond(withSuccess( - "{ \"id\": \"googleId\", \"email\": \"email@example.com\", \"name\": \"User Name\" }", - MediaType.APPLICATION_JSON)); - - // when - UserGoogleAuthResponseDto userGoogleAuthResponseDto = googleAuthService.retrieveUserInfo( - accessToken); - - // then - assertThat(userGoogleAuthResponseDto).isNotNull(); - assertThat(userGoogleAuthResponseDto.googleId()).isEqualTo("googleId"); - } - - - @Test - public void 유저정보_조회_중_에러가_발생하면_예외가_던져진다() { - // given - String accessToken = "invalid-access-token"; - - this.server.expect(requestTo("https://www.googleapis.com/oauth2/v3/userinfo")) - .andRespond(withServerError()); - - // when & then - assertThrows(BusinessLogicException.class, - () -> googleAuthService.retrieveUserInfo(accessToken)); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/payment/business/repository/UserProductCategoryRepositoryTest.java b/src/test/java/app/cardcapture/payment/business/repository/UserProductCategoryRepositoryTest.java deleted file mode 100644 index 8f12f68..0000000 --- a/src/test/java/app/cardcapture/payment/business/repository/UserProductCategoryRepositoryTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package app.cardcapture.payment.business.repository; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import app.cardcapture.payment.business.domain.ProductCategory; -import app.cardcapture.payment.business.domain.entity.UserProductCategory; -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; -import app.cardcapture.user.repository.UserRepository; -import app.cardcapture.user.repository.UserRoleRepository; -import java.util.Set; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ActiveProfiles; - -@DataJpaTest -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -@EnableJpaAuditing -@ActiveProfiles("test") -public class UserProductCategoryRepositoryTest { - - @Autowired - private TestEntityManager entityManager; - - @Autowired - private UserProductCategoryRepository userProductCategoryRepository; - - @Autowired - private UserRepository userRepository; - - @ParameterizedTest - @CsvSource({ - "1, 1", - "0, 0", - }) - @Rollback(true) - public void 이용권을_정상적으로_감소시킨다(int initialQuantity, int expectedQuantity) { - // given - User user = new User(); - user.setGoogleId("1234567890"); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - - userRepository.save(user); - - UserProductCategory userProductCategory = new UserProductCategory(); - userProductCategory.setUser(user); - userProductCategory.setProductCategory(ProductCategory.AI_POSTER_PRODUCTION_TICKET); - userProductCategory.setQuantity(initialQuantity); - entityManager.persistAndFlush(userProductCategory); - - // when - userProductCategoryRepository.deductUsage(user.getId(), - ProductCategory.AI_POSTER_PRODUCTION_TICKET); - - UserProductCategory updatedCategory = entityManager.find(UserProductCategory.class, - userProductCategory.getId()); - - // then - assertAll( - () -> assertThat(updatedCategory).isNotNull(), - () -> assertThat(updatedCategory.getQuantity()).isEqualTo(expectedQuantity) - ); - } -} diff --git a/src/test/java/app/cardcapture/security/AuthenticatedControllerTest.java b/src/test/java/app/cardcapture/security/AuthenticatedControllerTest.java deleted file mode 100644 index babb23e..0000000 --- a/src/test/java/app/cardcapture/security/AuthenticatedControllerTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package app.cardcapture.security; - -import app.cardcapture.auth.jwt.service.JwtComponent; -import app.cardcapture.security.config.SecurityConfig; -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; -import java.time.LocalDateTime; -import java.util.Set; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.MockitoAnnotations; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; - -import static org.mockito.BDDMockito.given; - -@ExtendWith(MockitoExtension.class) -@Import(SecurityConfig.class) -public abstract class AuthenticatedControllerTest { - - @MockBean - protected JwtComponent jwtComponent; - - @MockBean - protected PrincipalDetails principalDetails; - - @MockBean - private PrincipalUserDetailsService principalUserDetailsService; - - protected User mockUser; // TODO: mock을 쓰는 걸 최대한 지양하고, 실제 객체를 사용하는 것이 좋다. mock 객체는 테스트를 더 복잡하게 만들 수 있기 때문이다. UserMapper랑 User랑 연관성이 있는데, 내부 toUserProfileResponseDto 같은 로직이 변경된 것을 테스트하기 어렵다. - - @BeforeEach - void initMocks() { -// MockitoAnnotations.openMocks(this); // TODO: 이 코드 없이 어노테이션으로 사용가능 찾아보기 - - mockUser = new User(); - mockUser.setId(1L); - mockUser.setEmail("test@example.com"); - mockUser.setName("Test User"); - mockUser.setPicture("http://example.com/picture.jpg"); - mockUser.setCreatedAt(LocalDateTime.now()); - - // UserRole 객체 생성 후 mockUser에 설정 - UserRole userRole = new UserRole(); - userRole.setUser(mockUser); - userRole.setRole(Role.USER); // Role.USER 역할 부여 - - mockUser.setRoles(Set.of(userRole)); - - given(principalDetails.getUser()).willReturn(mockUser); - - Authentication authentication = new UsernamePasswordAuthenticationToken( - principalDetails, null, principalDetails.getAuthorities()); - SecurityContextHolder.getContext().setAuthentication(authentication); - } - -// protected String generateJwtToken() { -// JWT 토큰 생성 -// return jwtComponent.createAccessToken(mockUser.getId(), mockUser.getRole(), TimeUtils.toDate(mockUser.getCreatedAt())); -// } -} diff --git a/src/test/java/app/cardcapture/security/EstablishedSecurityControllerTest.java b/src/test/java/app/cardcapture/security/EstablishedSecurityControllerTest.java deleted file mode 100644 index ef5695d..0000000 --- a/src/test/java/app/cardcapture/security/EstablishedSecurityControllerTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package app.cardcapture.security; - -import app.cardcapture.auth.jwt.service.JwtComponent; -import app.cardcapture.security.config.SecurityConfig; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; - -@Import(SecurityConfig.class) -//@Import(TestSecurityConfig.class) // 이건 아예 security를 바꿔버리는거라 좀 그럴듯~뺴버리자 -// *** SecurityConfig 파일자체가 안떠버린다. 그래서 이걸 import해주거나, BaseCOntrollertest에서 -// SecurityContextHolder에 Authentication 등록해줘야 하는듯. 내가 가려는 경로가 permitall이라는 정보를 못받았으니까.. / 관련 포스팅 https://seongonion.tistory.com/149 -// https://github.com/spring-projects/spring-boot/issues/31162 -public abstract class EstablishedSecurityControllerTest { - - @MockBean - protected JwtComponent jwtComponent; - - @MockBean - private PrincipalUserDetailsService principalUserDetailsService; -} diff --git a/src/test/java/app/cardcapture/security/PermitAllSecurityConfig.java b/src/test/java/app/cardcapture/security/PermitAllSecurityConfig.java deleted file mode 100644 index c8d5658..0000000 --- a/src/test/java/app/cardcapture/security/PermitAllSecurityConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package app.cardcapture.security; - -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.web.SecurityFilterChain; - -@TestConfiguration -public class PermitAllSecurityConfig { - - @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http - .csrf(csrf -> csrf.disable()) - .authorizeRequests() - .anyRequest().permitAll(); - - return http.build(); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/sticker/repository/StickerRepositoryTest.java b/src/test/java/app/cardcapture/sticker/repository/StickerRepositoryTest.java deleted file mode 100644 index 5c36bba..0000000 --- a/src/test/java/app/cardcapture/sticker/repository/StickerRepositoryTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package app.cardcapture.sticker.repository; - -import app.cardcapture.sticker.domain.entity.Sticker; -import app.cardcapture.sticker.domain.entity.StickerTag; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.annotation.Propagation; - -import java.util.stream.Stream; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -@DataJpaTest -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -@ActiveProfiles("test") -public class StickerRepositoryTest { - - @Autowired - private TestEntityManager entityManager; - - @Autowired - private StickerRepository stickerRepository; - - @Autowired - private StickerTagRepository stickerTagRepository; - - @BeforeEach - public void setUp() { - saveStickersAndTags(); - } // 영속성 컨텍스트를 안거치고 바로 DB에서 가져오는 방법 조사하고 적용하고 말씀드리기 - - @Transactional(propagation = Propagation.REQUIRES_NEW) - public void saveStickersAndTags() { - Sticker sticker1 = new Sticker(); - sticker1.setFileUrl("testUrl1"); - - Sticker sticker2 = new Sticker(); - sticker2.setFileUrl("testUrl2"); - - entityManager.persistAndFlush(sticker1); - entityManager.persistAndFlush(sticker2); - - StickerTag koreanStickerTag = new StickerTag(); - koreanStickerTag.setSticker(sticker1); - koreanStickerTag.setKorean("안녕하세요"); - koreanStickerTag.setEnglish("hello"); - - StickerTag englishStickerTag = new StickerTag(); - englishStickerTag.setSticker(sticker2); - englishStickerTag.setKorean("안녕"); - englishStickerTag.setEnglish("hi"); - - entityManager.persistAndFlush(koreanStickerTag); - entityManager.persistAndFlush(englishStickerTag); - - entityManager.clear(); - } - - @ParameterizedTest - @MethodSource("provideTagKeywords") - @Rollback(true) - @Transactional(propagation = Propagation.REQUIRES_NEW) - public void 스티커를_태그로_조회할_수_있다(String koreanKeyword, String englishKeyword, int expectedSize, String[] expectedUrls) { - // when - List result = stickerRepository.findByTag(koreanKeyword, englishKeyword); - - // then - assertAll( - () -> assertThat(result).hasSize(expectedSize), - () -> assertThat(result).extracting("fileUrl").containsExactlyInAnyOrder(expectedUrls) - ); - } - - private static Stream provideTagKeywords() { - return Stream.of( - Arguments.of("안녕", "hello", 2, new String[]{"testUrl1", "testUrl2"}), - Arguments.of("안녕하세요", "hi", 2, new String[]{"testUrl1", "testUrl2"}), - Arguments.of("안녕", "kk", 2, new String[]{"testUrl1", "testUrl2"}), - Arguments.of("안녕하세요", "hello", 1, new String[]{"testUrl1"}), - Arguments.of("헿", "kk", 0, new String[]{}), - Arguments.of("없는", "letter", 0, new String[]{}) - ); - } -} diff --git a/src/test/java/app/cardcapture/sticker/repository/StickerTagRepositoryTest.java b/src/test/java/app/cardcapture/sticker/repository/StickerTagRepositoryTest.java deleted file mode 100644 index 18fdd06..0000000 --- a/src/test/java/app/cardcapture/sticker/repository/StickerTagRepositoryTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package app.cardcapture.sticker.repository; - -import app.cardcapture.sticker.domain.entity.Sticker; -import app.cardcapture.sticker.domain.entity.StickerTag; -import jakarta.persistence.PersistenceException; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; -import org.springframework.test.annotation.Rollback; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; - -@DataJpaTest -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -@Transactional -@ActiveProfiles("test") -public class StickerTagRepositoryTest { - - @Autowired - private TestEntityManager entityManager; - - @Autowired - private StickerTagRepository stickerTagRepository; - - @Test - @Rollback(true) - public void 태그를_저장할_때_sticker_id가_없으면_예외_발생한다() { - // given - StickerTag stickerTagWithoutSticker = new StickerTag(); - stickerTagWithoutSticker.setKorean("안녕하세요"); - stickerTagWithoutSticker.setEnglish("hello"); - - // when & then - assertThrows(PersistenceException.class, () -> { - entityManager.persistAndFlush(stickerTagWithoutSticker); - }); - } - - @Test - @Rollback(true) - public void 태그를_저장할_수_있다() { - // given - Sticker sticker = new Sticker(); - sticker.setFileUrl("testUrl"); - - entityManager.persistAndFlush(sticker); - - StickerTag stickerTag = new StickerTag(); - stickerTag.setSticker(sticker); - stickerTag.setKorean("안녕하세요"); - stickerTag.setEnglish("hello"); - - // when - stickerTagRepository.save(stickerTag); - StickerTag savedStickerTag = stickerTagRepository.findById(stickerTag.getId()).orElse(null); - - // then - assertAll( - () -> assertThat(savedStickerTag).isNotNull(), - () -> assertThat(savedStickerTag.getSticker()).isEqualTo(sticker), - () -> assertThat(savedStickerTag.getKorean()).isEqualTo("안녕하세요"), - () -> assertThat(savedStickerTag.getEnglish()).isEqualTo("hello") - ); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/sticker/service/StickerServiceTest.java b/src/test/java/app/cardcapture/sticker/service/StickerServiceTest.java deleted file mode 100644 index 919e807..0000000 --- a/src/test/java/app/cardcapture/sticker/service/StickerServiceTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package app.cardcapture.sticker.service; - -import app.cardcapture.sticker.domain.entity.Sticker; -import app.cardcapture.sticker.dto.StickerResponseDto; -import app.cardcapture.sticker.dto.TagDto; -import app.cardcapture.sticker.repository.StickerRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.then; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.when; -import static org.mockito.Mockito.verify; - -public class StickerServiceTest { - - @Mock - private StickerTagService stickerTagService; - - @Mock - private StickerRepository stickerRepository; - - @InjectMocks - private StickerService stickerService; - - @BeforeEach - public void setUp() { - MockitoAnnotations.openMocks(this); - } - - @Test - public void 스티커와_태그를_저장할_수_있다() { - // given - String fileUrl = "testUrl"; - List tagDtos = Arrays.asList( - new TagDto("안녕하세요", "hello"), - new TagDto("안녕", "hi") - ); - - Sticker sticker = new Sticker(); - sticker.setFileUrl(fileUrl); - sticker.setStickerTags(new ArrayList<>()); - - Sticker savedSticker = new Sticker(); - savedSticker.setId(1L); - savedSticker.setFileUrl(fileUrl); - savedSticker.setStickerTags(new ArrayList<>()); - - // BDD given when then방식 이 위치는 when이아니라 given으로 쓰면됨 - given(stickerRepository.save(any(Sticker.class))).willReturn(savedSticker); - - // when - StickerResponseDto result = stickerService.saveStickerWithTags(fileUrl, tagDtos, "prompt"); - - // then - assertAll( - () -> assertThat(result).isNotNull(), - () -> assertThat(result.getId()).isEqualTo(savedSticker.getId()), - () -> assertThat(result.getFileUrl()).isEqualTo(savedSticker.getFileUrl()), - () -> assertThat(result.getTags()).isEqualTo(tagDtos) - ); - - // 여기도 then을쓰고 should안에 times로 몇 번 호출됐는지도 정해줄 수 있다 - then(stickerTagService).should(times(1)).saveTags(tagDtos, savedSticker); - } - - @Test - public void 태그로_스티커를_검색할_수_있다() { - // given - String searchTerm = "안녕"; - Sticker sticker1 = new Sticker(); - sticker1.setId(1L); - sticker1.setFileUrl("testUrl1"); - sticker1.setStickerTags(new ArrayList<>()); - - Sticker sticker2 = new Sticker(); - sticker2.setId(2L); - sticker2.setFileUrl("testUrl2"); - sticker2.setStickerTags(new ArrayList<>()); - - List stickers = Arrays.asList(sticker1, sticker2); - - when(stickerRepository.findByTag(searchTerm, searchTerm)) - .thenReturn(stickers); - - // when - List results = stickerService.searchStickers(searchTerm); - - // then - assertAll( - () -> assertThat(results).hasSize(2), - () -> assertThat(results.get(0).getId()).isEqualTo(sticker1.getId()), - () -> assertThat(results.get(0).getFileUrl()).isEqualTo(sticker1.getFileUrl()), - () -> assertThat(results.get(1).getId()).isEqualTo(sticker2.getId()), - () -> assertThat(results.get(1).getFileUrl()).isEqualTo(sticker2.getFileUrl()) - ); - } -} //TODO: 컨트롤러 테스트 https://velog.io/@as9587/WebMvcTest%EB%A5%BC-%EC%A0%81%EC%9A%A9%ED%95%9C-Controller-Test-Code%EC%97%90-Spring-Security-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0 diff --git a/src/test/java/app/cardcapture/template/domain/TemplateTest.java b/src/test/java/app/cardcapture/template/domain/TemplateTest.java deleted file mode 100644 index 9908741..0000000 --- a/src/test/java/app/cardcapture/template/domain/TemplateTest.java +++ /dev/null @@ -1,42 +0,0 @@ -package app.cardcapture.template.domain; - -import app.cardcapture.template.domain.entity.Prompt; -import app.cardcapture.template.domain.entity.Template; -import app.cardcapture.user.domain.entity.User; -import org.junit.jupiter.api.Test; - -import java.time.LocalDateTime; -import java.util.ArrayList; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TemplateTest { - - @Test - public void purchaseCount가_증가한다() { - // given - User user = new User(); - Prompt prompt = new Prompt(); - Template template = new Template( - 1L, - user, - "title", - "description", - 0, - 0, - "editor", - "fileUrl", - new ArrayList<>(), - prompt, - true, - LocalDateTime.now(), - LocalDateTime.now() - ); - - // when - template.increasePurchaseCount(); - - // then - assertThat(template.getPurchaseCount()).isEqualTo(1); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/template/service/TemplateSearchServiceTest.java b/src/test/java/app/cardcapture/template/service/TemplateSearchServiceTest.java deleted file mode 100644 index fd42a94..0000000 --- a/src/test/java/app/cardcapture/template/service/TemplateSearchServiceTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package app.cardcapture.template.service; - - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import app.cardcapture.common.dto.ErrorCode; -import app.cardcapture.common.exception.BusinessLogicException; -import app.cardcapture.template.domain.TemplateAttribute; -import app.cardcapture.template.domain.entity.Template; -import app.cardcapture.template.dto.TemplateUpdateRequestDto; -import app.cardcapture.template.repository.TemplateRepository; -import com.fasterxml.jackson.databind.JsonNode; -import java.time.LocalDateTime; -import java.util.List; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.opensearch.client.opensearch.OpenSearchClient; -import org.opensearch.client.opensearch.core.UpdateRequest; -import org.opensearch.client.opensearch.core.UpdateResponse; -import java.io.IOException; -import java.util.Optional; -import java.util.Set; - -@ExtendWith(MockitoExtension.class) -public class TemplateSearchServiceTest { - - @Mock - private OpenSearchClient openSearchClient; - - @Mock - private TemplateRepository templateRepository; - - @InjectMocks - private TemplateSearchService templateSearchService; - - private Template template; - private TemplateUpdateRequestDto templateUpdateRequestDto; - - @BeforeEach - public void setUp() { - template = new Template(); - template.setId(1L); - template.setTitle("Old Title"); - - templateUpdateRequestDto = new TemplateUpdateRequestDto( - 1L, - "newEditor", - "New Title", - "New Description", - "new-file-url.jpg", - List.of(), - Set.of(TemplateAttribute.TITLE, TemplateAttribute.DESCRIPTION), - LocalDateTime.now() - ); - } - - @Test - public void 템플릿_업데이트_성공() throws IOException { - // given - given(templateRepository.findById(templateUpdateRequestDto.id())).willReturn(Optional.of(template)); - UpdateResponse mockResponse = mock(UpdateResponse.class); - given(openSearchClient.update(any(UpdateRequest.class), eq(JsonNode.class))).willReturn(mockResponse); - - // when - templateSearchService.update(templateUpdateRequestDto); - - // then - verify(templateRepository, times(1)).findById(templateUpdateRequestDto.id()); - verify(openSearchClient, times(1)).update(any(UpdateRequest.class), eq(JsonNode.class)); - } - - @Test - public void 템플릿_업데이트_실패_템플릿_찾을_수_없음() throws IOException { - // given - given(templateRepository.findById(templateUpdateRequestDto.id())).willReturn(Optional.empty()); - - // when & then - BusinessLogicException exception = assertThrows(BusinessLogicException.class, () -> { - templateSearchService.update(templateUpdateRequestDto); - }); - - assertEquals(ErrorCode.NOT_FOUND, exception.getErrorCode()); - verify(openSearchClient, never()).update(any(UpdateRequest.class), eq(JsonNode.class)); - } - - @Test - public void 템플릿_업데이트_실패_OpenSearch_예외() throws IOException { - // given - when(templateRepository.findById(templateUpdateRequestDto.id())).thenReturn(Optional.of(template)); - when(openSearchClient.update(any(UpdateRequest.class), eq(JsonNode.class))).thenThrow(IOException.class); - - // when & then - BusinessLogicException exception = assertThrows(BusinessLogicException.class, () -> { - templateSearchService.update(templateUpdateRequestDto); - }); - - assertEquals(ErrorCode.SERVER_ERROR, exception.getErrorCode()); - verify(templateRepository, times(1)).findById(templateUpdateRequestDto.id()); - verify(openSearchClient, times(1)).update(any(UpdateRequest.class), eq(JsonNode.class)); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/template/service/TemplateServiceTest.java b/src/test/java/app/cardcapture/template/service/TemplateServiceTest.java deleted file mode 100644 index 6177cf0..0000000 --- a/src/test/java/app/cardcapture/template/service/TemplateServiceTest.java +++ /dev/null @@ -1,6 +0,0 @@ -package app.cardcapture.template.service; - - -public class TemplateServiceTest { - -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/template/validation/PhraseValidatorTest.java b/src/test/java/app/cardcapture/template/validation/PhraseValidatorTest.java deleted file mode 100644 index e6ac86c..0000000 --- a/src/test/java/app/cardcapture/template/validation/PhraseValidatorTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package app.cardcapture.template.validation; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import jakarta.validation.ConstraintValidatorContext; -import java.util.Arrays; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -public class PhraseValidatorTest { - - private ValidPhraseValidator validator; - private ConstraintValidatorContext context; - - @BeforeEach - public void setUp() { - validator = new ValidPhraseValidator(); - context = mock(ConstraintValidatorContext.class); - } - - @Test - public void testValidPhrase() { - // Given - List phrases = Arrays.asList("Hello", "World"); - - // When - boolean result = validator.isValid(phrases, context); - - // Then - assertThat(result).isTrue(); - } - - @Test - public void testInvalidPhrase_emptyList() { - // Given - List phrases = Arrays.asList("", ""); - - // When - boolean result = validator.isValid(phrases, context); - - // Then - assertThat(result).isFalse(); - } - - @Test - public void testInvalidPhrase_allNull() { - // Given - List phrases = Arrays.asList(null, null); - - // When - boolean result = validator.isValid(phrases, context); - - // Then - assertThat(result).isFalse(); - } - - @Test - public void testInvalidPhrase_mixedInvalidAndValid() { - // Given - List phrases = Arrays.asList("", null, "Valid Phrase"); - - // When - boolean result = validator.isValid(phrases, context); - - // Then - assertThat(result).isTrue(); - } - - @Test - public void testInvalidPhrase_empty() { - // Given - List phrases = Arrays.asList(); - - // When - boolean result = validator.isValid(phrases, context); - - // Then - assertThat(result).isFalse(); - } - - @Test - public void testInvalidPhrase_null() { - // Given - List phrases = null; - - // When - boolean result = validator.isValid(phrases, context); - - // Then - assertThat(result).isFalse(); - } -} diff --git a/src/test/java/app/cardcapture/user/controller/UserControllerTest.java b/src/test/java/app/cardcapture/user/controller/UserControllerTest.java deleted file mode 100644 index 7831e5c..0000000 --- a/src/test/java/app/cardcapture/user/controller/UserControllerTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package app.cardcapture.user.controller; - -import app.cardcapture.security.AuthenticatedControllerTest; -import app.cardcapture.user.dto.UserMapper; -import app.cardcapture.user.dto.UserProfileResponseDto; -import app.cardcapture.user.service.UserService; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import java.time.LocalDateTime; - -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@WebMvcTest(UserController.class) -public class UserControllerTest extends AuthenticatedControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private UserMapper userMapper; - -// @MockBean - private UserService userService; - - private UserProfileResponseDto userProfileResponseDto; - - @BeforeEach - void setUp() { - userProfileResponseDto = new UserProfileResponseDto( - "test@example.com", - "Test User", - "http://example.com/picture.jpg", - LocalDateTime.now() - ); - - given(userMapper.toUserProfileResponseDto(mockUser)).willReturn(userProfileResponseDto); - } // TODO: UserMapper를 mock하지 않고 이 부분 삭제 가능 - - @Test - public void getUserDetails_success() throws Exception { - // Given - - // When - ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders.get("/api/v1/user/me") - .accept(MediaType.APPLICATION_JSON) - .contentType(MediaType.APPLICATION_JSON)); - - // Then - resultActions.andExpect(status().isOk()) - .andExpect(jsonPath("$.data.email").value("test@example.com")) - .andExpect(jsonPath("$.data.name").value("Test User")) - .andExpect(jsonPath("$.data.picture").value("http://example.com/picture.jpg")) - .andExpect(jsonPath("$.data.createdAt").exists()); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/user/domain/UserRoleIdTest.java b/src/test/java/app/cardcapture/user/domain/UserRoleIdTest.java deleted file mode 100644 index 5d19b31..0000000 --- a/src/test/java/app/cardcapture/user/domain/UserRoleIdTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package app.cardcapture.user.domain; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class UserRoleIdTest { - - @Test - public void 동일한_유저와_역할을_가진_UserRoleId_객체는_같아야_한다() { - // given - UserRoleId id1 = new UserRoleId(1L, Role.USER); - UserRoleId id2 = new UserRoleId(1L, Role.USER); - - // when & then - assertThat(id1).isEqualTo(id2); - assertThat(id1.hashCode()).isEqualTo(id2.hashCode()); - } - - @Test - public void 다른_유저를_가진_UserRoleId_객체는_같지_않아야_한다() { - // given - UserRoleId id1 = new UserRoleId(1L, Role.USER); - UserRoleId id2 = new UserRoleId(2L, Role.USER); - - // when & then - assertThat(id1).isNotEqualTo(id2); - } - - @Test - public void 다른_역할을_가진_UserRoleId_객체는_같지_않아야_한다() { - // given - UserRoleId id1 = new UserRoleId(1L, Role.USER); - UserRoleId id2 = new UserRoleId(1L, Role.ADMIN); - - // when & then - assertThat(id1).isNotEqualTo(id2); - } - - @Test - public void null과_비교시_false를_반환해야한다() { - // given - UserRoleId id1 = new UserRoleId(1L, Role.USER); - - // when & then - assertThat(id1.equals(null)).isFalse(); - } - - @Test - public void 자기_자신과는_동일해야한다() { - // given - UserRoleId id1 = new UserRoleId(1L, Role.USER); - - // when & then - assertThat(id1).isEqualTo(id1); - } - - @Test - public void 동일한_유저와_역할을_가진_UserRoleId_객체는_같은_hashCode를_가져야_한다() { - // given - UserRoleId id1 = new UserRoleId(1L, Role.USER); - UserRoleId id2 = new UserRoleId(1L, Role.USER); - - // when & then - assertThat(id1.hashCode()).isEqualTo(id2.hashCode()); - } -} diff --git a/src/test/java/app/cardcapture/user/dto/UserMapperTest.java b/src/test/java/app/cardcapture/user/dto/UserMapperTest.java deleted file mode 100644 index f418941..0000000 --- a/src/test/java/app/cardcapture/user/dto/UserMapperTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package app.cardcapture.user.dto; - -import app.cardcapture.user.domain.entity.User; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.time.LocalDateTime; - -import static org.assertj.core.api.Assertions.assertThat; - -public class UserMapperTest { - - private UserMapper userMapper; - - @BeforeEach - public void setUp() { - userMapper = new UserMapper(); - } - - @Test - public void 유저를_UserGoogleAuthResponseDto로_매핑할_수_있다() { // TODO: 이정도는 컨트롤러 테스트에 포함됨 안해도 괜츈 - // given - User user = new User(); - user.setGoogleId("1234578910987654321"); - user.setEmail("inpink@cardcapture.app"); - user.setVerifiedEmail(true); - user.setName("Veronica"); - user.setGivenName("Veronica"); - user.setFamilyName("Y"); - user.setPicture("http://example.com/picture"); - user.setCreatedAt(LocalDateTime.now()); - user.setUpdatedAt(LocalDateTime.now()); - - // when - UserGoogleAuthResponseDto dto = userMapper.toUserResponseDto(user); - - // then - assertThat(dto).isNotNull(); - assertThat(dto.googleId()).isEqualTo(user.getGoogleId()); - assertThat(dto.email()).isEqualTo(user.getEmail()); - assertThat(dto.verifiedEmail()).isEqualTo(user.isVerifiedEmail()); - assertThat(dto.name()).isEqualTo(user.getName()); - assertThat(dto.givenName()).isEqualTo(user.getGivenName()); - assertThat(dto.familyName()).isEqualTo(user.getFamilyName()); - assertThat(dto.picture()).isEqualTo(user.getPicture()); - assertThat(dto.createdAt()).isEqualTo(user.getCreatedAt()); - assertThat(dto.updatedAt()).isEqualTo(user.getUpdatedAt()); - } - - @Test - public void 유저를_UserProfileResponseDto로_매핑할_수_있다() { - // given - User user = new User(); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - user.setPicture("http://example.com/picture"); - user.setCreatedAt(LocalDateTime.now()); - - // when - UserProfileResponseDto dto = userMapper.toUserProfileResponseDto(user); - - // then - assertThat(dto).isNotNull(); - assertThat(dto.email()).isEqualTo(user.getEmail()); - assertThat(dto.name()).isEqualTo(user.getName()); - assertThat(dto.picture()).isEqualTo(user.getPicture()); - assertThat(dto.createdAt()).isEqualTo(user.getCreatedAt()); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/user/repository/UserRepositoryTest.java b/src/test/java/app/cardcapture/user/repository/UserRepositoryTest.java deleted file mode 100644 index 7a91563..0000000 --- a/src/test/java/app/cardcapture/user/repository/UserRepositoryTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package app.cardcapture.user.repository; - -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Optional; -import java.util.Set; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -@DataJpaTest -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -@EnableJpaAuditing -public class UserRepositoryTest { - - @Autowired - private UserRepository userRepository; - - @Autowired - private UserRoleRepository userRoleRepository; - - @Test - public void 유저id로_개인_정보와_역할을_조회할_수_있다() { - // given - User user = new User(); - user.setGoogleId("1234567890"); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - - UserRole userRole = new UserRole(); - userRole.setUser(user); - userRole.setRole(Role.USER); - - user.setRoles(Set.of(userRole)); - - userRepository.save(user); - userRoleRepository.save(userRole); - - // when - Optional result = userRepository.findUserAndUserRolesByUserId(user.getId()); - - // then - assertAll( - () -> assertThat(result).isPresent(), - () -> assertThat(result.get().getEmail()).isEqualTo(user.getEmail()), - () -> assertThat(result.get().getRoles()).hasSize(1), - () -> assertThat(result.get().getRoles().iterator().next().getRole()).isEqualTo(Role.USER) - ); - } - - @Test - public void 구글아이디로_유저를_조회할_수_있다() { - // given - User user = new User(); - user.setGoogleId("1234567890"); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - - userRepository.save(user); - - // when - Optional result = userRepository.findByGoogleId(user.getGoogleId()); - - // then - assertAll( - () -> assertThat(result).isPresent(), - () -> assertThat(result.get().getEmail()).isEqualTo(user.getEmail()) - ); - } - - @Test - public void 구글아이디로_유저가_존재하는지_확인할_수_있다() { - // given - User user = new User(); - user.setGoogleId("1234567890"); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - - userRepository.save(user); - - // when - boolean exists = userRepository.existsByGoogleId(user.getGoogleId()); - - // then - assertThat(exists).isTrue(); - } -} \ No newline at end of file diff --git a/src/test/java/app/cardcapture/user/repository/UserRoleRepositoryTest.java b/src/test/java/app/cardcapture/user/repository/UserRoleRepositoryTest.java deleted file mode 100644 index 32cd2be..0000000 --- a/src/test/java/app/cardcapture/user/repository/UserRoleRepositoryTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package app.cardcapture.user.repository; - - -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; - -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; - -@DataJpaTest -@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) -@EnableJpaAuditing -public class UserRoleRepositoryTest { - - @Autowired - private UserRoleRepository userRoleRepository; - - @Autowired - private UserRepository userRepository; - - @Test - public void findByUserAndRole_유저와_역할로_조회시_정확한_결과를_반환한다() { - // given - User user = new User(); - user.setGoogleId("1234578910987654321"); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - userRepository.save(user); - - UserRole userRole = new UserRole(user, Role.USER, null, null); - userRoleRepository.save(userRole); - - // when - Optional result = userRoleRepository.findByUserAndRole(user, Role.USER); - - // then - assertThat(result).isPresent(); - assertThat(result.get().getUser()).isEqualTo(user); - assertThat(result.get().getRole()).isEqualTo(Role.USER); - } - - @Test - public void findByUserAndRole_유저와_역할이_존재하지_않을_경우_빈값을_반환한다() { - // given - User user = new User(); - user.setGoogleId("1234578910987654321"); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - userRepository.save(user); - - // when - Optional result = userRoleRepository.findByUserAndRole(user, Role.ADMIN); - - // then - assertThat(result).isEmpty(); - } -} diff --git a/src/test/java/app/cardcapture/user/service/UserServiceIT.java b/src/test/java/app/cardcapture/user/service/UserServiceIT.java deleted file mode 100644 index 4c90557..0000000 --- a/src/test/java/app/cardcapture/user/service/UserServiceIT.java +++ /dev/null @@ -1,130 +0,0 @@ -package app.cardcapture.user.service; - -import app.cardcapture.common.dto.ErrorCode; -import app.cardcapture.common.exception.BusinessLogicException; -import app.cardcapture.payment.common.service.PaymentCommonService; -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; -import app.cardcapture.user.repository.UserRepository; -import java.util.Set; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicInteger; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.dao.DataIntegrityViolationException; -import org.springframework.jdbc.core.JdbcTemplate; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doThrow; - -@SpringBootTest -public class UserServiceIT { - - @Autowired - private UserRepository userRepository; - - @MockBean - private PaymentCommonService paymentCommonService; - - @Autowired - private UserService userService; - - @Autowired - private JdbcTemplate jdbcTemplate; - - @Test - @DisplayName("assignSignupReward에서 예외 발생 시 트랜잭션 롤백 확인") - public void testSaveUserRollbackOnException() { - // given - User user = new User(); - user.setGoogleId("1234567890"); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - - UserRole userRole = new UserRole(); - userRole.setUser(user); - userRole.setRole(Role.USER); - - user.setRoles(Set.of(userRole)); - - doThrow(new RuntimeException("Intentional RuntimeException")) - .when(paymentCommonService) - .saveUserProductCategory(any(), anyInt(), eq(user)); - - // when && then - assertThrows(RuntimeException.class, () -> userService.save(user)); - assertThat(userRepository.findByGoogleId("1234567890")).isEmpty(); - } - - @Test - @DisplayName("동시성 테스트: 중복된 유저를 동시에 저장 시도할 경우, 하나만 성공하고 나머지는 예외 발생") // TODO: - void testConcurrentUserSave() throws InterruptedException { - // given - // 쓰레드 개수 - int numThreads = 10; - ExecutorService executorService = Executors.newFixedThreadPool(numThreads); - CountDownLatch latch = new CountDownLatch(numThreads); - - AtomicInteger successCount = new AtomicInteger(0); - AtomicInteger failCount = new AtomicInteger(0); - - // when - // 동시성 테스트 실행 - for (int i = 0; i < numThreads; i++) { - executorService.execute(() -> { - try { - User user = new User(); - user.setGoogleId("1234567890"); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - - UserRole userRole = new UserRole(); - userRole.setUser(user); - userRole.setRole(Role.USER); - - user.setRoles(Set.of(userRole)); - - userService.save(user); // 동시에 user 저장 시도 - successCount.incrementAndGet(); // 성공한 경우 - } catch (BusinessLogicException e) { - if (e.getErrorCode() == ErrorCode.DUPLICATED_USER) { - failCount.incrementAndGet(); // 중복 예외 발생한 경우 - } - } catch (DataIntegrityViolationException e) { - failCount.incrementAndGet(); // 중복 예외 발생한 경우 - } finally { - latch.countDown(); // 쓰레드 작업 완료 시 latch 감소 - } - }); - } - - latch.await(); // 모든 쓰레드가 끝날 때까지 대기 - executorService.shutdown(); - - // then - // 테스트 검증 - assertAll( - () -> assertThat(successCount.get()).isEqualTo(1), - () -> assertThat(failCount.get()).isEqualTo(numThreads - 1)); - - // 테스트 후 데이터 삭제 - cleanUpTestData(); - } - - private void cleanUpTestData() { - jdbcTemplate.execute( - "DELETE FROM user_roles WHERE user_id IN (SELECT id FROM users WHERE google_id = '1234567890')"); - jdbcTemplate.execute("DELETE FROM users WHERE google_id = '1234567890'"); - } -} diff --git a/src/test/java/app/cardcapture/user/service/UserServiceTest.java b/src/test/java/app/cardcapture/user/service/UserServiceTest.java deleted file mode 100644 index fd7ee83..0000000 --- a/src/test/java/app/cardcapture/user/service/UserServiceTest.java +++ /dev/null @@ -1,213 +0,0 @@ -package app.cardcapture.user.service; - -import app.cardcapture.common.dto.ErrorCode; -import app.cardcapture.common.exception.BusinessLogicException; -import app.cardcapture.payment.business.domain.NewUserProductCategory; -import app.cardcapture.payment.business.domain.entity.UserProductCategory; -import app.cardcapture.payment.business.repository.UserProductCategoryRepository; -import app.cardcapture.payment.common.service.PaymentCommonService; -import app.cardcapture.user.domain.Role; -import app.cardcapture.user.domain.entity.User; -import app.cardcapture.user.domain.entity.UserRole; -import app.cardcapture.user.repository.UserRepository; -import app.cardcapture.user.repository.UserRoleRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.List; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.*; - -public class UserServiceTest { - - @Mock - private PaymentCommonService paymentCommonService; - - @Mock - private UserProductCategoryRepository userProductCategoryRepository; - - @Mock - private UserRepository userRepository; - - @Mock - private UserRoleRepository userRoleRepository; - - @InjectMocks - private UserService userService; - - @BeforeEach - public void setUp() { - MockitoAnnotations.openMocks(this); - } - - @Test - public void 유저id로_개인_정보를_조회할_수_있다() { - // given - User user = new User(); - user.setId(1L); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - - given(userRepository.findById(1L)).willReturn(Optional.of(user)); - - // when - User result = userService.findUserById(1L); - - // then - assertAll( - () -> assertThat(result).isNotNull(), - () -> assertThat(result.getEmail()).isEqualTo(user.getEmail()), - () -> assertThat(result.getName()).isEqualTo(user.getName()) - ); - } - - @Test - public void 유저id로_개인_정보를_조회할_수_없으면_예외가_발생한다() { - // given - long invalidUserId = 1234567890L; - - given(userRepository.findById(invalidUserId)).willReturn(Optional.empty()); - - // when & then - assertThrows(BusinessLogicException.class, () -> userService.findUserById(invalidUserId)); - } - - @Test - public void 유저를_생성할_수_있다() { - // given - User user = new User(); - user.setId(1L); - user.setEmail("inpink@cardcapture.app"); - user.setName("Veronica"); - - NewUserProductCategory newUserProductCategory = NewUserProductCategory.FREE_AI_POSTER_PRODUCTION_TICKET; - - given(userRepository.save(user)).willReturn(user); - doNothing().when(paymentCommonService).saveUserProductCategory( - newUserProductCategory.getProductCategory(), - newUserProductCategory.getCount(), - user - ); - - // when - User result = userService.save(user); - - // then - assertThat(result).isEqualTo(user); - verify(userRepository).save(user); - verify(paymentCommonService).saveUserProductCategory( - newUserProductCategory.getProductCategory(), - newUserProductCategory.getCount(), - user - ); - } - - @Test - public void 중복된_유저_저장시_DUPLICATED_USER_예외가_발생한다() { - // given - User existingUser = new User(); - existingUser.setGoogleId("existingGoogleId"); - - User newUser = new User(); - newUser.setGoogleId("existingGoogleId"); - - given(userRepository.findByGoogleId("existingGoogleId")) - .willReturn(Optional.of(existingUser)); - - // when & then - BusinessLogicException exception = assertThrows( - BusinessLogicException.class, - () -> userService.save(newUser) - ); - - assertThat(exception.getErrorCode()).isEqualTo(ErrorCode.DUPLICATED_USER); - } - - @Test - public void 중복된_유저_역할_저장시_DUPLICATED_USER_예외가_발생한다() { - // given - User user = new User(); - user.setGoogleId("newGoogleId"); - - UserRole existingUserRole = new UserRole(); - existingUserRole.setUser(user); - existingUserRole.setRole(Role.USER); - - given(userRoleRepository.findByUserAndRole(user, Role.USER)) - .willReturn(Optional.of(existingUserRole)); - - // when & then - BusinessLogicException exception = assertThrows( - BusinessLogicException.class, - () -> userService.save(user) - ); - - assertThat(exception.getErrorCode()).isEqualTo(ErrorCode.DUPLICATED_USER); - } - - @Test - public void googleId로_유저가_존재하는지_확인할_수_있다() { - // given - String googleId = "test-google-id"; - given(userRepository.existsByGoogleId(googleId)).willReturn(true); - - // when - boolean result = userService.existsByGoogleId(googleId); - - // then - assertThat(result).isTrue(); - } - - @Test - public void googleId로_유저_정보를_조회할_수_있다() { - // given - String googleId = "test-google-id"; - User user = new User(); - user.setGoogleId(googleId); - user.setEmail("inpink@cardcapture.app"); - - given(userRepository.findByGoogleId(googleId)).willReturn(Optional.of(user)); - - // when - User result = userService.findByGoogleId(googleId); - - // then - assertThat(result).isNotNull(); - assertThat(result.getGoogleId()).isEqualTo(googleId); - } - - @Test - public void googleId로_유저_정보를_조회할_수_없으면_예외가_발생한다() { - // given - String googleId = "invalid-google-id"; - given(userRepository.findByGoogleId(googleId)).willReturn(Optional.empty()); - - // when & then - assertThrows(BusinessLogicException.class, () -> userService.findByGoogleId(googleId)); - } - - @Test - public void 유저의_상품_카테고리를_조회할_수_있다() { - // given - User user = new User(); - user.setId(1L); - List categories = List.of(new UserProductCategory()); - - given(userProductCategoryRepository.findByUser(user)).willReturn(categories); - - // when - List result = userService.getUserProductCategories(user); - - // then - assertThat(result).isEqualTo(categories); - } - -} \ No newline at end of file