From e812dc909280bab65c7e2c0b0e0121afa1b38b17 Mon Sep 17 00:00:00 2001 From: thguss Date: Fri, 21 Jun 2024 22:16:47 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[CHORE]=20checkStyle=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/{CI.yml => ci.yml} | 24 +- build.gradle | 17 + checkstyle/naver-checkstyle-rules.xml | 433 ++++++++++++++++++ checkstyle/naver-checkstyle-suppressions.xml | 7 + .../server/auth/controller/AuthApi.java | 197 ++++---- .../auth/controller/AuthController.java | 86 ++-- .../controller/dto/request/SignInRequest.java | 8 +- .../dto/response/SignInResponse.java | 25 +- .../dto/response/TokenGetResponse.java | 17 +- .../CustomJwtAuthenticationEntryPoint.java | 54 +-- .../auth/jwt/JwtAuthenticationFilter.java | 89 ++-- .../server/auth/jwt/JwtTokenProvider.java | 125 ++--- .../server/auth/jwt/JwtValidationType.java | 10 +- .../server/auth/jwt/UserAuthentication.java | 18 +- .../soptie/server/auth/message/ErrorCode.java | 3 +- .../server/auth/message/SuccessMessage.java | 11 +- .../server/auth/service/AppleService.java | 2 +- .../server/auth/service/AppleServiceImpl.java | 254 +++++----- .../server/auth/service/AuthService.java | 11 +- .../server/auth/service/AuthServiceImpl.java | 237 +++++----- .../server/auth/service/KakaoService.java | 2 +- .../server/auth/service/KakaoServiceImpl.java | 46 +- .../dto/request/SignInServiceRequest.java | 21 +- .../dto/request/TokenGetServiceRequest.java | 16 +- .../dto/response/SignInServiceResponse.java | 25 +- .../dto/response/TokenGetServiceResponse.java | 16 +- .../java/com/soptie/server/auth/vo/Token.java | 52 ++- .../common/config/RestTemplateConfig.java | 8 +- .../server/common/config/SecurityConfig.java | 98 ++-- .../server/common/config/SwaggerConfig.java | 8 +- .../server/common/config/ValueConfig.java | 92 ++-- .../server/common/dto/BaseResponse.java | 4 +- .../server/common/dto/ErrorResponse.java | 11 +- .../server/common/dto/SuccessResponse.java | 27 +- .../server/common/handler/ErrorHandler.java | 6 +- .../server/common/support/UriGenerator.java | 18 +- .../adapter/ConversationFinder.java | 13 +- .../conversation/entity/Conversation.java | 20 +- .../repository/ConversationRepository.java | 3 +- .../server/doll/adapter/DollFinder.java | 15 +- .../server/doll/controller/DollApi.java | 52 +-- .../doll/controller/DollController.java | 3 +- .../soptie/server/doll/entity/DollImage.java | 5 +- .../soptie/server/doll/message/ErrorCode.java | 3 +- .../server/doll/message/SuccessMessage.java | 3 +- .../server/doll/service/DollServiceImpl.java | 3 +- .../server/member/adapter/MemberDeleter.java | 9 +- .../member/adapter/MemberDollSaver.java | 18 + .../adapter/MemberRoutineDeleter.java | 10 +- .../adapter/MemberRoutineFinder.java | 12 +- .../adapter/MemberRoutineSaver.java | 24 +- .../server/member/controller/MemberApi.java | 146 ------ .../member/controller/MemberController.java | 70 --- .../request/MemberProfileCreateRequest.java | 13 - .../MemberCottonCountGetResponse.java | 18 - .../response/MemberHomeInfoGetResponse.java | 32 -- .../controller/v1/MemberController.java | 68 +++ .../v1/MemberDailyRoutineController.java | 56 +-- .../v1/MemberHappinessRoutineController.java | 87 ++++ .../member/controller/v1/docs/MemberApi.java | 127 +++++ .../v1/docs/MemberDailyRoutineApi.java | 133 ++++++ .../v1/docs/MemberHappinessRoutineApi.java | 139 ++++++ .../MemberDailyRoutineCreateRequest.java | 2 +- .../MemberHappinessRoutineRequest.java | 6 + .../request/MemberProfileCreateRequest.java | 14 + .../MemberCottonCountGetResponse.java | 19 + .../MemberDailyRoutineAchieveResponse.java | 12 +- .../MemberDailyRoutineCreateResponse.java | 8 +- .../MemberDailyRoutineListGetResponse.java | 10 +- .../MemberHappinessRoutineCreateResponse.java | 19 + .../MemberHappinessRoutineGetResponse.java | 38 ++ .../response/MemberHomeInfoGetResponse.java | 33 ++ .../soptie/server/member/entity/Cotton.java | 7 +- .../server/member/entity/CottonType.java | 4 +- .../entity/DeletedMemberRoutine.java | 3 +- .../soptie/server/member/entity/Member.java | 26 +- .../entity/MemberDoll.java | 13 +- .../entity/MemberRoutine.java | 9 +- .../member/exception/MemberDollException.java | 16 + .../server/member/message/ErrorCode.java | 3 +- .../message/MemberRoutineSuccessMassage.java} | 7 +- .../member/message/MemberSuccessMessage.java | 15 + .../server/member/message/SuccessMessage.java | 16 - .../DeletedMemberRoutineRepository.java | 6 +- .../repository/MemberDollRepository.java | 5 +- .../member/repository/MemberRepository.java | 12 +- .../MemberRoutineCustomRepository.java | 7 +- .../repository/MemberRoutineRepository.java | 8 +- .../MemberRoutineRepositoryImpl.java | 65 +++ .../dto/MemberChallengeResponse.java | 30 ++ .../repository/dto/MemberRoutineResponse.java | 27 ++ .../MemberDailyRoutineScheduler.java | 4 +- .../server/member/service/MemberService.java | 15 +- .../member/service/MemberServiceImpl.java | 124 +++-- .../service/doll/MemberDollService.java | 12 + .../service/doll/MemberDollServiceImpl.java | 45 ++ .../dto/request/CottonGiveServiceRequest.java | 21 +- .../MemberHomeInfoGetServiceRequest.java | 16 +- .../MemberProfileCreateServiceRequest.java | 32 +- .../MemberRoutineAchieveServiceRequest.java | 12 +- .../MemberRoutineDeleteServiceRequest.java | 12 +- .../MemberRoutinesDeleteServiceRequest.java | 12 +- ...emberDailyRoutineCreateServiceRequest.java | 14 +- ...mberDailyRoutineListGetServiceRequest.java | 8 +- ...rHappinessRoutineCreateServiceRequest.java | 21 + ...mberHappinessRoutineGetServiceRequest.java | 8 +- .../MemberCottonCountGetServiceResponse.java | 16 +- .../MemberHomeInfoGetServiceResponse.java | 41 +- .../MemberRoutineAchieveServiceResponse.java | 23 + ...mberDailyRoutineCreateServiceResponse.java | 10 +- ...berDailyRoutineListGetServiceResponse.java | 8 +- ...HappinessRoutineCreateServiceResponse.java | 19 + ...berHappinessRoutineGetServiceResponse.java | 50 ++ .../routine}/MemberRoutineCreateService.java | 18 +- .../routine}/MemberRoutineDeleteService.java | 18 +- .../routine}/MemberRoutineReadService.java | 14 +- .../routine}/MemberRoutineUpdateService.java | 12 +- .../memberDoll/adapter/MemberDollSaver.java | 17 - .../exception/MemberDollException.java | 15 - .../memberDoll/service/MemberDollService.java | 11 - .../service/MemberDollServiceImpl.java | 43 -- .../v1/MemberHappinessRoutineController.java | 80 ---- .../v1/api/MemberDailyRoutineApi.java | 150 ------ .../v1/api/MemberHappinessRoutineApi.java | 156 ------- .../MemberHappinessRoutineRequest.java | 6 - .../MemberHappinessRoutineCreateResponse.java | 19 - .../MemberHappinessRoutineGetResponse.java | 38 -- .../MemberRoutineRepositoryImpl.java | 65 --- .../dto/MemberChallengeResponse.java | 30 -- .../repository/dto/MemberRoutineResponse.java | 27 -- ...rHappinessRoutineCreateServiceRequest.java | 21 - ...HappinessRoutineCreateServiceResponse.java | 19 - ...berHappinessRoutineGetServiceResponse.java | 50 -- .../MemberRoutineAchieveServiceResponse.java | 23 - .../routine/adapter/ChallengeFinder.java | 4 +- .../v1/DailyRoutineControllerV1.java | 13 +- .../v1/HappinessRoutineControllerV1.java | 53 ++- .../controller/v1/api/DailyRoutineApiV1.java | 80 ++-- .../v1/api/HappinessRoutineApiV1.java | 102 ++--- .../HappinessRoutineListGetResponse.java | 57 ++- .../HappinessSubRoutineListGetResponse.java | 70 ++- .../server/routine/entity/RoutineType.java | 3 +- .../routine/message/RoutineErrorCode.java | 3 +- .../message/RoutineSuccessMessage.java | 3 +- .../repository/ChallengeRepository.java | 2 +- .../repository/RoutineCustomRepository.java | 2 + .../repository/RoutineRepositoryImpl.java | 58 +-- .../routine/service/RoutineService.java | 6 +- ...appinessRoutineListGetServiceResponse.java | 59 ++- ...inessSubRoutineListGetServiceResponse.java | 78 ++-- .../java/com/soptie/server/test/TestApi.java | 26 +- .../v1/HappinessThemeControllerV1.java | 12 +- .../controller/v1/api/DailyThemeApiV1.java | 27 +- .../v1/api/HappinessThemeApiV1.java | 24 +- .../HappinessThemeListGetResponse.java | 44 +- .../server/theme/controller/v2/ThemeApi.java | 27 +- .../response/ThemeListAcquireResponse.java | 31 +- .../server/theme/entity/ThemeImageInfo.java | 5 +- .../server/theme/message/ThemeErrorCode.java | 3 +- .../theme/message/ThemeSuccessMessage.java | 3 +- .../repository/ThemeCustomRepository.java | 1 + .../server/version/controller/VersionApi.java | 18 +- .../version/message/SuccessMessage.java | 3 +- .../version/service/VersionServiceImpl.java | 14 +- .../AppVersionGetServiceResponse.java | 42 +- .../auth/service/AuthServiceImplTest.java | 131 +++--- .../doll/service/DollServiceImplTest.java | 61 +-- .../service/MemberDollServiceImplTest.java | 55 +++ .../service/MemberRoutineServiceTest.java | 54 +-- .../member/service/MemberServiceImplTest.java | 241 +++++----- .../MemberRoutineServiceIntegrationTest.java | 275 ++++++----- .../MemberServiceIntegrationTest.java | 146 +++--- .../service/MemberDollServiceImplTest.java | 53 --- .../RoutineServiceIntegrationTest.java | 96 ++-- .../support/fixture/ChallengeFixture.java | 2 +- .../support/fixture/ConversationFixture.java | 36 +- .../server/support/fixture/DollFixture.java | 58 +-- .../support/fixture/MemberDollFixture.java | 72 +-- .../server/support/fixture/MemberFixture.java | 2 +- .../support/fixture/MemberRoutineFixture.java | 2 +- .../server/support/fixture/ThemeFixture.java | 5 +- .../theme/repository/ThemeRepositoryTest.java | 8 +- .../theme/service/ThemeServiceTest.java | 8 +- .../ThemeServiceIntegrationTest.java | 14 +- 184 files changed, 3797 insertions(+), 3350 deletions(-) rename .github/workflows/{CI.yml => ci.yml} (57%) create mode 100644 checkstyle/naver-checkstyle-rules.xml create mode 100644 checkstyle/naver-checkstyle-suppressions.xml create mode 100644 src/main/java/com/soptie/server/member/adapter/MemberDollSaver.java rename src/main/java/com/soptie/server/{memberRoutine => member}/adapter/MemberRoutineDeleter.java (69%) rename src/main/java/com/soptie/server/{memberRoutine => member}/adapter/MemberRoutineFinder.java (77%) rename src/main/java/com/soptie/server/{memberRoutine => member}/adapter/MemberRoutineSaver.java (68%) delete mode 100644 src/main/java/com/soptie/server/member/controller/MemberApi.java delete mode 100644 src/main/java/com/soptie/server/member/controller/MemberController.java delete mode 100644 src/main/java/com/soptie/server/member/controller/dto/request/MemberProfileCreateRequest.java delete mode 100644 src/main/java/com/soptie/server/member/controller/dto/response/MemberCottonCountGetResponse.java delete mode 100644 src/main/java/com/soptie/server/member/controller/dto/response/MemberHomeInfoGetResponse.java create mode 100644 src/main/java/com/soptie/server/member/controller/v1/MemberController.java rename src/main/java/com/soptie/server/{memberRoutine => member}/controller/v1/MemberDailyRoutineController.java (57%) create mode 100644 src/main/java/com/soptie/server/member/controller/v1/MemberHappinessRoutineController.java create mode 100644 src/main/java/com/soptie/server/member/controller/v1/docs/MemberApi.java create mode 100644 src/main/java/com/soptie/server/member/controller/v1/docs/MemberDailyRoutineApi.java create mode 100644 src/main/java/com/soptie/server/member/controller/v1/docs/MemberHappinessRoutineApi.java rename src/main/java/com/soptie/server/{memberRoutine => member}/controller/v1/dto/request/MemberDailyRoutineCreateRequest.java (51%) create mode 100644 src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberHappinessRoutineRequest.java create mode 100644 src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberProfileCreateRequest.java create mode 100644 src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberCottonCountGetResponse.java rename src/main/java/com/soptie/server/{memberRoutine => member}/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java (54%) rename src/main/java/com/soptie/server/{memberRoutine => member}/controller/v1/dto/response/MemberDailyRoutineCreateResponse.java (59%) rename src/main/java/com/soptie/server/{memberRoutine => member}/controller/v1/dto/response/MemberDailyRoutineListGetResponse.java (69%) create mode 100644 src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHappinessRoutineCreateResponse.java create mode 100644 src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHappinessRoutineGetResponse.java create mode 100644 src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHomeInfoGetResponse.java rename src/main/java/com/soptie/server/{memberRoutine => member}/entity/DeletedMemberRoutine.java (94%) rename src/main/java/com/soptie/server/{memberDoll => member}/entity/MemberDoll.java (90%) rename src/main/java/com/soptie/server/{memberRoutine => member}/entity/MemberRoutine.java (93%) create mode 100644 src/main/java/com/soptie/server/member/exception/MemberDollException.java rename src/main/java/com/soptie/server/{memberRoutine/message/SuccessMessage.java => member/message/MemberRoutineSuccessMassage.java} (68%) create mode 100644 src/main/java/com/soptie/server/member/message/MemberSuccessMessage.java delete mode 100644 src/main/java/com/soptie/server/member/message/SuccessMessage.java rename src/main/java/com/soptie/server/{memberRoutine => member}/repository/DeletedMemberRoutineRepository.java (81%) rename src/main/java/com/soptie/server/{memberDoll => member}/repository/MemberDollRepository.java (58%) rename src/main/java/com/soptie/server/{memberRoutine => member}/repository/MemberRoutineCustomRepository.java (63%) rename src/main/java/com/soptie/server/{memberRoutine => member}/repository/MemberRoutineRepository.java (86%) create mode 100644 src/main/java/com/soptie/server/member/repository/MemberRoutineRepositoryImpl.java create mode 100644 src/main/java/com/soptie/server/member/repository/dto/MemberChallengeResponse.java create mode 100644 src/main/java/com/soptie/server/member/repository/dto/MemberRoutineResponse.java rename src/main/java/com/soptie/server/{memberRoutine => member}/scheduler/MemberDailyRoutineScheduler.java (80%) create mode 100644 src/main/java/com/soptie/server/member/service/doll/MemberDollService.java create mode 100644 src/main/java/com/soptie/server/member/service/doll/MemberDollServiceImpl.java rename src/main/java/com/soptie/server/{memberRoutine/service/dto/request => member/service/dto/request/routine}/MemberRoutineAchieveServiceRequest.java (62%) rename src/main/java/com/soptie/server/{memberRoutine/service/dto/request => member/service/dto/request/routine}/MemberRoutineDeleteServiceRequest.java (64%) rename src/main/java/com/soptie/server/{memberRoutine/service/dto/request => member/service/dto/request/routine}/MemberRoutinesDeleteServiceRequest.java (65%) rename src/main/java/com/soptie/server/{memberRoutine/service/dto/request => member/service/dto/request/routine/daily}/MemberDailyRoutineCreateServiceRequest.java (55%) rename src/main/java/com/soptie/server/{memberRoutine/service/dto/request => member/service/dto/request/routine/daily}/MemberDailyRoutineListGetServiceRequest.java (70%) create mode 100644 src/main/java/com/soptie/server/member/service/dto/request/routine/happiness/MemberHappinessRoutineCreateServiceRequest.java rename src/main/java/com/soptie/server/{memberRoutine/service/dto/request => member/service/dto/request/routine/happiness}/MemberHappinessRoutineGetServiceRequest.java (70%) create mode 100644 src/main/java/com/soptie/server/member/service/dto/response/routine/MemberRoutineAchieveServiceResponse.java rename src/main/java/com/soptie/server/{memberRoutine/service/dto/response => member/service/dto/response/routine/daily}/MemberDailyRoutineCreateServiceResponse.java (61%) rename src/main/java/com/soptie/server/{memberRoutine/service/dto/response => member/service/dto/response/routine/daily}/MemberDailyRoutineListGetServiceResponse.java (80%) create mode 100644 src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineCreateServiceResponse.java create mode 100644 src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineGetServiceResponse.java rename src/main/java/com/soptie/server/{memberRoutine/service => member/service/routine}/MemberRoutineCreateService.java (76%) rename src/main/java/com/soptie/server/{memberRoutine/service => member/service/routine}/MemberRoutineDeleteService.java (69%) rename src/main/java/com/soptie/server/{memberRoutine/service => member/service/routine}/MemberRoutineReadService.java (64%) rename src/main/java/com/soptie/server/{memberRoutine/service => member/service/routine}/MemberRoutineUpdateService.java (75%) delete mode 100644 src/main/java/com/soptie/server/memberDoll/adapter/MemberDollSaver.java delete mode 100644 src/main/java/com/soptie/server/memberDoll/exception/MemberDollException.java delete mode 100644 src/main/java/com/soptie/server/memberDoll/service/MemberDollService.java delete mode 100644 src/main/java/com/soptie/server/memberDoll/service/MemberDollServiceImpl.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberHappinessRoutineController.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberDailyRoutineApi.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberHappinessRoutineApi.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/request/MemberHappinessRoutineRequest.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberHappinessRoutineCreateResponse.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberHappinessRoutineGetResponse.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineRepositoryImpl.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberChallengeResponse.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberRoutineResponse.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberHappinessRoutineCreateServiceRequest.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineCreateServiceResponse.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineGetServiceResponse.java delete mode 100644 src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberRoutineAchieveServiceResponse.java create mode 100644 src/test/java/com/soptie/server/member/service/MemberDollServiceImplTest.java rename src/test/java/com/soptie/server/{memberRoutine => member}/service/MemberRoutineServiceTest.java (79%) rename src/test/java/com/soptie/server/{memberRoutine => member}/service/integration/MemberRoutineServiceIntegrationTest.java (55%) delete mode 100644 src/test/java/com/soptie/server/memberDoll/service/MemberDollServiceImplTest.java diff --git a/.github/workflows/CI.yml b/.github/workflows/ci.yml similarity index 57% rename from .github/workflows/CI.yml rename to .github/workflows/ci.yml index 2e6195ec..891c9b99 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/ci.yml @@ -1,4 +1,4 @@ -name: CI +name: ci on: pull_request: @@ -29,4 +29,24 @@ jobs: chmod +x gradlew ./gradlew build test working-directory: ${{ env.working-directory }} - shell: bash \ No newline at end of file + shell: bash + + lint: + runs-on: ubuntu-22.04 + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 21 + uses: actions/setup-java@v3 + with: + java-version: '21' + distribution: 'temurin' + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Execute checkstyleMain + run: ./gradlew clean checkstyleMain + + - name: Execute checkstyleTest + run: ./gradlew clean checkstyleTest diff --git a/build.gradle b/build.gradle index d8dd222f..37e92ea1 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'org.springframework.boot' version '3.2.1' id 'io.spring.dependency-management' version '1.1.4' + id 'checkstyle' } group = 'com.soptie' @@ -11,12 +12,21 @@ java { sourceCompatibility = '17' } +checkstyle { + maxWarnings = 0 + configFile = file("checkstyle/naver-checkstyle-rules.xml") + configProperties = ["suppressionFile": "checkstyle/naver-checkstyle-suppressions.xml"] +} + configurations { compileOnly { extendsFrom annotationProcessor } } +compileJava.options.encoding = 'UTF-8' +compileTestJava.options.encoding = 'UTF-8' + repositories { mavenCentral() } @@ -59,3 +69,10 @@ dependencies { tasks.named('test') { useJUnitPlatform() } + +tasks.withType(Checkstyle).configureEach { + reports { + xml.required = true + html.required = true + } +} diff --git a/checkstyle/naver-checkstyle-rules.xml b/checkstyle/naver-checkstyle-rules.xml new file mode 100644 index 00000000..46c0219c --- /dev/null +++ b/checkstyle/naver-checkstyle-rules.xml @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/checkstyle/naver-checkstyle-suppressions.xml b/checkstyle/naver-checkstyle-suppressions.xml new file mode 100644 index 00000000..a7b6fd1d --- /dev/null +++ b/checkstyle/naver-checkstyle-suppressions.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/src/main/java/com/soptie/server/auth/controller/AuthApi.java b/src/main/java/com/soptie/server/auth/controller/AuthApi.java index bbadffc6..3a1f5a1e 100644 --- a/src/main/java/com/soptie/server/auth/controller/AuthApi.java +++ b/src/main/java/com/soptie/server/auth/controller/AuthApi.java @@ -2,13 +2,13 @@ import java.security.Principal; -import com.soptie.server.auth.controller.dto.response.SignInResponse; -import com.soptie.server.auth.controller.dto.response.TokenGetResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import com.soptie.server.auth.controller.dto.request.SignInRequest; +import com.soptie.server.auth.controller.dto.response.SignInResponse; +import com.soptie.server.auth.controller.dto.response.TokenGetResponse; import com.soptie.server.common.dto.BaseResponse; import com.soptie.server.common.dto.ErrorResponse; import com.soptie.server.common.dto.SuccessResponse; @@ -23,112 +23,95 @@ @Tag(name = "auth", description = "인증 API") public interface AuthApi { - @Operation( - summary = "소셜 로그인", - description = "소셜 로그인을 진행한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> signIn( - @RequestHeader("Authorization") String socialAccessToken, - @RequestBody SignInRequest request - ); + @SuppressWarnings("checkstyle:Indentation") + @Operation( + summary = "소셜 로그인", + description = "소셜 로그인을 진행한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> signIn( + @RequestHeader("Authorization") String socialAccessToken, + @RequestBody SignInRequest request + ); - @Operation( - summary = "토큰 재발급", - description = "리프레시 토큰을 이용해 액세스 토큰을 재발급 받는다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "404", - description = "유효하지 않은 회원", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> reissueToken( - @RequestHeader("Authorization") String refreshToken - ); + @Operation( + summary = "토큰 재발급", + description = "리프레시 토큰을 이용해 액세스 토큰을 재발급 받는다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "404", + description = "유효하지 않은 회원", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> reissueToken( + @RequestHeader("Authorization") String refreshToken + ); - @Operation( - summary = "로그 아웃", - description = "로그 아웃을 한다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), - @ApiResponse( - responseCode = "404", - description = "유효하지 않은 회원", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity signOut(@Parameter(hidden = true) Principal principal); + @Operation( + summary = "로그 아웃", + description = "로그 아웃을 한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), + @ApiResponse( + responseCode = "404", + description = "유효하지 않은 회원", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity signOut(@Parameter(hidden = true) Principal principal); - @Operation( - summary = "회원 탈퇴", - description = "회원 탈퇴를 진행한다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), - @ApiResponse( - responseCode = "404", - description = "유효하지 않은 회원", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity withdrawal(@Parameter(hidden = true) Principal principal); + @Operation( + summary = "회원 탈퇴", + description = "회원 탈퇴를 진행한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), + @ApiResponse( + responseCode = "404", + description = "유효하지 않은 회원", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity withdrawal(@Parameter(hidden = true) Principal principal); } diff --git a/src/main/java/com/soptie/server/auth/controller/AuthController.java b/src/main/java/com/soptie/server/auth/controller/AuthController.java index e9d06874..09d33820 100644 --- a/src/main/java/com/soptie/server/auth/controller/AuthController.java +++ b/src/main/java/com/soptie/server/auth/controller/AuthController.java @@ -1,59 +1,65 @@ package com.soptie.server.auth.controller; +import static com.soptie.server.auth.message.SuccessMessage.*; +import static com.soptie.server.common.dto.SuccessResponse.*; + +import java.security.Principal; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + import com.soptie.server.auth.controller.dto.request.SignInRequest; import com.soptie.server.auth.controller.dto.response.SignInResponse; import com.soptie.server.auth.controller.dto.response.TokenGetResponse; +import com.soptie.server.auth.service.AuthService; import com.soptie.server.auth.service.dto.request.SignInServiceRequest; import com.soptie.server.auth.service.dto.request.TokenGetServiceRequest; -import com.soptie.server.auth.service.AuthService; import com.soptie.server.common.dto.BaseResponse; import com.soptie.server.common.dto.SuccessResponse; import lombok.RequiredArgsConstructor; import lombok.val; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.security.Principal; - -import static com.soptie.server.auth.message.SuccessMessage.*; -import static com.soptie.server.common.dto.SuccessResponse.*; @RestController @RequiredArgsConstructor @RequestMapping("/api/v1/auth") public class AuthController implements AuthApi { - private final AuthService authService; - - @PostMapping - public ResponseEntity> signIn( - @RequestHeader("Authorization") String socialAccessToken, - @RequestBody SignInRequest request - ) { - val response = SignInResponse.of(authService.signIn(SignInServiceRequest.of(socialAccessToken, request))); - return ResponseEntity.ok(success(SUCCESS_SIGN_IN.getMessage(), response)); - } - - @PostMapping("/token") - public ResponseEntity> reissueToken( - @RequestHeader("Authorization") String refreshToken - ) { - val response = TokenGetResponse.of(authService.reissueToken(TokenGetServiceRequest.of(refreshToken))); - return ResponseEntity.ok(success(SUCCESS_RECREATE_TOKEN.getMessage(), response)); - } - - @PostMapping("/logout") - public ResponseEntity signOut(Principal principal) { - val memberId = Long.parseLong(principal.getName()); - authService.signOut(memberId); - return ResponseEntity.ok(success(SUCCESS_SIGN_OUT.getMessage())); - } - - @DeleteMapping - public ResponseEntity withdrawal(Principal principal) { - val memberId = Long.parseLong(principal.getName()); - authService.withdraw(memberId); - return ResponseEntity.ok(success(SUCCESS_WITHDRAWAL.getMessage())); - } + private final AuthService authService; + + @PostMapping + public ResponseEntity> signIn( + @RequestHeader("Authorization") String socialAccessToken, + @RequestBody SignInRequest request + ) { + val response = SignInResponse.of(authService.signIn(SignInServiceRequest.of(socialAccessToken, request))); + return ResponseEntity.ok(success(SUCCESS_SIGN_IN.getMessage(), response)); + } + + @PostMapping("/token") + public ResponseEntity> reissueToken( + @RequestHeader("Authorization") String refreshToken + ) { + val response = TokenGetResponse.of(authService.reissueToken(TokenGetServiceRequest.of(refreshToken))); + return ResponseEntity.ok(success(SUCCESS_RECREATE_TOKEN.getMessage(), response)); + } + + @PostMapping("/logout") + public ResponseEntity signOut(Principal principal) { + val memberId = Long.parseLong(principal.getName()); + authService.signOut(memberId); + return ResponseEntity.ok(success(SUCCESS_SIGN_OUT.getMessage())); + } + + @DeleteMapping + public ResponseEntity withdrawal(Principal principal) { + val memberId = Long.parseLong(principal.getName()); + authService.withdraw(memberId); + return ResponseEntity.ok(success(SUCCESS_WITHDRAWAL.getMessage())); + } } diff --git a/src/main/java/com/soptie/server/auth/controller/dto/request/SignInRequest.java b/src/main/java/com/soptie/server/auth/controller/dto/request/SignInRequest.java index bedc2d7a..113872f4 100644 --- a/src/main/java/com/soptie/server/auth/controller/dto/request/SignInRequest.java +++ b/src/main/java/com/soptie/server/auth/controller/dto/request/SignInRequest.java @@ -5,10 +5,10 @@ import lombok.NonNull; public record SignInRequest( - @NonNull SocialType socialType + @NonNull SocialType socialType ) { - public static SignInRequest of(SocialType socialType) { - return new SignInRequest(socialType); - } + public static SignInRequest of(SocialType socialType) { + return new SignInRequest(socialType); + } } diff --git a/src/main/java/com/soptie/server/auth/controller/dto/response/SignInResponse.java b/src/main/java/com/soptie/server/auth/controller/dto/response/SignInResponse.java index 16ec322a..6523ff76 100644 --- a/src/main/java/com/soptie/server/auth/controller/dto/response/SignInResponse.java +++ b/src/main/java/com/soptie/server/auth/controller/dto/response/SignInResponse.java @@ -1,23 +1,24 @@ package com.soptie.server.auth.controller.dto.response; +import static lombok.AccessLevel.*; + import com.soptie.server.auth.service.dto.response.SignInServiceResponse; + import lombok.Builder; import lombok.NonNull; -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record SignInResponse( - @NonNull String accessToken, - @NonNull String refreshToken, - boolean isMemberDollExist + @NonNull String accessToken, + @NonNull String refreshToken, + boolean isMemberDollExist ) { - public static SignInResponse of(SignInServiceResponse response) { - return SignInResponse.builder() - .accessToken(response.accessToken()) - .refreshToken(response.refreshToken()) - .isMemberDollExist(response.isMemberDollExist()) - .build(); - } + public static SignInResponse of(SignInServiceResponse response) { + return SignInResponse.builder() + .accessToken(response.accessToken()) + .refreshToken(response.refreshToken()) + .isMemberDollExist(response.isMemberDollExist()) + .build(); + } } diff --git a/src/main/java/com/soptie/server/auth/controller/dto/response/TokenGetResponse.java b/src/main/java/com/soptie/server/auth/controller/dto/response/TokenGetResponse.java index 1a0033cf..daa06cd7 100644 --- a/src/main/java/com/soptie/server/auth/controller/dto/response/TokenGetResponse.java +++ b/src/main/java/com/soptie/server/auth/controller/dto/response/TokenGetResponse.java @@ -1,19 +1,20 @@ package com.soptie.server.auth.controller.dto.response; +import static lombok.AccessLevel.*; + import com.soptie.server.auth.service.dto.response.TokenGetServiceResponse; + import lombok.Builder; import lombok.NonNull; -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record TokenGetResponse( - @NonNull String accessToken + @NonNull String accessToken ) { - public static TokenGetResponse of(TokenGetServiceResponse response) { - return TokenGetResponse.builder() - .accessToken(response.accessToken()) - .build(); - } + public static TokenGetResponse of(TokenGetServiceResponse response) { + return TokenGetResponse.builder() + .accessToken(response.accessToken()) + .build(); + } } diff --git a/src/main/java/com/soptie/server/auth/jwt/CustomJwtAuthenticationEntryPoint.java b/src/main/java/com/soptie/server/auth/jwt/CustomJwtAuthenticationEntryPoint.java index 285765ad..1f35e168 100644 --- a/src/main/java/com/soptie/server/auth/jwt/CustomJwtAuthenticationEntryPoint.java +++ b/src/main/java/com/soptie/server/auth/jwt/CustomJwtAuthenticationEntryPoint.java @@ -1,39 +1,41 @@ package com.soptie.server.auth.jwt; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.soptie.server.common.dto.ErrorResponse; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; +import static com.soptie.server.auth.message.ErrorCode.*; +import static jakarta.servlet.http.HttpServletResponse.*; +import static org.springframework.http.MediaType.*; + +import java.io.IOException; + import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; -import java.io.IOException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.soptie.server.common.dto.ErrorResponse; -import static com.soptie.server.auth.message.ErrorCode.*; -import static jakarta.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; @Component @RequiredArgsConstructor public class CustomJwtAuthenticationEntryPoint implements AuthenticationEntryPoint { - private final ObjectMapper objectMapper; - - @Override - public void commence( - HttpServletRequest request, - HttpServletResponse response, - AuthenticationException exception - ) throws IOException { - setResponse(response); - } - - private void setResponse(HttpServletResponse response) throws IOException { - response.setCharacterEncoding("UTF-8"); - response.setContentType(APPLICATION_JSON_VALUE); - response.setStatus(SC_UNAUTHORIZED); - response.getWriter().println(objectMapper.writeValueAsString(ErrorResponse.of(INVALID_TOKEN.getMessage()))); - } + private final ObjectMapper objectMapper; + + @Override + public void commence( + HttpServletRequest request, + HttpServletResponse response, + AuthenticationException exception + ) throws IOException { + setResponse(response); + } + + private void setResponse(HttpServletResponse response) throws IOException { + response.setCharacterEncoding("UTF-8"); + response.setContentType(APPLICATION_JSON_VALUE); + response.setStatus(SC_UNAUTHORIZED); + response.getWriter().println(objectMapper.writeValueAsString(ErrorResponse.of(INVALID_TOKEN.getMessage()))); + } } diff --git a/src/main/java/com/soptie/server/auth/jwt/JwtAuthenticationFilter.java b/src/main/java/com/soptie/server/auth/jwt/JwtAuthenticationFilter.java index a1f4daa5..d5c86f26 100644 --- a/src/main/java/com/soptie/server/auth/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/com/soptie/server/auth/jwt/JwtAuthenticationFilter.java @@ -1,5 +1,16 @@ package com.soptie.server.auth.jwt; +import static com.soptie.server.auth.jwt.JwtValidationType.*; +import static io.jsonwebtoken.lang.Strings.*; +import static org.springframework.http.HttpHeaders.*; + +import java.io.IOException; + +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + import com.soptie.server.common.config.ValueConfig; import jakarta.servlet.FilterChain; @@ -9,63 +20,49 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; - -import static com.soptie.server.auth.jwt.JwtValidationType.VALID_JWT; -import static io.jsonwebtoken.lang.Strings.hasText; -import static org.springframework.http.HttpHeaders.AUTHORIZATION; @Slf4j @Component @RequiredArgsConstructor public class JwtAuthenticationFilter extends OncePerRequestFilter { - private final JwtTokenProvider jwtTokenProvider; - private final ValueConfig valueConfig; + private final JwtTokenProvider jwtTokenProvider; - @Override - protected void doFilterInternal( - HttpServletRequest request, - HttpServletResponse response, - FilterChain filterChain - ) throws ServletException, IOException { - try { - val token = getAccessTokenFromRequest(request); - if (hasText(token) && jwtTokenProvider.validateToken(token) == VALID_JWT) { - val authentication = new UserAuthentication(getMemberId(token), null, null); - authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(authentication); - } - } catch (Exception exception) { - log.error(exception.getMessage()); - } + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + try { + val token = getAccessTokenFromRequest(request); + if (hasText(token) && jwtTokenProvider.validateToken(token) == VALID_JWT) { + val authentication = new UserAuthentication(getMemberId(token), null, null); + authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authentication); + } + } catch (Exception exception) { + log.error(exception.getMessage()); + } - filterChain.doFilter(request, response); - } + filterChain.doFilter(request, response); + } - private long getMemberId(String token) { - return jwtTokenProvider.getUserFromJwt(token); - } + private long getMemberId(String token) { + return jwtTokenProvider.getUserFromJwt(token); + } - private String getAccessTokenFromRequest(HttpServletRequest request) { - return isContainsAccessToken(request) ? getAuthorizationAccessToken(request) : null; - } + private String getAccessTokenFromRequest(HttpServletRequest request) { + return isContainsAccessToken(request) ? getAuthorizationAccessToken(request) : null; + } - private boolean isContainsAccessToken(HttpServletRequest request) { - val authorization = request.getHeader(AUTHORIZATION); - return authorization != null && authorization.startsWith(valueConfig.getBEARER_HEADER()); - } + private boolean isContainsAccessToken(HttpServletRequest request) { + val authorization = request.getHeader(AUTHORIZATION); + return authorization != null && authorization.startsWith(ValueConfig.BEARER_HEADER); + } - private String getAuthorizationAccessToken(HttpServletRequest request) { - return getTokenFromBearerString(request.getHeader(AUTHORIZATION)); - } + private String getAuthorizationAccessToken(HttpServletRequest request) { + return getTokenFromBearerString(request.getHeader(AUTHORIZATION)); + } - private String getTokenFromBearerString(String token) { - return token.replaceFirst(valueConfig.getBEARER_HEADER(), valueConfig.getBLANK()); - } + private String getTokenFromBearerString(String token) { + return token.replaceFirst(ValueConfig.BEARER_HEADER, ValueConfig.BLANK); + } } diff --git a/src/main/java/com/soptie/server/auth/jwt/JwtTokenProvider.java b/src/main/java/com/soptie/server/auth/jwt/JwtTokenProvider.java index a3f1c6ba..19e50450 100644 --- a/src/main/java/com/soptie/server/auth/jwt/JwtTokenProvider.java +++ b/src/main/java/com/soptie/server/auth/jwt/JwtTokenProvider.java @@ -1,78 +1,85 @@ package com.soptie.server.auth.jwt; -import com.soptie.server.common.config.ValueConfig; -import io.jsonwebtoken.*; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import lombok.val; +import static com.soptie.server.auth.jwt.JwtValidationType.*; +import static io.jsonwebtoken.Header.*; +import static io.jsonwebtoken.security.Keys.*; +import static java.util.Base64.*; + +import java.util.Date; + +import javax.crypto.SecretKey; + import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; -import javax.crypto.SecretKey; -import java.util.Date; +import com.soptie.server.common.config.ValueConfig; -import static com.soptie.server.auth.jwt.JwtValidationType.*; -import static io.jsonwebtoken.Header.*; -import static io.jsonwebtoken.security.Keys.hmacShaKeyFor; -import static java.util.Base64.getEncoder; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.UnsupportedJwtException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import lombok.val; @Slf4j @Component @RequiredArgsConstructor public class JwtTokenProvider { - private final ValueConfig valueConfig; + private final ValueConfig valueConfig; - public String generateToken(Authentication authentication, long expiration) { - return Jwts.builder() - .setHeaderParam(TYPE, JWT_TYPE) - .setClaims(generateClaims(authentication)) - .setIssuedAt(new Date(System.currentTimeMillis())) - .setExpiration(new Date(System.currentTimeMillis() + expiration)) - .signWith(getSigningKey()) - .compact(); - } + public String generateToken(Authentication authentication, long expiration) { + return Jwts.builder() + .setHeaderParam(TYPE, JWT_TYPE) + .setClaims(generateClaims(authentication)) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + expiration)) + .signWith(getSigningKey()) + .compact(); + } - public JwtValidationType validateToken(String token) { - try { - getBody(token); - return VALID_JWT; - } catch (MalformedJwtException exception) { - log.error(exception.getMessage()); - return INVALID_JWT_TOKEN; - } catch (ExpiredJwtException exception) { - log.error(exception.getMessage()); - return EXPIRED_JWT_TOKEN; - } catch (UnsupportedJwtException exception) { - log.error(exception.getMessage()); - return UNSUPPORTED_JWT_TOKEN; - } catch (IllegalArgumentException exception) { - log.error(exception.getMessage()); - return EMPTY_JWT; - } - } + public JwtValidationType validateToken(String token) { + try { + getBody(token); + return VALID_JWT; + } catch (MalformedJwtException exception) { + log.error(exception.getMessage()); + return INVALID_JWT_TOKEN; + } catch (ExpiredJwtException exception) { + log.error(exception.getMessage()); + return EXPIRED_JWT_TOKEN; + } catch (UnsupportedJwtException exception) { + log.error(exception.getMessage()); + return UNSUPPORTED_JWT_TOKEN; + } catch (IllegalArgumentException exception) { + log.error(exception.getMessage()); + return EMPTY_JWT; + } + } - private Claims generateClaims(Authentication authentication) { - val claims = Jwts.claims(); - claims.put("memberId", authentication.getPrincipal()); - return claims; - } + private Claims generateClaims(Authentication authentication) { + val claims = Jwts.claims(); + claims.put("memberId", authentication.getPrincipal()); + return claims; + } - public Long getUserFromJwt(String token) { - val claims = getBody(token); - return Long.parseLong(claims.get("memberId").toString()); - } + public Long getUserFromJwt(String token) { + val claims = getBody(token); + return Long.parseLong(claims.get("memberId").toString()); + } - private Claims getBody(final String token) { - return Jwts.parserBuilder() - .setSigningKey(getSigningKey()) - .build() - .parseClaimsJws(token) - .getBody(); - } + private Claims getBody(final String token) { + return Jwts.parserBuilder() + .setSigningKey(getSigningKey()) + .build() + .parseClaimsJws(token) + .getBody(); + } - private SecretKey getSigningKey() { - val encodedKey = getEncoder().encodeToString(valueConfig.getSecretKey().getBytes()); - return hmacShaKeyFor(encodedKey.getBytes()); - } + private SecretKey getSigningKey() { + val encodedKey = getEncoder().encodeToString(valueConfig.getSecretKey().getBytes()); + return hmacShaKeyFor(encodedKey.getBytes()); + } } diff --git a/src/main/java/com/soptie/server/auth/jwt/JwtValidationType.java b/src/main/java/com/soptie/server/auth/jwt/JwtValidationType.java index 3f22222a..e82cb971 100644 --- a/src/main/java/com/soptie/server/auth/jwt/JwtValidationType.java +++ b/src/main/java/com/soptie/server/auth/jwt/JwtValidationType.java @@ -1,9 +1,9 @@ package com.soptie.server.auth.jwt; public enum JwtValidationType { - VALID_JWT, - INVALID_JWT_TOKEN, - EXPIRED_JWT_TOKEN, - UNSUPPORTED_JWT_TOKEN, - EMPTY_JWT + VALID_JWT, + INVALID_JWT_TOKEN, + EXPIRED_JWT_TOKEN, + UNSUPPORTED_JWT_TOKEN, + EMPTY_JWT } diff --git a/src/main/java/com/soptie/server/auth/jwt/UserAuthentication.java b/src/main/java/com/soptie/server/auth/jwt/UserAuthentication.java index 4dc8277a..7d98bf12 100644 --- a/src/main/java/com/soptie/server/auth/jwt/UserAuthentication.java +++ b/src/main/java/com/soptie/server/auth/jwt/UserAuthentication.java @@ -1,17 +1,17 @@ package com.soptie.server.auth.jwt; +import java.util.Collection; + import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.GrantedAuthority; -import java.util.Collection; - public class UserAuthentication extends UsernamePasswordAuthenticationToken { - public UserAuthentication( - Object principal, - Object credentials, - Collection authorities - ) { - super(principal, credentials, authorities); - } + public UserAuthentication( + Object principal, + Object credentials, + Collection authorities + ) { + super(principal, credentials, authorities); + } } diff --git a/src/main/java/com/soptie/server/auth/message/ErrorCode.java b/src/main/java/com/soptie/server/auth/message/ErrorCode.java index 8cf415fa..ee7e51fb 100644 --- a/src/main/java/com/soptie/server/auth/message/ErrorCode.java +++ b/src/main/java/com/soptie/server/auth/message/ErrorCode.java @@ -13,8 +13,7 @@ public enum ErrorCode { /* 401 UNAUTHORIZED : 권한 없음 */ INVALID_TOKEN(UNAUTHORIZED, "유효하지 않은 토큰입니다."), - INVALID_KEY(UNAUTHORIZED, "유효하지 않은 키입니다."), - ; + INVALID_KEY(UNAUTHORIZED, "유효하지 않은 키입니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/soptie/server/auth/message/SuccessMessage.java b/src/main/java/com/soptie/server/auth/message/SuccessMessage.java index 36d2a2ca..eb2d0d43 100644 --- a/src/main/java/com/soptie/server/auth/message/SuccessMessage.java +++ b/src/main/java/com/soptie/server/auth/message/SuccessMessage.java @@ -7,11 +7,10 @@ @Getter public enum SuccessMessage { - SUCCESS_SIGN_IN("소셜로그인 성공"), - SUCCESS_RECREATE_TOKEN("토큰 재발급 성공"), - SUCCESS_SIGN_OUT("로그아웃 성공"), - SUCCESS_WITHDRAWAL("회원 탈퇴 성공"), - ; + SUCCESS_SIGN_IN("소셜로그인 성공"), + SUCCESS_RECREATE_TOKEN("토큰 재발급 성공"), + SUCCESS_SIGN_OUT("로그아웃 성공"), + SUCCESS_WITHDRAWAL("회원 탈퇴 성공"); - private final String message; + private final String message; } diff --git a/src/main/java/com/soptie/server/auth/service/AppleService.java b/src/main/java/com/soptie/server/auth/service/AppleService.java index c8c6cfcb..88df2699 100644 --- a/src/main/java/com/soptie/server/auth/service/AppleService.java +++ b/src/main/java/com/soptie/server/auth/service/AppleService.java @@ -2,5 +2,5 @@ public interface AppleService { - String getAppleData(String socialAccessToken); + String getAppleData(String socialAccessToken); } diff --git a/src/main/java/com/soptie/server/auth/service/AppleServiceImpl.java b/src/main/java/com/soptie/server/auth/service/AppleServiceImpl.java index 5a535931..5f540bb5 100644 --- a/src/main/java/com/soptie/server/auth/service/AppleServiceImpl.java +++ b/src/main/java/com/soptie/server/auth/service/AppleServiceImpl.java @@ -1,14 +1,6 @@ package com.soptie.server.auth.service; -import com.google.gson.*; -import com.soptie.server.auth.exception.AuthException; -import com.soptie.server.common.config.ValueConfig; -import io.jsonwebtoken.Jwts; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.http.HttpMethod; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import static com.soptie.server.auth.message.ErrorCode.*; import java.io.BufferedReader; import java.io.IOException; @@ -24,125 +16,139 @@ import java.util.Base64; import java.util.Objects; -import static com.soptie.server.auth.message.ErrorCode.*; +import org.springframework.http.HttpMethod; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.soptie.server.auth.exception.AuthException; +import com.soptie.server.common.config.ValueConfig; + +import io.jsonwebtoken.Jwts; +import lombok.RequiredArgsConstructor; +import lombok.val; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class AppleServiceImpl implements AppleService { - private final ValueConfig valueConfig; - - @Override - public String getAppleData(String socialAccessToken) { - val publicKeyList = getApplePublicKeys(); - val publicKey = makePublicKey(socialAccessToken, publicKeyList); - - val userInfo = Jwts.parserBuilder() - .setSigningKey(publicKey) - .build() - .parseClaimsJws(getTokenFromBearerString(socialAccessToken)) - .getBody(); - - val userInfoObject = (JsonObject) JsonParser.parseString(new Gson().toJson(userInfo)); - return userInfoObject.get(valueConfig.getID()).getAsString(); - } - - private JsonArray getApplePublicKeys() { - val connection = sendHttpRequest(); - val result = getHttpResponse(connection); - val keys = (JsonObject) JsonParser.parseString(result.toString()); - return (JsonArray) keys.get(valueConfig.getKEY()); - } - - private HttpURLConnection sendHttpRequest() { - try { - val url = new URL(valueConfig.getAppleUri()); - val connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod(HttpMethod.GET.name()); - return connection; - } catch (IOException exception) { - throw new RuntimeException(exception); - } - } - - private StringBuilder getHttpResponse(HttpURLConnection connection) { - try { - val bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); - return splitHttpResponse(bufferedReader); - } catch (IOException exception) { - throw new RuntimeException(exception); - } - } - - private StringBuilder splitHttpResponse(BufferedReader bufferedReader) { - try { - val result = new StringBuilder(); - - String line; - while (Objects.nonNull(line = bufferedReader.readLine())) { - result.append(line); - } - bufferedReader.close(); - - return result; - } catch (IOException exception) { - throw new RuntimeException(exception); - } - } - - private PublicKey makePublicKey(String accessToken, JsonArray publicKeyList) { - val decodeArray = accessToken.split(valueConfig.getTOKEN_VALUE_DELIMITER()); - val header = new String(Base64.getDecoder().decode(getTokenFromBearerString(decodeArray[0]))); - - val kid = ((JsonObject) JsonParser.parseString(header)).get(valueConfig.getKID_HEADER_KEY()); - val alg = ((JsonObject) JsonParser.parseString(header)).get(valueConfig.getALG_HEADER_KEY()); - val matchingPublicKey = findMatchingPublicKey(publicKeyList, kid, alg); - - if (Objects.isNull(matchingPublicKey)) { - throw new AuthException(INVALID_KEY); - } - - return getPublicKey(matchingPublicKey); - } - - private String getTokenFromBearerString(String token) { - return token.replaceFirst(valueConfig.getBEARER_HEADER(), valueConfig.getBLANK()); - } - - private JsonObject findMatchingPublicKey(JsonArray publicKeyList, JsonElement kid, JsonElement alg) { - for (JsonElement publicKey : publicKeyList) { - val publicKeyObject = publicKey.getAsJsonObject(); - val publicKid = publicKeyObject.get(valueConfig.getKID_HEADER_KEY()); - val publicAlg = publicKeyObject.get(valueConfig.getALG_HEADER_KEY()); - - if (Objects.equals(kid, publicKid) && Objects.equals(alg, publicAlg)) { - return publicKeyObject; - } - } - - return null; - } - - private PublicKey getPublicKey(JsonObject object) { - try { - val modulus = object.get(valueConfig.getMODULUS()).toString(); - val exponent = object.get(valueConfig.getEXPONENT()).toString(); - - val quotes = valueConfig.getQUOTES(); - val modulusBytes = Base64.getUrlDecoder().decode(modulus.substring(quotes, modulus.length() - quotes)); - val exponentBytes = Base64.getUrlDecoder().decode(exponent.substring(quotes, exponent.length() - quotes)); - - val positiveNumber = valueConfig.getPOSITIVE_NUMBER(); - val modulusValue = new BigInteger(positiveNumber, modulusBytes); - val exponentValue = new BigInteger(positiveNumber, exponentBytes); - - val publicKeySpec = new RSAPublicKeySpec(modulusValue, exponentValue); - val keyFactory = KeyFactory.getInstance(valueConfig.getRSA()); - - return keyFactory.generatePublic(publicKeySpec); - } catch (InvalidKeySpecException | NoSuchAlgorithmException exception) { - throw new AuthException(INVALID_KEY); - } - } + private final ValueConfig valueConfig; + + @Override + public String getAppleData(String socialAccessToken) { + val publicKeyList = getApplePublicKeys(); + val publicKey = makePublicKey(socialAccessToken, publicKeyList); + + val userInfo = Jwts.parserBuilder() + .setSigningKey(publicKey) + .build() + .parseClaimsJws(getTokenFromBearerString(socialAccessToken)) + .getBody(); + + val userInfoObject = (JsonObject)JsonParser.parseString(new Gson().toJson(userInfo)); + return userInfoObject.get(ValueConfig.ID).getAsString(); + } + + private JsonArray getApplePublicKeys() { + val connection = sendHttpRequest(); + val result = getHttpResponse(connection); + val keys = (JsonObject)JsonParser.parseString(result.toString()); + return (JsonArray)keys.get(ValueConfig.KEY); + } + + private HttpURLConnection sendHttpRequest() { + try { + val url = new URL(valueConfig.getAppleUri()); + val connection = (HttpURLConnection)url.openConnection(); + connection.setRequestMethod(HttpMethod.GET.name()); + return connection; + } catch (IOException exception) { + throw new RuntimeException(exception); + } + } + + private StringBuilder getHttpResponse(HttpURLConnection connection) { + try { + val bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + return splitHttpResponse(bufferedReader); + } catch (IOException exception) { + throw new RuntimeException(exception); + } + } + + private StringBuilder splitHttpResponse(BufferedReader bufferedReader) { + try { + val result = new StringBuilder(); + + String line; + while (Objects.nonNull(line = bufferedReader.readLine())) { + result.append(line); + } + bufferedReader.close(); + + return result; + } catch (IOException exception) { + throw new RuntimeException(exception); + } + } + + private PublicKey makePublicKey(String accessToken, JsonArray publicKeyList) { + val decodeArray = accessToken.split(ValueConfig.TOKEN_VALUE_DELIMITER); + val header = new String(Base64.getDecoder().decode(getTokenFromBearerString(decodeArray[0]))); + + val kid = ((JsonObject)JsonParser.parseString(header)).get(ValueConfig.KID_HEADER_KEY); + val alg = ((JsonObject)JsonParser.parseString(header)).get(ValueConfig.ALG_HEADER_KEY); + val matchingPublicKey = findMatchingPublicKey(publicKeyList, kid, alg); + + if (Objects.isNull(matchingPublicKey)) { + throw new AuthException(INVALID_KEY); + } + + return getPublicKey(matchingPublicKey); + } + + private String getTokenFromBearerString(String token) { + return token.replaceFirst(ValueConfig.BEARER_HEADER, ValueConfig.BLANK); + } + + private JsonObject findMatchingPublicKey(JsonArray publicKeyList, JsonElement kid, JsonElement alg) { + for (JsonElement publicKey : publicKeyList) { + val publicKeyObject = publicKey.getAsJsonObject(); + val publicKid = publicKeyObject.get(ValueConfig.KID_HEADER_KEY); + val publicAlg = publicKeyObject.get(ValueConfig.ALG_HEADER_KEY); + + if (Objects.equals(kid, publicKid) && Objects.equals(alg, publicAlg)) { + return publicKeyObject; + } + } + + return null; + } + + private PublicKey getPublicKey(JsonObject object) { + try { + val modulus = object.get(ValueConfig.MODULUS).toString(); + val exponent = object.get(ValueConfig.EXPONENT).toString(); + + val quotes = ValueConfig.QUOTES; + val modulusBytes = Base64.getUrlDecoder().decode(modulus.substring(quotes, modulus.length() - quotes)); + val exponentBytes = Base64.getUrlDecoder().decode(exponent.substring(quotes, exponent.length() - quotes)); + + val positiveNumber = ValueConfig.POSITIVE_NUMBER; + val modulusValue = new BigInteger(positiveNumber, modulusBytes); + val exponentValue = new BigInteger(positiveNumber, exponentBytes); + + val publicKeySpec = new RSAPublicKeySpec(modulusValue, exponentValue); + val keyFactory = KeyFactory.getInstance(ValueConfig.RSA); + + return keyFactory.generatePublic(publicKeySpec); + } catch (InvalidKeySpecException | NoSuchAlgorithmException exception) { + throw new AuthException(INVALID_KEY); + } + } } diff --git a/src/main/java/com/soptie/server/auth/service/AuthService.java b/src/main/java/com/soptie/server/auth/service/AuthService.java index 3242eb92..d7b40822 100644 --- a/src/main/java/com/soptie/server/auth/service/AuthService.java +++ b/src/main/java/com/soptie/server/auth/service/AuthService.java @@ -7,8 +7,11 @@ public interface AuthService { - SignInServiceResponse signIn(SignInServiceRequest request); - void signOut(long memberId); - void withdraw(long memberId); - TokenGetServiceResponse reissueToken(TokenGetServiceRequest request); + SignInServiceResponse signIn(SignInServiceRequest request); + + void signOut(long memberId); + + void withdraw(long memberId); + + TokenGetServiceResponse reissueToken(TokenGetServiceRequest request); } diff --git a/src/main/java/com/soptie/server/auth/service/AuthServiceImpl.java b/src/main/java/com/soptie/server/auth/service/AuthServiceImpl.java index ce68fd2f..c4ea1f9f 100644 --- a/src/main/java/com/soptie/server/auth/service/AuthServiceImpl.java +++ b/src/main/java/com/soptie/server/auth/service/AuthServiceImpl.java @@ -1,143 +1,140 @@ package com.soptie.server.auth.service; +import static com.soptie.server.member.message.ErrorCode.*; + +import java.util.Objects; + +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.soptie.server.auth.jwt.JwtTokenProvider; +import com.soptie.server.auth.jwt.UserAuthentication; import com.soptie.server.auth.service.dto.request.SignInServiceRequest; import com.soptie.server.auth.service.dto.request.TokenGetServiceRequest; import com.soptie.server.auth.service.dto.response.SignInServiceResponse; import com.soptie.server.auth.service.dto.response.TokenGetServiceResponse; -import com.soptie.server.auth.jwt.JwtTokenProvider; -import com.soptie.server.auth.jwt.UserAuthentication; import com.soptie.server.auth.vo.Token; import com.soptie.server.common.config.ValueConfig; +import com.soptie.server.member.adapter.MemberRoutineDeleter; import com.soptie.server.member.entity.Member; +import com.soptie.server.member.entity.MemberDoll; import com.soptie.server.member.entity.SocialType; import com.soptie.server.member.exception.MemberException; import com.soptie.server.member.repository.MemberRepository; import com.soptie.server.member.service.MemberService; -import com.soptie.server.memberDoll.entity.MemberDoll; -import com.soptie.server.memberDoll.service.MemberDollService; -import com.soptie.server.memberRoutine.adapter.MemberRoutineDeleter; +import com.soptie.server.member.service.doll.MemberDollService; import lombok.RequiredArgsConstructor; import lombok.val; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Objects; - -import static com.soptie.server.member.message.ErrorCode.INVALID_MEMBER; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class AuthServiceImpl implements AuthService { - private final JwtTokenProvider jwtTokenProvider; - private final MemberRepository memberRepository; - private final KakaoService kakaoService; - private final AppleService appleService; - private final MemberService memberService; - private final MemberDollService memberDollService; - private final ValueConfig valueConfig; - - private final MemberRoutineDeleter memberRoutineDeleter; - - @Override - @Transactional - public SignInServiceResponse signIn(SignInServiceRequest request) { - val member = getMember(request.socialAccessToken(), request.socialType()); - val token = getToken(member); - val isMemberDollExist = member.isMemberDollExist(); - return SignInServiceResponse.of(token, isMemberDollExist); - } - - @Override - public TokenGetServiceResponse reissueToken(TokenGetServiceRequest request) { - val member = findMember(request.refreshToken()); - val token = generateAccessToken(member.getId()); - return TokenGetServiceResponse.of(token); - } - - @Override - @Transactional - public void signOut(long memberId) { - val member = findMember(memberId); - member.resetRefreshToken(); - } - - @Override - @Transactional - public void withdraw(long memberId) { - val member = findMember(memberId); - deleteMemberDoll(member.getMemberDoll()); - memberRoutineDeleter.deleteByMember(member); - deleteMember(member); - } - - private Member getMember(String socialAccessToken, SocialType socialType) { - val socialId = getSocialId(socialAccessToken, socialType); - return signUp(socialType, socialId); - } - - private String getSocialId(String socialAccessToken, SocialType socialType) { - return switch (socialType) { - case APPLE -> appleService.getAppleData(socialAccessToken); - case KAKAO -> kakaoService.getKakaoData(socialAccessToken); - }; - } - - private Member signUp(SocialType socialType, String socialId) { - return memberRepository.findBySocialTypeAndSocialId(socialType, socialId) - .orElseGet(() -> saveMember(socialType, socialId)); - } - - private Member saveMember(SocialType socialType, String socialId) { - val member = Member.builder() - .socialType(socialType) - .socialId(socialId) - .build(); - return memberRepository.save(member); - } - - private Token getToken(Member member) { - val token = generateToken(new UserAuthentication(member.getId(), null, null)); - member.updateRefreshToken(token.getRefreshToken()); - return token; - } - - private Token generateToken(Authentication authentication) { - return Token.builder() - .accessToken(jwtTokenProvider.generateToken(authentication, valueConfig.getAccessTokenExpired())) - .refreshToken(jwtTokenProvider.generateToken(authentication, valueConfig.getRefreshTokenExpired())) - .build(); - } - - private Member findMember(long id) { - return memberRepository.findById(id) - .orElseThrow(() -> new MemberException(INVALID_MEMBER)); - } - - private Member findMember(String refreshToken) { - return memberRepository.findByRefreshToken(getTokenFromBearerString(refreshToken)) - .orElseThrow(() -> new MemberException(INVALID_MEMBER)); - } - - private String getTokenFromBearerString(String token) { - return token.replaceFirst(valueConfig.getBEARER_HEADER(), valueConfig.getBLANK()); - } - - private String generateAccessToken(long memberId) { - val authentication = new UserAuthentication(memberId, null, null); - return jwtTokenProvider.generateToken(authentication, valueConfig.getAccessTokenExpired()); - } - - private void deleteMemberDoll(MemberDoll memberDoll) { - if (Objects.nonNull(memberDoll)) { - memberDollService.deleteMemberDoll(memberDoll); - } - } - - private void deleteMember(Member member) { - memberService.deleteMember(member); - } + private final JwtTokenProvider jwtTokenProvider; + private final MemberRepository memberRepository; + private final KakaoService kakaoService; + private final AppleService appleService; + private final MemberService memberService; + private final MemberDollService memberDollService; + private final ValueConfig valueConfig; + + private final MemberRoutineDeleter memberRoutineDeleter; + + @Override + @Transactional + public SignInServiceResponse signIn(SignInServiceRequest request) { + val member = getMember(request.socialAccessToken(), request.socialType()); + val token = getToken(member); + val isMemberDollExist = member.isMemberDollExist(); + return SignInServiceResponse.of(token, isMemberDollExist); + } + + @Override + public TokenGetServiceResponse reissueToken(TokenGetServiceRequest request) { + val member = findMember(request.refreshToken()); + val token = generateAccessToken(member.getId()); + return TokenGetServiceResponse.of(token); + } + + @Override + @Transactional + public void signOut(long memberId) { + val member = findMember(memberId); + member.resetRefreshToken(); + } + + @Override + @Transactional + public void withdraw(long memberId) { + val member = findMember(memberId); + deleteMemberDoll(member.getMemberDoll()); + memberRoutineDeleter.deleteByMember(member); + deleteMember(member); + } + + private Member getMember(String socialAccessToken, SocialType socialType) { + val socialId = getSocialId(socialAccessToken, socialType); + return signUp(socialType, socialId); + } + + private String getSocialId(String socialAccessToken, SocialType socialType) { + return switch (socialType) { + case APPLE -> appleService.getAppleData(socialAccessToken); + case KAKAO -> kakaoService.getKakaoData(socialAccessToken); + }; + } + + private Member signUp(SocialType socialType, String socialId) { + return memberRepository.findBySocialTypeAndSocialId(socialType, socialId) + .orElseGet(() -> saveMember(socialType, socialId)); + } + + private Member saveMember(SocialType socialType, String socialId) { + val member = Member.builder().socialType(socialType).socialId(socialId).build(); + return memberRepository.save(member); + } + + private Token getToken(Member member) { + val token = generateToken(new UserAuthentication(member.getId(), null, null)); + member.updateRefreshToken(token.getRefreshToken()); + return token; + } + + private Token generateToken(Authentication authentication) { + return Token.builder() + .accessToken(jwtTokenProvider.generateToken(authentication, valueConfig.getAccessTokenExpired())) + .refreshToken(jwtTokenProvider.generateToken(authentication, valueConfig.getRefreshTokenExpired())) + .build(); + } + + private Member findMember(long id) { + return memberRepository.findById(id).orElseThrow(() -> new MemberException(INVALID_MEMBER)); + } + + private Member findMember(String refreshToken) { + return memberRepository.findByRefreshToken(getTokenFromBearerString(refreshToken)) + .orElseThrow(() -> new MemberException(INVALID_MEMBER)); + } + + private String getTokenFromBearerString(String token) { + return token.replaceFirst(ValueConfig.BEARER_HEADER, ValueConfig.BLANK); + } + + private String generateAccessToken(long memberId) { + val authentication = new UserAuthentication(memberId, null, null); + return jwtTokenProvider.generateToken(authentication, valueConfig.getAccessTokenExpired()); + } + + private void deleteMemberDoll(MemberDoll memberDoll) { + if (Objects.nonNull(memberDoll)) { + memberDollService.deleteMemberDoll(memberDoll); + } + } + + private void deleteMember(Member member) { + memberService.deleteMember(member); + } } diff --git a/src/main/java/com/soptie/server/auth/service/KakaoService.java b/src/main/java/com/soptie/server/auth/service/KakaoService.java index ee39320c..7d9dff72 100644 --- a/src/main/java/com/soptie/server/auth/service/KakaoService.java +++ b/src/main/java/com/soptie/server/auth/service/KakaoService.java @@ -2,5 +2,5 @@ public interface KakaoService { - String getKakaoData(String socialAccessToken); + String getKakaoData(String socialAccessToken); } diff --git a/src/main/java/com/soptie/server/auth/service/KakaoServiceImpl.java b/src/main/java/com/soptie/server/auth/service/KakaoServiceImpl.java index 5f276ba0..6dd3e971 100644 --- a/src/main/java/com/soptie/server/auth/service/KakaoServiceImpl.java +++ b/src/main/java/com/soptie/server/auth/service/KakaoServiceImpl.java @@ -2,37 +2,39 @@ import static com.soptie.server.auth.message.ErrorCode.*; +import java.util.Map; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonArray; import com.soptie.server.auth.exception.AuthException; import com.soptie.server.common.config.ValueConfig; + import lombok.RequiredArgsConstructor; import lombok.val; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Service; -import org.springframework.web.client.RestTemplate; - -import java.util.Map; @Service @RequiredArgsConstructor public class KakaoServiceImpl implements KakaoService { - private final ValueConfig valueConfig; - private final RestTemplate restTemplate; - private final ObjectMapper objectMapper; - - @Override - public String getKakaoData(String socialAccessToken) { - try { - val headers = new HttpHeaders(); - headers.add("Authorization", socialAccessToken); - val httpEntity = new HttpEntity(headers); - val responseData = restTemplate.postForEntity(valueConfig.getKakaoUri(), httpEntity, Object.class); - return objectMapper.convertValue(responseData.getBody(), Map.class).get("id").toString(); - } catch (Exception exception) { - throw new AuthException(INVALID_TOKEN); - } - } + private final ValueConfig valueConfig; + private final RestTemplate restTemplate; + private final ObjectMapper objectMapper; + + @Override + public String getKakaoData(String socialAccessToken) { + try { + val headers = new HttpHeaders(); + headers.add("Authorization", socialAccessToken); + val httpEntity = new HttpEntity(headers); + val responseData = restTemplate.postForEntity(valueConfig.getKakaoUri(), httpEntity, Object.class); + return objectMapper.convertValue(responseData.getBody(), Map.class).get("id").toString(); + } catch (Exception exception) { + throw new AuthException(INVALID_TOKEN); + } + } } diff --git a/src/main/java/com/soptie/server/auth/service/dto/request/SignInServiceRequest.java b/src/main/java/com/soptie/server/auth/service/dto/request/SignInServiceRequest.java index 7ffb93d6..4997649c 100644 --- a/src/main/java/com/soptie/server/auth/service/dto/request/SignInServiceRequest.java +++ b/src/main/java/com/soptie/server/auth/service/dto/request/SignInServiceRequest.java @@ -1,22 +1,23 @@ package com.soptie.server.auth.service.dto.request; +import static lombok.AccessLevel.*; + import com.soptie.server.auth.controller.dto.request.SignInRequest; import com.soptie.server.member.entity.SocialType; + import lombok.Builder; import lombok.NonNull; -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record SignInServiceRequest( - @NonNull String socialAccessToken, - @NonNull SocialType socialType + @NonNull String socialAccessToken, + @NonNull SocialType socialType ) { - public static SignInServiceRequest of(String socialAccessToken, SignInRequest request) { - return SignInServiceRequest.builder() - .socialAccessToken(socialAccessToken) - .socialType(request.socialType()) - .build(); - } + public static SignInServiceRequest of(String socialAccessToken, SignInRequest request) { + return SignInServiceRequest.builder() + .socialAccessToken(socialAccessToken) + .socialType(request.socialType()) + .build(); + } } diff --git a/src/main/java/com/soptie/server/auth/service/dto/request/TokenGetServiceRequest.java b/src/main/java/com/soptie/server/auth/service/dto/request/TokenGetServiceRequest.java index 70ddb726..d0e4a215 100644 --- a/src/main/java/com/soptie/server/auth/service/dto/request/TokenGetServiceRequest.java +++ b/src/main/java/com/soptie/server/auth/service/dto/request/TokenGetServiceRequest.java @@ -1,18 +1,18 @@ package com.soptie.server.auth.service.dto.request; +import static lombok.AccessLevel.*; + import lombok.Builder; import lombok.NonNull; -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record TokenGetServiceRequest( - @NonNull String refreshToken + @NonNull String refreshToken ) { - public static TokenGetServiceRequest of(String refreshToken) { - return TokenGetServiceRequest.builder() - .refreshToken(refreshToken) - .build(); - } + public static TokenGetServiceRequest of(String refreshToken) { + return TokenGetServiceRequest.builder() + .refreshToken(refreshToken) + .build(); + } } diff --git a/src/main/java/com/soptie/server/auth/service/dto/response/SignInServiceResponse.java b/src/main/java/com/soptie/server/auth/service/dto/response/SignInServiceResponse.java index b5e9f61e..a92b02e1 100644 --- a/src/main/java/com/soptie/server/auth/service/dto/response/SignInServiceResponse.java +++ b/src/main/java/com/soptie/server/auth/service/dto/response/SignInServiceResponse.java @@ -1,23 +1,24 @@ package com.soptie.server.auth.service.dto.response; +import static lombok.AccessLevel.*; + import com.soptie.server.auth.vo.Token; + import lombok.Builder; import lombok.NonNull; -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record SignInServiceResponse( - @NonNull String accessToken, - @NonNull String refreshToken, - boolean isMemberDollExist + @NonNull String accessToken, + @NonNull String refreshToken, + boolean isMemberDollExist ) { - public static SignInServiceResponse of(Token token, boolean isMemberDollExist) { - return SignInServiceResponse.builder() - .accessToken(token.getAccessToken()) - .refreshToken(token.getRefreshToken()) - .isMemberDollExist(isMemberDollExist) - .build(); - } + public static SignInServiceResponse of(Token token, boolean isMemberDollExist) { + return SignInServiceResponse.builder() + .accessToken(token.getAccessToken()) + .refreshToken(token.getRefreshToken()) + .isMemberDollExist(isMemberDollExist) + .build(); + } } diff --git a/src/main/java/com/soptie/server/auth/service/dto/response/TokenGetServiceResponse.java b/src/main/java/com/soptie/server/auth/service/dto/response/TokenGetServiceResponse.java index 70adb2c7..f8754ce7 100644 --- a/src/main/java/com/soptie/server/auth/service/dto/response/TokenGetServiceResponse.java +++ b/src/main/java/com/soptie/server/auth/service/dto/response/TokenGetServiceResponse.java @@ -1,18 +1,18 @@ package com.soptie.server.auth.service.dto.response; +import static lombok.AccessLevel.*; + import lombok.Builder; import lombok.NonNull; -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record TokenGetServiceResponse( - @NonNull String accessToken + @NonNull String accessToken ) { - public static TokenGetServiceResponse of(String accessToken) { - return TokenGetServiceResponse.builder() - .accessToken(accessToken) - .build(); - } + public static TokenGetServiceResponse of(String accessToken) { + return TokenGetServiceResponse.builder() + .accessToken(accessToken) + .build(); + } } diff --git a/src/main/java/com/soptie/server/auth/vo/Token.java b/src/main/java/com/soptie/server/auth/vo/Token.java index 76f17d0a..b2fde336 100644 --- a/src/main/java/com/soptie/server/auth/vo/Token.java +++ b/src/main/java/com/soptie/server/auth/vo/Token.java @@ -1,32 +1,38 @@ package com.soptie.server.auth.vo; +import java.util.Objects; + import lombok.Builder; import lombok.Getter; -import java.util.Objects; - @Getter public class Token { - private final String accessToken; - private final String refreshToken; - - @Builder - public Token(String accessToken, String refreshToken) { - this.accessToken = accessToken; - this.refreshToken = refreshToken; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Token token = (Token) o; - return Objects.equals(accessToken, token.accessToken) && Objects.equals(refreshToken, token.refreshToken); - } - - @Override - public int hashCode() { - return Objects.hash(accessToken, refreshToken); - } + private final String accessToken; + private final String refreshToken; + + @Builder + public Token(String accessToken, String refreshToken) { + this.accessToken = accessToken; + this.refreshToken = refreshToken; + } + + @Override + public boolean equals(Object object) { + if (this == object) { + return true; + } + + if (object == null || getClass() != object.getClass()) { + return false; + } + + Token token = (Token)object; + return Objects.equals(accessToken, token.accessToken) && Objects.equals(refreshToken, token.refreshToken); + } + + @Override + public int hashCode() { + return Objects.hash(accessToken, refreshToken); + } } diff --git a/src/main/java/com/soptie/server/common/config/RestTemplateConfig.java b/src/main/java/com/soptie/server/common/config/RestTemplateConfig.java index b0102b7f..e7d768ef 100644 --- a/src/main/java/com/soptie/server/common/config/RestTemplateConfig.java +++ b/src/main/java/com/soptie/server/common/config/RestTemplateConfig.java @@ -7,8 +7,8 @@ @Configuration public class RestTemplateConfig { - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } } diff --git a/src/main/java/com/soptie/server/common/config/SecurityConfig.java b/src/main/java/com/soptie/server/common/config/SecurityConfig.java index 1f8df683..8d15e68a 100644 --- a/src/main/java/com/soptie/server/common/config/SecurityConfig.java +++ b/src/main/java/com/soptie/server/common/config/SecurityConfig.java @@ -1,8 +1,5 @@ package com.soptie.server.common.config; -import com.soptie.server.auth.jwt.CustomJwtAuthenticationEntryPoint; -import com.soptie.server.auth.jwt.JwtAuthenticationFilter; -import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @@ -14,59 +11,64 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import com.soptie.server.auth.jwt.CustomJwtAuthenticationEntryPoint; +import com.soptie.server.auth.jwt.JwtAuthenticationFilter; + +import lombok.RequiredArgsConstructor; + @Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig { - private final JwtAuthenticationFilter jwtAuthenticationFilter; - private final CustomJwtAuthenticationEntryPoint customJwtAuthenticationEntryPoint; + private final JwtAuthenticationFilter jwtAuthenticationFilter; + private final CustomJwtAuthenticationEntryPoint customJwtAuthenticationEntryPoint; - @Bean - @Profile("dev") - public SecurityFilterChain filterChainDev(HttpSecurity http) throws Exception { - permitSwaggerUri(http); - setHttp(http); - return http.build(); - } + @Bean + @Profile("dev") + public SecurityFilterChain filterChainDev(HttpSecurity http) throws Exception { + permitSwaggerUri(http); + setHttp(http); + return http.build(); + } - private void permitSwaggerUri(HttpSecurity http) throws Exception { - http.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests - .requestMatchers(new AntPathRequestMatcher("/v3/api-docs/**")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/docs/**")).permitAll()); - } + private void permitSwaggerUri(HttpSecurity http) throws Exception { + http.authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests + .requestMatchers(new AntPathRequestMatcher("/v3/api-docs/**")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/docs/**")).permitAll()); + } - @Bean - @Profile("prod") - public SecurityFilterChain filterChainProd(HttpSecurity http) throws Exception { - setHttp(http); - return http.build(); - } + @Bean + @Profile("prod") + public SecurityFilterChain filterChainProd(HttpSecurity http) throws Exception { + setHttp(http); + return http.build(); + } - private void setHttp(HttpSecurity http) throws Exception { - authorizeHttpRequests(http); - http.csrf(AbstractHttpConfigurer::disable) - .formLogin(AbstractHttpConfigurer::disable) - .sessionManagement(sessionManagement -> - sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS) - ) - .exceptionHandling(exceptionHandling -> - exceptionHandling.authenticationEntryPoint(customJwtAuthenticationEntryPoint)) - .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); - } + private void setHttp(HttpSecurity http) throws Exception { + authorizeHttpRequests(http); + http.csrf(AbstractHttpConfigurer::disable) + .formLogin(AbstractHttpConfigurer::disable) + .sessionManagement(sessionManagement -> + sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS) + ) + .exceptionHandling(exceptionHandling -> + exceptionHandling.authenticationEntryPoint(customJwtAuthenticationEntryPoint)) + .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); + } - private void authorizeHttpRequests(HttpSecurity http) throws Exception { - http.authorizeHttpRequests(authorizeHttpRequests -> - authorizeHttpRequests - .requestMatchers(new AntPathRequestMatcher("/api/v1/auth", "POST")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/api/v1/test")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/api/v1/routines/daily/themes")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/api/v1/routines/daily")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/api/v1/dolls/image/{type}")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/api/v1/versions/client/app")).permitAll() - .requestMatchers(new AntPathRequestMatcher("/error")).permitAll() - .anyRequest().authenticated() - ); - } + private void authorizeHttpRequests(HttpSecurity http) throws Exception { + http.authorizeHttpRequests(authorizeHttpRequests -> + authorizeHttpRequests + .requestMatchers(new AntPathRequestMatcher("/api/v1/auth", "POST")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/api/v1/test")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/api/v1/routines/daily/themes")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/api/v1/routines/daily")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/api/v1/dolls/image/{type}")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/api/v1/versions/client/app")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/error")).permitAll() + .anyRequest().authenticated() + ); + } } diff --git a/src/main/java/com/soptie/server/common/config/SwaggerConfig.java b/src/main/java/com/soptie/server/common/config/SwaggerConfig.java index b709b869..cc4b2499 100644 --- a/src/main/java/com/soptie/server/common/config/SwaggerConfig.java +++ b/src/main/java/com/soptie/server/common/config/SwaggerConfig.java @@ -18,7 +18,7 @@ public class SwaggerConfig { @Bean - public OpenAPI openAPI() { + public OpenAPI openApi() { val securityScheme = new SecurityScheme(); securityScheme.setType(HTTP); securityScheme.setScheme("bearer"); @@ -36,8 +36,8 @@ public OpenAPI openAPI() { info.setVersion("1.0.0"); return new OpenAPI() - .components(components) - .security(List.of(securityRequirement)) - .info(info); + .components(components) + .security(List.of(securityRequirement)) + .info(info); } } diff --git a/src/main/java/com/soptie/server/common/config/ValueConfig.java b/src/main/java/com/soptie/server/common/config/ValueConfig.java index 21cf351b..b5611a5b 100644 --- a/src/main/java/com/soptie/server/common/config/ValueConfig.java +++ b/src/main/java/com/soptie/server/common/config/ValueConfig.java @@ -1,57 +1,57 @@ package com.soptie.server.common.config; -import jakarta.annotation.PostConstruct; -import lombok.Getter; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; -import java.nio.charset.StandardCharsets; -import java.util.Base64; +import jakarta.annotation.PostConstruct; +import lombok.Getter; @Configuration @Getter public class ValueConfig { - @Value("${jwt.secret}") - private String secretKey; - - @Value("${jwt.KAKAO_URL}") - private String kakaoUri; - - @Value("${jwt.APPLE_URL}") - private String appleUri; - - @Value("${jwt.ACCESS_TOKEN_EXPIRED}") - private Long accessTokenExpired; - - @Value("${jwt.REFRESH_TOKEN_EXPIRED}") - private Long refreshTokenExpired; - - private final String IOS_FORCE_UPDATE_VERSION = "0.0.9"; - private final String IOS_APP_VERSION = "1.0.0"; - private final String ANDROID_FORCE_UPDATE_VERSION = "1.0.1"; - private final String ANDROID_APP_VERSION = "1.0.1"; - private final String NOTIFICATION_TITLE = "새로운 버전이 업데이트 되었어요!"; - private final String NOTIFICATION_CONTENT = "안정적인 서비스 사용을 위해\n최신버전으로 업데이트 해주세요."; - private final String TOKEN_VALUE_DELIMITER = "\\."; - private final String BEARER_HEADER = "Bearer "; - private final String BLANK = ""; - private final String MODULUS = "n"; - private final String EXPONENT = "e"; - private final String KID_HEADER_KEY = "kid"; - private final String ALG_HEADER_KEY = "alg"; - private final String RSA = "RSA"; - private final String KEY = "keys"; - private final String ID = "sub"; - private final int QUOTES = 1; - private final int POSITIVE_NUMBER = 1; - - public static final int MIN_COTTON_COUNT = 0; - public static final int DAILY_ROUTINE_MAX_COUNT = 3; - public static final String MEMBER_DOLL_CONDITION = "^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z]{1,10}$"; - - @PostConstruct - protected void init() { - secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes(StandardCharsets.UTF_8)); - } + @Value("${jwt.secret}") + private String secretKey; + + @Value("${jwt.KAKAO_URL}") + private String kakaoUri; + + @Value("${jwt.APPLE_URL}") + private String appleUri; + + @Value("${jwt.ACCESS_TOKEN_EXPIRED}") + private Long accessTokenExpired; + + @Value("${jwt.REFRESH_TOKEN_EXPIRED}") + private Long refreshTokenExpired; + + public static final String IOS_FORCE_UPDATE_VERSION = "0.0.9"; + public static final String IOS_APP_VERSION = "1.0.0"; + public static final String ANDROID_FORCE_UPDATE_VERSION = "1.0.1"; + public static final String ANDROID_APP_VERSION = "1.0.1"; + public static final String NOTIFICATION_TITLE = "새로운 버전이 업데이트 되었어요!"; + public static final String NOTIFICATION_CONTENT = "안정적인 서비스 사용을 위해\n최신버전으로 업데이트 해주세요."; + public static final String TOKEN_VALUE_DELIMITER = "\\."; + public static final String BEARER_HEADER = "Bearer "; + public static final String BLANK = ""; + public static final String MODULUS = "n"; + public static final String EXPONENT = "e"; + public static final String KID_HEADER_KEY = "kid"; + public static final String ALG_HEADER_KEY = "alg"; + public static final String RSA = "RSA"; + public static final String KEY = "keys"; + public static final String ID = "sub"; + public static final int QUOTES = 1; + public static final int POSITIVE_NUMBER = 1; + public static final int MIN_COTTON_COUNT = 0; + public static final int DAILY_ROUTINE_MAX_COUNT = 3; + public static final String MEMBER_DOLL_CONDITION = "^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z]{1,10}$"; + + @PostConstruct + protected void init() { + secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes(StandardCharsets.UTF_8)); + } } diff --git a/src/main/java/com/soptie/server/common/dto/BaseResponse.java b/src/main/java/com/soptie/server/common/dto/BaseResponse.java index 1f0122c4..b54da690 100644 --- a/src/main/java/com/soptie/server/common/dto/BaseResponse.java +++ b/src/main/java/com/soptie/server/common/dto/BaseResponse.java @@ -4,5 +4,7 @@ public interface BaseResponse { boolean success(); - @NonNull String message(); + + @NonNull + String message(); } diff --git a/src/main/java/com/soptie/server/common/dto/ErrorResponse.java b/src/main/java/com/soptie/server/common/dto/ErrorResponse.java index f415f749..c7fd422a 100644 --- a/src/main/java/com/soptie/server/common/dto/ErrorResponse.java +++ b/src/main/java/com/soptie/server/common/dto/ErrorResponse.java @@ -1,10 +1,11 @@ package com.soptie.server.common.dto; -import lombok.AccessLevel; +import static lombok.AccessLevel.*; + import lombok.Builder; import lombok.NonNull; -@Builder(access = AccessLevel.PRIVATE) +@Builder(access = PRIVATE) public record ErrorResponse( boolean success, @NonNull String message @@ -12,8 +13,8 @@ public record ErrorResponse( public static ErrorResponse of(String message) { return ErrorResponse.builder() - .success(false) - .message(message) - .build(); + .success(false) + .message(message) + .build(); } } diff --git a/src/main/java/com/soptie/server/common/dto/SuccessResponse.java b/src/main/java/com/soptie/server/common/dto/SuccessResponse.java index 538eb14f..c8b2e710 100644 --- a/src/main/java/com/soptie/server/common/dto/SuccessResponse.java +++ b/src/main/java/com/soptie/server/common/dto/SuccessResponse.java @@ -1,31 +1,22 @@ package com.soptie.server.common.dto; +import static com.fasterxml.jackson.annotation.JsonInclude.Include.*; +import static lombok.AccessLevel.*; + import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.AccessLevel; + import lombok.Builder; import lombok.NonNull; -import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL; - -@Builder(access = AccessLevel.PRIVATE) -public record SuccessResponse( - boolean success, - @NonNull String message, - @JsonInclude(value = NON_NULL) T data -) implements BaseResponse { +@Builder(access = PRIVATE) +public record SuccessResponse(boolean success, @NonNull String message, @JsonInclude(value = NON_NULL) T data) + implements BaseResponse { public static SuccessResponse success(String message, T data) { - return SuccessResponse.builder() - .success(true) - .message(message) - .data(data) - .build(); + return SuccessResponse.builder().success(true).message(message).data(data).build(); } public static SuccessResponse success(String message) { - return SuccessResponse.builder() - .success(true) - .message(message) - .build(); + return SuccessResponse.builder().success(true).message(message).build(); } } diff --git a/src/main/java/com/soptie/server/common/handler/ErrorHandler.java b/src/main/java/com/soptie/server/common/handler/ErrorHandler.java index 9a32a43d..7224f89c 100644 --- a/src/main/java/com/soptie/server/common/handler/ErrorHandler.java +++ b/src/main/java/com/soptie/server/common/handler/ErrorHandler.java @@ -2,20 +2,20 @@ import static com.soptie.server.common.dto.ErrorResponse.*; -import com.soptie.server.common.dto.BaseResponse; -import com.soptie.server.memberDoll.exception.MemberDollException; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import com.soptie.server.auth.exception.AuthException; +import com.soptie.server.common.dto.BaseResponse; import com.soptie.server.doll.exception.DollException; +import com.soptie.server.member.exception.MemberDollException; import com.soptie.server.member.exception.MemberException; import com.soptie.server.routine.exception.RoutineException; import com.soptie.server.theme.exception.ThemeException; import lombok.extern.slf4j.Slf4j; -import lombok.*; +import lombok.val; @Slf4j @RestControllerAdvice diff --git a/src/main/java/com/soptie/server/common/support/UriGenerator.java b/src/main/java/com/soptie/server/common/support/UriGenerator.java index 29c2a625..c75991fc 100644 --- a/src/main/java/com/soptie/server/common/support/UriGenerator.java +++ b/src/main/java/com/soptie/server/common/support/UriGenerator.java @@ -8,11 +8,19 @@ @Component public class UriGenerator { - public static URI getURI(String path, long id) { + public static URI getUri(String path, long id) { return ServletUriComponentsBuilder - .fromCurrentRequest() - .path(path + id) - .buildAndExpand() - .toUri(); + .fromCurrentRequest() + .path(path + id) + .buildAndExpand() + .toUri(); + } + + public static URI getUri(String path) { + return ServletUriComponentsBuilder + .fromCurrentRequest() + .path(path) + .buildAndExpand() + .toUri(); } } diff --git a/src/main/java/com/soptie/server/conversation/adapter/ConversationFinder.java b/src/main/java/com/soptie/server/conversation/adapter/ConversationFinder.java index eb43bb1b..f24cc7fc 100644 --- a/src/main/java/com/soptie/server/conversation/adapter/ConversationFinder.java +++ b/src/main/java/com/soptie/server/conversation/adapter/ConversationFinder.java @@ -1,19 +1,20 @@ package com.soptie.server.conversation.adapter; +import java.util.List; + import com.soptie.server.common.support.RepositoryAdapter; import com.soptie.server.conversation.entity.Conversation; import com.soptie.server.conversation.repository.ConversationRepository; -import lombok.RequiredArgsConstructor; -import java.util.List; +import lombok.RequiredArgsConstructor; @RepositoryAdapter @RequiredArgsConstructor public class ConversationFinder { - private final ConversationRepository conversationRepository; + private final ConversationRepository conversationRepository; - public List findAll() { - return conversationRepository.findAll(); - } + public List findAll() { + return conversationRepository.findAll(); + } } diff --git a/src/main/java/com/soptie/server/conversation/entity/Conversation.java b/src/main/java/com/soptie/server/conversation/entity/Conversation.java index 8c77abc6..c6e4e9ed 100644 --- a/src/main/java/com/soptie/server/conversation/entity/Conversation.java +++ b/src/main/java/com/soptie/server/conversation/entity/Conversation.java @@ -5,8 +5,6 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,15 +13,15 @@ @Getter public class Conversation { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "conversation_id") - private Long id; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "conversation_id") + private Long id; - private String content; + private String content; - public Conversation(Long id, String content) { - this.id = id; - this.content = content; - } + public Conversation(Long id, String content) { + this.id = id; + this.content = content; + } } diff --git a/src/main/java/com/soptie/server/conversation/repository/ConversationRepository.java b/src/main/java/com/soptie/server/conversation/repository/ConversationRepository.java index 3151dbf8..01ca328b 100644 --- a/src/main/java/com/soptie/server/conversation/repository/ConversationRepository.java +++ b/src/main/java/com/soptie/server/conversation/repository/ConversationRepository.java @@ -1,7 +1,8 @@ package com.soptie.server.conversation.repository; -import com.soptie.server.conversation.entity.Conversation; import org.springframework.data.jpa.repository.JpaRepository; +import com.soptie.server.conversation.entity.Conversation; + public interface ConversationRepository extends JpaRepository { } diff --git a/src/main/java/com/soptie/server/doll/adapter/DollFinder.java b/src/main/java/com/soptie/server/doll/adapter/DollFinder.java index 132f35c6..aa20923b 100644 --- a/src/main/java/com/soptie/server/doll/adapter/DollFinder.java +++ b/src/main/java/com/soptie/server/doll/adapter/DollFinder.java @@ -1,22 +1,23 @@ package com.soptie.server.doll.adapter; +import static com.soptie.server.doll.message.ErrorCode.*; + import com.soptie.server.common.support.RepositoryAdapter; import com.soptie.server.doll.entity.Doll; import com.soptie.server.doll.entity.DollType; import com.soptie.server.doll.exception.DollException; import com.soptie.server.doll.repository.DollRepository; -import lombok.RequiredArgsConstructor; -import static com.soptie.server.doll.message.ErrorCode.INVALID_TYPE; +import lombok.RequiredArgsConstructor; @RepositoryAdapter @RequiredArgsConstructor public class DollFinder { - private final DollRepository dollRepository; + private final DollRepository dollRepository; - public Doll findByType(DollType type) { - return dollRepository.findByDollType(type) - .orElseThrow(() -> new DollException(INVALID_TYPE)); - } + public Doll findByType(DollType type) { + return dollRepository.findByDollType(type) + .orElseThrow(() -> new DollException(INVALID_TYPE)); + } } diff --git a/src/main/java/com/soptie/server/doll/controller/DollApi.java b/src/main/java/com/soptie/server/doll/controller/DollApi.java index 2987fd5e..4f084ebd 100644 --- a/src/main/java/com/soptie/server/doll/controller/DollApi.java +++ b/src/main/java/com/soptie/server/doll/controller/DollApi.java @@ -1,7 +1,5 @@ package com.soptie.server.doll.controller; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.enums.ParameterIn; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; @@ -11,6 +9,8 @@ import com.soptie.server.doll.entity.DollType; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -20,33 +20,29 @@ public interface DollApi { @Operation( - summary = "인형 이미지 불러오기", - description = "인형 이미지를 불러온다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "400", - description = "유효하지 않은 인형 타입", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } + summary = "인형 이미지 불러오기", + description = "인형 이미지를 불러온다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "400", + description = "유효하지 않은 인형 타입", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) ResponseEntity> getDollImages( - @Parameter( - name = "type", - description = "인형 타입", - in = ParameterIn.PATH, - example = "BROWN" - ) @PathVariable DollType type + @Parameter( + name = "type", + description = "인형 타입", + in = ParameterIn.PATH, + example = "BROWN" + ) @PathVariable DollType type ); } diff --git a/src/main/java/com/soptie/server/doll/controller/DollController.java b/src/main/java/com/soptie/server/doll/controller/DollController.java index 8236aafb..7613e3b6 100644 --- a/src/main/java/com/soptie/server/doll/controller/DollController.java +++ b/src/main/java/com/soptie/server/doll/controller/DollController.java @@ -14,7 +14,8 @@ import com.soptie.server.doll.entity.DollType; import com.soptie.server.doll.service.DollService; -import lombok.*; +import lombok.RequiredArgsConstructor; +import lombok.val; @RestController @RequiredArgsConstructor diff --git a/src/main/java/com/soptie/server/doll/entity/DollImage.java b/src/main/java/com/soptie/server/doll/entity/DollImage.java index 2b85e37c..21cf6d6f 100644 --- a/src/main/java/com/soptie/server/doll/entity/DollImage.java +++ b/src/main/java/com/soptie/server/doll/entity/DollImage.java @@ -1,14 +1,15 @@ package com.soptie.server.doll.entity; +import static lombok.AccessLevel.*; + import jakarta.persistence.Embeddable; -import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Embeddable @NoArgsConstructor -@AllArgsConstructor(access = AccessLevel.PACKAGE) +@AllArgsConstructor(access = PACKAGE) @Getter public class DollImage { diff --git a/src/main/java/com/soptie/server/doll/message/ErrorCode.java b/src/main/java/com/soptie/server/doll/message/ErrorCode.java index 51da151f..66fc32da 100644 --- a/src/main/java/com/soptie/server/doll/message/ErrorCode.java +++ b/src/main/java/com/soptie/server/doll/message/ErrorCode.java @@ -13,8 +13,7 @@ public enum ErrorCode { /* 400 BAD_REQUEST : 잘못된 요청 */ INVALID_TYPE(BAD_REQUEST, "유효하지 않은 인형 타입입니다."), - INVALID_NAME(BAD_REQUEST, "조건에 맞지 않는 이름입니다."), - ; + INVALID_NAME(BAD_REQUEST, "조건에 맞지 않는 이름입니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/soptie/server/doll/message/SuccessMessage.java b/src/main/java/com/soptie/server/doll/message/SuccessMessage.java index fc2b37a7..e8c05d49 100644 --- a/src/main/java/com/soptie/server/doll/message/SuccessMessage.java +++ b/src/main/java/com/soptie/server/doll/message/SuccessMessage.java @@ -7,8 +7,7 @@ @Getter public enum SuccessMessage { - SUCCESS_GET_IMAGE("인형 이미지 조회 성공"), - ; + SUCCESS_GET_IMAGE("인형 이미지 조회 성공"); private final String message; } diff --git a/src/main/java/com/soptie/server/doll/service/DollServiceImpl.java b/src/main/java/com/soptie/server/doll/service/DollServiceImpl.java index bb49b553..f7f492b8 100644 --- a/src/main/java/com/soptie/server/doll/service/DollServiceImpl.java +++ b/src/main/java/com/soptie/server/doll/service/DollServiceImpl.java @@ -11,7 +11,8 @@ import com.soptie.server.doll.exception.DollException; import com.soptie.server.doll.repository.DollRepository; -import lombok.*; +import lombok.RequiredArgsConstructor; +import lombok.val; @Service @RequiredArgsConstructor diff --git a/src/main/java/com/soptie/server/member/adapter/MemberDeleter.java b/src/main/java/com/soptie/server/member/adapter/MemberDeleter.java index 1e94d10d..393ccc3a 100644 --- a/src/main/java/com/soptie/server/member/adapter/MemberDeleter.java +++ b/src/main/java/com/soptie/server/member/adapter/MemberDeleter.java @@ -3,15 +3,16 @@ import com.soptie.server.common.support.RepositoryAdapter; import com.soptie.server.member.entity.Member; import com.soptie.server.member.repository.MemberRepository; + import lombok.RequiredArgsConstructor; @RepositoryAdapter @RequiredArgsConstructor public class MemberDeleter { - private final MemberRepository memberRepository; + private final MemberRepository memberRepository; - public void delete(Member member) { - memberRepository.delete(member); - } + public void delete(Member member) { + memberRepository.delete(member); + } } diff --git a/src/main/java/com/soptie/server/member/adapter/MemberDollSaver.java b/src/main/java/com/soptie/server/member/adapter/MemberDollSaver.java new file mode 100644 index 00000000..d4427c7c --- /dev/null +++ b/src/main/java/com/soptie/server/member/adapter/MemberDollSaver.java @@ -0,0 +1,18 @@ +package com.soptie.server.member.adapter; + +import com.soptie.server.common.support.RepositoryAdapter; +import com.soptie.server.member.entity.MemberDoll; +import com.soptie.server.member.repository.MemberDollRepository; + +import lombok.RequiredArgsConstructor; + +@RepositoryAdapter +@RequiredArgsConstructor +public class MemberDollSaver { + + private final MemberDollRepository memberDollRepository; + + public void save(MemberDoll memberDoll) { + memberDollRepository.save(memberDoll); + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineDeleter.java b/src/main/java/com/soptie/server/member/adapter/MemberRoutineDeleter.java similarity index 69% rename from src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineDeleter.java rename to src/main/java/com/soptie/server/member/adapter/MemberRoutineDeleter.java index d500877e..a8973dae 100644 --- a/src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineDeleter.java +++ b/src/main/java/com/soptie/server/member/adapter/MemberRoutineDeleter.java @@ -1,11 +1,11 @@ -package com.soptie.server.memberRoutine.adapter; +package com.soptie.server.member.adapter; import com.soptie.server.common.support.RepositoryAdapter; +import com.soptie.server.member.entity.DeletedMemberRoutine; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.entity.DeletedMemberRoutine; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.memberRoutine.repository.DeletedMemberRoutineRepository; -import com.soptie.server.memberRoutine.repository.MemberRoutineRepository; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.member.repository.DeletedMemberRoutineRepository; +import com.soptie.server.member.repository.MemberRoutineRepository; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineFinder.java b/src/main/java/com/soptie/server/member/adapter/MemberRoutineFinder.java similarity index 77% rename from src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineFinder.java rename to src/main/java/com/soptie/server/member/adapter/MemberRoutineFinder.java index b2e5f9ab..4b9bf75f 100644 --- a/src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineFinder.java +++ b/src/main/java/com/soptie/server/member/adapter/MemberRoutineFinder.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.adapter; +package com.soptie.server.member.adapter; import static com.soptie.server.routine.entity.RoutineType.*; import static com.soptie.server.routine.message.RoutineErrorCode.*; @@ -8,10 +8,10 @@ import com.soptie.server.common.support.RepositoryAdapter; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.memberRoutine.repository.MemberRoutineRepository; -import com.soptie.server.memberRoutine.repository.dto.MemberChallengeResponse; -import com.soptie.server.memberRoutine.repository.dto.MemberRoutineResponse; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.member.repository.MemberRoutineRepository; +import com.soptie.server.member.repository.dto.MemberChallengeResponse; +import com.soptie.server.member.repository.dto.MemberRoutineResponse; import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.exception.RoutineException; @@ -29,7 +29,7 @@ public boolean isExist(Member member, Routine routine) { public MemberRoutine findById(long id) { return memberRoutineRepository.findById(id) - .orElseThrow(() -> new RoutineException(INVALID_ROUTINE)); + .orElseThrow(() -> new RoutineException(INVALID_ROUTINE)); } public List findAchieved() { diff --git a/src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineSaver.java b/src/main/java/com/soptie/server/member/adapter/MemberRoutineSaver.java similarity index 68% rename from src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineSaver.java rename to src/main/java/com/soptie/server/member/adapter/MemberRoutineSaver.java index 0ef58b2d..1a1e34e8 100644 --- a/src/main/java/com/soptie/server/memberRoutine/adapter/MemberRoutineSaver.java +++ b/src/main/java/com/soptie/server/member/adapter/MemberRoutineSaver.java @@ -1,17 +1,17 @@ -package com.soptie.server.memberRoutine.adapter; +package com.soptie.server.member.adapter; import static com.soptie.server.routine.entity.RoutineType.*; import java.util.Optional; import com.soptie.server.common.support.RepositoryAdapter; +import com.soptie.server.member.entity.DeletedMemberRoutine; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.entity.DeletedMemberRoutine; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.memberRoutine.repository.DeletedMemberRoutineRepository; -import com.soptie.server.memberRoutine.repository.MemberRoutineRepository; -import com.soptie.server.routine.entity.Routine; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.member.repository.DeletedMemberRoutineRepository; +import com.soptie.server.member.repository.MemberRoutineRepository; import com.soptie.server.routine.entity.Challenge; +import com.soptie.server.routine.entity.Routine; import lombok.RequiredArgsConstructor; import lombok.val; @@ -25,14 +25,14 @@ public class MemberRoutineSaver { public MemberRoutine checkHasDeletedAndSave(Member member, Routine routine) { return findDeleted(member, routine) - .map(this::deleteHistoryAndSave) - .orElseGet(() -> save(new MemberRoutine(member, routine))); + .map(this::deleteHistoryAndSave) + .orElseGet(() -> save(new MemberRoutine(member, routine))); } public MemberRoutine checkHasDeletedAndSave(Member member, Challenge challenge) { return findDeleted(member, challenge) - .map(this::deleteHistoryAndSave) - .orElseGet(() -> save(new MemberRoutine(member, challenge))); + .map(this::deleteHistoryAndSave) + .orElseGet(() -> save(new MemberRoutine(member, challenge))); } private MemberRoutine save(MemberRoutine memberRoutine) { @@ -41,12 +41,12 @@ private MemberRoutine save(MemberRoutine memberRoutine) { private Optional findDeleted(Member member, Routine routine) { return deletedMemberRoutineRepository - .findByMemberAndTypeAndRoutineId(member, routine.getType(), routine.getId()); + .findByMemberAndTypeAndRoutineId(member, routine.getType(), routine.getId()); } private Optional findDeleted(Member member, Challenge challenge) { return deletedMemberRoutineRepository - .findByMemberAndTypeAndRoutineId(member, CHALLENGE, challenge.getId()); + .findByMemberAndTypeAndRoutineId(member, CHALLENGE, challenge.getId()); } private MemberRoutine deleteHistoryAndSave(DeletedMemberRoutine deletedMemberRoutine) { diff --git a/src/main/java/com/soptie/server/member/controller/MemberApi.java b/src/main/java/com/soptie/server/member/controller/MemberApi.java deleted file mode 100644 index c684d39f..00000000 --- a/src/main/java/com/soptie/server/member/controller/MemberApi.java +++ /dev/null @@ -1,146 +0,0 @@ -package com.soptie.server.member.controller; - -import java.security.Principal; - -import com.soptie.server.member.controller.dto.request.MemberProfileCreateRequest; -import com.soptie.server.member.controller.dto.response.MemberCottonCountGetResponse; -import com.soptie.server.member.controller.dto.response.MemberHomeInfoGetResponse; -import io.swagger.v3.oas.annotations.enums.ParameterIn; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; - -import com.soptie.server.common.dto.BaseResponse; -import com.soptie.server.common.dto.ErrorResponse; -import com.soptie.server.common.dto.SuccessResponse; -import com.soptie.server.member.entity.CottonType; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Tag(name = "members", description = "회원 API") -public interface MemberApi { - - @Operation( - summary = "멤버 프로필 생성", - description = "멤버 프로필을 생성한다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), - @ApiResponse( - responseCode = "400", - description = "유효하지 않은 인형 타입", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "400", - description = "조건에 맞지 않는 이름", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "404", - description = "유효하지 않은 회원", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "409", - description = "이미 존재하는 프로필", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity createMemberProfile( - @Parameter(hidden = true) Principal principal, - @RequestBody MemberProfileCreateRequest request - ); - - @Operation( - summary = "솜뭉치 주기", - description = "솜뭉치를 준다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "400", - description = "솜뭉치 부족", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "404", - description = "유효하지 않은 회원", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "404", - description = "인형을 가지고 있지 않은 회원", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> giveCotton( - @Parameter(hidden = true) Principal principal, - @Parameter( - name = "cottonType", - description = "솜뭉치 타입", - in = ParameterIn.PATH, - example = "DAILY" - ) @PathVariable CottonType cottonType - ); - - @Operation( - summary = "홈 화면 불러오기", - description = "홈 화면을 불러온다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "404", - description = "유효하지 않은 회원", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "404", - description = "인형을 가지고 있지 않은 회원", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> getMemberHomeInfo( - @Parameter(hidden = true) Principal principal - ); -} diff --git a/src/main/java/com/soptie/server/member/controller/MemberController.java b/src/main/java/com/soptie/server/member/controller/MemberController.java deleted file mode 100644 index c7a42237..00000000 --- a/src/main/java/com/soptie/server/member/controller/MemberController.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.soptie.server.member.controller; - -import com.soptie.server.common.dto.BaseResponse; -import com.soptie.server.common.dto.SuccessResponse; -import com.soptie.server.member.controller.dto.request.MemberProfileCreateRequest; -import com.soptie.server.member.controller.dto.response.MemberCottonCountGetResponse; -import com.soptie.server.member.controller.dto.response.MemberHomeInfoGetResponse; -import com.soptie.server.member.service.dto.request.CottonGiveServiceRequest; -import com.soptie.server.member.service.dto.request.MemberHomeInfoGetServiceRequest; -import com.soptie.server.member.service.dto.request.MemberProfileCreateServiceRequest; -import com.soptie.server.member.entity.CottonType; -import com.soptie.server.member.service.MemberService; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.support.ServletUriComponentsBuilder; - -import java.net.URI; -import java.security.Principal; - -import static com.soptie.server.common.dto.SuccessResponse.*; -import static com.soptie.server.member.message.SuccessMessage.SUCCESS_CREATE_PROFILE; -import static com.soptie.server.member.message.SuccessMessage.SUCCESS_GIVE_COTTON; -import static com.soptie.server.member.message.SuccessMessage.*; - -@RestController -@RequiredArgsConstructor -@RequestMapping("api/v1/members") -public class MemberController implements MemberApi { - - private final MemberService memberService; - - @PostMapping - public ResponseEntity createMemberProfile( - Principal principal, - @RequestBody MemberProfileCreateRequest request - ) { - val memberId = Long.parseLong(principal.getName()); - memberService.createMemberProfile(MemberProfileCreateServiceRequest.of(memberId, request)); - return ResponseEntity.created(getURI()).body(success(SUCCESS_CREATE_PROFILE.getMessage())); - } - - private URI getURI() { - return ServletUriComponentsBuilder - .fromCurrentRequest() - .path("/") - .buildAndExpand() - .toUri(); - } - - @PatchMapping("/cotton/{cottonType}") - public ResponseEntity> giveCotton( - Principal principal, - @PathVariable CottonType cottonType - ) { - val memberId = Long.parseLong(principal.getName()); - val response = MemberCottonCountGetResponse.of( - memberService.giveCotton(CottonGiveServiceRequest.of(memberId, cottonType))); - return ResponseEntity.ok(success(SUCCESS_GIVE_COTTON.getMessage(), response)); - } - - @GetMapping - public ResponseEntity> getMemberHomeInfo(Principal principal) { - val memberId = Long.parseLong(principal.getName()); - val response = MemberHomeInfoGetResponse.of( - memberService.getMemberHomeInfo(MemberHomeInfoGetServiceRequest.of(memberId))); - return ResponseEntity.ok(success(SUCCESS_HOME_INFO.getMessage(), response)); - } -} diff --git a/src/main/java/com/soptie/server/member/controller/dto/request/MemberProfileCreateRequest.java b/src/main/java/com/soptie/server/member/controller/dto/request/MemberProfileCreateRequest.java deleted file mode 100644 index 84415a1a..00000000 --- a/src/main/java/com/soptie/server/member/controller/dto/request/MemberProfileCreateRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.soptie.server.member.controller.dto.request; - -import com.soptie.server.doll.entity.DollType; -import lombok.NonNull; - -import java.util.List; - -public record MemberProfileCreateRequest( - @NonNull DollType dollType, - @NonNull String name, - @NonNull List routines -) { -} diff --git a/src/main/java/com/soptie/server/member/controller/dto/response/MemberCottonCountGetResponse.java b/src/main/java/com/soptie/server/member/controller/dto/response/MemberCottonCountGetResponse.java deleted file mode 100644 index fbc6f4af..00000000 --- a/src/main/java/com/soptie/server/member/controller/dto/response/MemberCottonCountGetResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.soptie.server.member.controller.dto.response; - -import com.soptie.server.member.service.dto.response.MemberCottonCountGetServiceResponse; -import lombok.Builder; - -import static lombok.AccessLevel.PRIVATE; - -@Builder(access = PRIVATE) -public record MemberCottonCountGetResponse( - int cottonCount -) { - - public static MemberCottonCountGetResponse of(MemberCottonCountGetServiceResponse response) { - return MemberCottonCountGetResponse.builder() - .cottonCount(response.cottonCount()) - .build(); - } -} diff --git a/src/main/java/com/soptie/server/member/controller/dto/response/MemberHomeInfoGetResponse.java b/src/main/java/com/soptie/server/member/controller/dto/response/MemberHomeInfoGetResponse.java deleted file mode 100644 index 1ccc9950..00000000 --- a/src/main/java/com/soptie/server/member/controller/dto/response/MemberHomeInfoGetResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.soptie.server.member.controller.dto.response; - -import com.soptie.server.doll.entity.DollType; -import com.soptie.server.member.service.dto.response.MemberHomeInfoGetServiceResponse; -import lombok.Builder; -import lombok.NonNull; - -import java.util.List; - -import static lombok.AccessLevel.PRIVATE; - -@Builder(access = PRIVATE) -public record MemberHomeInfoGetResponse( - @NonNull String name, - @NonNull DollType dollType, - @NonNull String frameImageUrl, - int dailyCottonCount, - int happinessCottonCount, - @NonNull List conversations -) { - - public static MemberHomeInfoGetResponse of(MemberHomeInfoGetServiceResponse response) { - return MemberHomeInfoGetResponse.builder() - .name(response.name()) - .dollType(response.dollType()) - .frameImageUrl(response.frameImageUrl()) - .dailyCottonCount(response.dailyCottonCount()) - .happinessCottonCount(response.happinessCottonCount()) - .conversations(response.conversations()) - .build(); - } -} diff --git a/src/main/java/com/soptie/server/member/controller/v1/MemberController.java b/src/main/java/com/soptie/server/member/controller/v1/MemberController.java new file mode 100644 index 00000000..c517d03d --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/MemberController.java @@ -0,0 +1,68 @@ +package com.soptie.server.member.controller.v1; + +import static com.soptie.server.common.dto.SuccessResponse.*; +import static com.soptie.server.common.support.UriGenerator.*; +import static com.soptie.server.member.message.MemberSuccessMessage.*; + +import java.security.Principal; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.soptie.server.common.dto.BaseResponse; +import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.member.controller.v1.docs.MemberApi; +import com.soptie.server.member.controller.v1.dto.request.MemberProfileCreateRequest; +import com.soptie.server.member.controller.v1.dto.response.MemberCottonCountGetResponse; +import com.soptie.server.member.controller.v1.dto.response.MemberHomeInfoGetResponse; +import com.soptie.server.member.entity.CottonType; +import com.soptie.server.member.service.MemberService; +import com.soptie.server.member.service.dto.request.CottonGiveServiceRequest; +import com.soptie.server.member.service.dto.request.MemberHomeInfoGetServiceRequest; +import com.soptie.server.member.service.dto.request.MemberProfileCreateServiceRequest; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@RestController +@RequiredArgsConstructor +@RequestMapping("api/v1/members") +public class MemberController implements MemberApi { + + private final MemberService memberService; + + @PostMapping + public ResponseEntity createMemberProfile( + Principal principal, + @RequestBody MemberProfileCreateRequest request + ) { + val memberId = Long.parseLong(principal.getName()); + memberService.createMemberProfile(MemberProfileCreateServiceRequest.of(memberId, request)); + return ResponseEntity.created(getUri("/")).body(success(SUCCESS_CREATE_PROFILE.getMessage())); + } + + @PatchMapping("/cotton/{cottonType}") + public ResponseEntity> giveCotton( + Principal principal, + @PathVariable CottonType cottonType + ) { + val memberId = Long.parseLong(principal.getName()); + val response = MemberCottonCountGetResponse.of( + memberService.giveCotton(CottonGiveServiceRequest.of(memberId, cottonType))); + return ResponseEntity.ok(success(SUCCESS_GIVE_COTTON.getMessage(), response)); + } + + @GetMapping + public ResponseEntity> getMemberHomeInfo(Principal principal) { + val memberId = Long.parseLong(principal.getName()); + val response = MemberHomeInfoGetResponse.of( + memberService.getMemberHomeInfo(MemberHomeInfoGetServiceRequest.of(memberId))); + return ResponseEntity.ok(success(SUCCESS_HOME_INFO.getMessage(), response)); + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberDailyRoutineController.java b/src/main/java/com/soptie/server/member/controller/v1/MemberDailyRoutineController.java similarity index 57% rename from src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberDailyRoutineController.java rename to src/main/java/com/soptie/server/member/controller/v1/MemberDailyRoutineController.java index b3456068..aaf77e3a 100644 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberDailyRoutineController.java +++ b/src/main/java/com/soptie/server/member/controller/v1/MemberDailyRoutineController.java @@ -1,7 +1,7 @@ -package com.soptie.server.memberRoutine.controller.v1; +package com.soptie.server.member.controller.v1; import static com.soptie.server.common.dto.SuccessResponse.*; -import static com.soptie.server.memberRoutine.message.SuccessMessage.*; +import static com.soptie.server.member.message.MemberRoutineSuccessMassage.*; import java.security.Principal; import java.util.List; @@ -20,19 +20,19 @@ import com.soptie.server.common.dto.BaseResponse; import com.soptie.server.common.dto.SuccessResponse; import com.soptie.server.common.support.UriGenerator; -import com.soptie.server.memberRoutine.controller.v1.api.MemberDailyRoutineApi; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineAchieveResponse; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineCreateResponse; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineListGetResponse; -import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; -import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberDailyRoutineCreateRequest; -import com.soptie.server.memberRoutine.service.MemberRoutineDeleteService; -import com.soptie.server.memberRoutine.service.MemberRoutineReadService; -import com.soptie.server.memberRoutine.service.MemberRoutineUpdateService; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineAchieveServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineCreateServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutinesDeleteServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineListGetServiceRequest; +import com.soptie.server.member.controller.v1.docs.MemberDailyRoutineApi; +import com.soptie.server.member.controller.v1.dto.request.MemberDailyRoutineCreateRequest; +import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineAchieveResponse; +import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineCreateResponse; +import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineListGetResponse; +import com.soptie.server.member.service.dto.request.routine.MemberRoutineAchieveServiceRequest; +import com.soptie.server.member.service.dto.request.routine.MemberRoutinesDeleteServiceRequest; +import com.soptie.server.member.service.dto.request.routine.daily.MemberDailyRoutineCreateServiceRequest; +import com.soptie.server.member.service.dto.request.routine.daily.MemberDailyRoutineListGetServiceRequest; +import com.soptie.server.member.service.routine.MemberRoutineCreateService; +import com.soptie.server.member.service.routine.MemberRoutineDeleteService; +import com.soptie.server.member.service.routine.MemberRoutineReadService; +import com.soptie.server.member.service.routine.MemberRoutineUpdateService; import lombok.RequiredArgsConstructor; import lombok.val; @@ -49,21 +49,21 @@ public class MemberDailyRoutineController implements MemberDailyRoutineApi { @PostMapping public ResponseEntity> createMemberDailyRoutine( - Principal principal, - @RequestBody MemberDailyRoutineCreateRequest request + Principal principal, + @RequestBody MemberDailyRoutineCreateRequest request ) { val memberId = Long.parseLong(principal.getName()); val response = MemberDailyRoutineCreateResponse.of(memberRoutineCreateService.createDailyRoutine( - MemberDailyRoutineCreateServiceRequest.of(memberId, request))); + MemberDailyRoutineCreateServiceRequest.of(memberId, request))); return ResponseEntity - .created(UriGenerator.getURI("/api/v1/routines/daily/member/", response.routineId())) - .body(success(SUCCESS_CREATE_ROUTINE.getMessage(), response)); + .created(UriGenerator.getUri("/api/v1/routines/daily/member/", response.routineId())) + .body(success(SUCCESS_CREATE_ROUTINE.getMessage(), response)); } @DeleteMapping public ResponseEntity deleteMemberDailyRoutines( - Principal principal, - @RequestParam List routines + Principal principal, + @RequestParam List routines ) { val memberId = Long.parseLong(principal.getName()); memberRoutineDeleteService.deleteMemberRoutines(MemberRoutinesDeleteServiceRequest.of(memberId, routines)); @@ -72,23 +72,23 @@ public ResponseEntity deleteMemberDailyRoutines( @PatchMapping("/routine/{routineId}") public ResponseEntity> achieveMemberDailyRoutine( - Principal principal, - @PathVariable long routineId + Principal principal, + @PathVariable long routineId ) { val memberId = Long.parseLong(principal.getName()); val response = MemberDailyRoutineAchieveResponse - .of(memberRoutineUpdateService.achieveMemberRoutine( - MemberRoutineAchieveServiceRequest.of(memberId, routineId))); + .of(memberRoutineUpdateService.achieveMemberRoutine( + MemberRoutineAchieveServiceRequest.of(memberId, routineId))); return ResponseEntity.ok(success(SUCCESS_ACHIEVE_ROUTINE.getMessage(), response)); } @GetMapping public ResponseEntity> getMemberDailyRoutines( - Principal principal + Principal principal ) { val memberId = Long.parseLong(principal.getName()); val response = MemberDailyRoutineListGetResponse - .of(memberRoutineReadService.getDailyRoutines(MemberDailyRoutineListGetServiceRequest.of(memberId))); + .of(memberRoutineReadService.getDailyRoutines(MemberDailyRoutineListGetServiceRequest.of(memberId))); return ResponseEntity.ok(success(SUCCESS_GET_ROUTINE.getMessage(), response)); } } diff --git a/src/main/java/com/soptie/server/member/controller/v1/MemberHappinessRoutineController.java b/src/main/java/com/soptie/server/member/controller/v1/MemberHappinessRoutineController.java new file mode 100644 index 00000000..1a030d83 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/MemberHappinessRoutineController.java @@ -0,0 +1,87 @@ +package com.soptie.server.member.controller.v1; + +import static com.soptie.server.common.dto.SuccessResponse.*; +import static com.soptie.server.member.message.MemberRoutineSuccessMassage.*; + +import java.security.Principal; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.soptie.server.common.dto.BaseResponse; +import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.common.support.UriGenerator; +import com.soptie.server.member.controller.v1.docs.MemberHappinessRoutineApi; +import com.soptie.server.member.controller.v1.dto.request.MemberHappinessRoutineRequest; +import com.soptie.server.member.controller.v1.dto.response.MemberHappinessRoutineCreateResponse; +import com.soptie.server.member.controller.v1.dto.response.MemberHappinessRoutineGetResponse; +import com.soptie.server.member.service.dto.request.routine.MemberRoutineAchieveServiceRequest; +import com.soptie.server.member.service.dto.request.routine.MemberRoutineDeleteServiceRequest; +import com.soptie.server.member.service.dto.request.routine.happiness.MemberHappinessRoutineCreateServiceRequest; +import com.soptie.server.member.service.dto.request.routine.happiness.MemberHappinessRoutineGetServiceRequest; +import com.soptie.server.member.service.routine.MemberRoutineCreateService; +import com.soptie.server.member.service.routine.MemberRoutineDeleteService; +import com.soptie.server.member.service.routine.MemberRoutineReadService; +import com.soptie.server.member.service.routine.MemberRoutineUpdateService; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/routines/happiness/member") +public class MemberHappinessRoutineController implements MemberHappinessRoutineApi { + + private final MemberRoutineCreateService memberRoutineCreateService; + private final MemberRoutineReadService memberRoutineReadService; + private final MemberRoutineUpdateService memberRoutineUpdateService; + private final MemberRoutineDeleteService memberRoutineDeleteService; + + @PostMapping + public ResponseEntity> createMemberHappinessRoutine( + Principal principal, @RequestBody MemberHappinessRoutineRequest request) { + val memberId = Long.parseLong(principal.getName()); + val response = MemberHappinessRoutineCreateResponse.of(memberRoutineCreateService.createHappinessRoutine( + MemberHappinessRoutineCreateServiceRequest.of(memberId, request))); + return ResponseEntity + .created(UriGenerator.getUri("/api/v1/routines/happiness/member", response.routineId())) + .body(success(SUCCESS_CREATE_ROUTINE.getMessage(), response)); + } + + @GetMapping + public ResponseEntity getMemberHappinessRoutine(Principal principal) { + val memberId = Long.parseLong(principal.getName()); + return memberRoutineReadService.getHappinessRoutine(MemberHappinessRoutineGetServiceRequest.of(memberId)) + .map(response -> ResponseEntity.ok(SuccessResponse.success( + SUCCESS_GET_ROUTINE.getMessage(), + MemberHappinessRoutineGetResponse.of(response)))) + .orElseGet(() -> ResponseEntity.noContent().build()); + } + + @DeleteMapping("/routine/{routineId}") + public ResponseEntity deleteMemberHappinessRoutine( + Principal principal, + @PathVariable Long routineId + ) { + val memberId = Long.parseLong(principal.getName()); + memberRoutineDeleteService.deleteMemberRoutine(MemberRoutineDeleteServiceRequest.of(memberId, routineId)); + return ResponseEntity.ok(success(SUCCESS_DELETE_ROUTINE.getMessage())); + } + + @PatchMapping("/routine/{routineId}") + public ResponseEntity achieveMemberHappinessRoutine( + Principal principal, + @PathVariable Long routineId + ) { + val memberId = Long.parseLong(principal.getName()); + memberRoutineUpdateService.achieveMemberRoutine(MemberRoutineAchieveServiceRequest.of(memberId, routineId)); + return ResponseEntity.ok(success(SUCCESS_ACHIEVE_ROUTINE.getMessage())); + } +} diff --git a/src/main/java/com/soptie/server/member/controller/v1/docs/MemberApi.java b/src/main/java/com/soptie/server/member/controller/v1/docs/MemberApi.java new file mode 100644 index 00000000..1f235d20 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/docs/MemberApi.java @@ -0,0 +1,127 @@ +package com.soptie.server.member.controller.v1.docs; + +import java.security.Principal; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; + +import com.soptie.server.common.dto.BaseResponse; +import com.soptie.server.common.dto.ErrorResponse; +import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.member.controller.v1.dto.request.MemberProfileCreateRequest; +import com.soptie.server.member.controller.v1.dto.response.MemberCottonCountGetResponse; +import com.soptie.server.member.controller.v1.dto.response.MemberHomeInfoGetResponse; +import com.soptie.server.member.entity.CottonType; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "members", description = "회원 API") +public interface MemberApi { + + @Operation( + summary = "멤버 프로필 생성", + description = "멤버 프로필을 생성한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), + @ApiResponse( + responseCode = "400", + description = "유효하지 않은 인형 타입", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "400", + description = "조건에 맞지 않는 이름", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "404", + description = "유효하지 않은 회원", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "409", + description = "이미 존재하는 프로필", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity createMemberProfile( + @Parameter(hidden = true) Principal principal, + @RequestBody MemberProfileCreateRequest request + ); + + @Operation( + summary = "솜뭉치 주기", + description = "솜뭉치를 준다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "400", + description = "솜뭉치 부족", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "404", + description = "유효하지 않은 회원", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "404", + description = "인형을 가지고 있지 않은 회원", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> giveCotton( + @Parameter(hidden = true) Principal principal, + @Parameter( + name = "cottonType", + description = "솜뭉치 타입", + in = ParameterIn.PATH, + example = "DAILY" + ) @PathVariable CottonType cottonType + ); + + @Operation( + summary = "홈 화면 불러오기", + description = "홈 화면을 불러온다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "404", + description = "유효하지 않은 회원", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "404", + description = "인형을 가지고 있지 않은 회원", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> getMemberHomeInfo( + @Parameter(hidden = true) Principal principal + ); +} diff --git a/src/main/java/com/soptie/server/member/controller/v1/docs/MemberDailyRoutineApi.java b/src/main/java/com/soptie/server/member/controller/v1/docs/MemberDailyRoutineApi.java new file mode 100644 index 00000000..01089e71 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/docs/MemberDailyRoutineApi.java @@ -0,0 +1,133 @@ +package com.soptie.server.member.controller.v1.docs; + +import java.security.Principal; +import java.util.List; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import com.soptie.server.common.dto.BaseResponse; +import com.soptie.server.common.dto.ErrorResponse; +import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.member.controller.v1.dto.request.MemberDailyRoutineCreateRequest; +import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineAchieveResponse; +import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineCreateResponse; +import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineListGetResponse; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "member daily routines V1", description = "회원의 데일리 루틴 API Version1") +public interface MemberDailyRoutineApi { + + @Operation( + summary = "데일리 루틴 추가", + description = "회원의 데일리 루틴을 추가한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> createMemberDailyRoutine( + @Parameter(hidden = true) Principal principal, + @RequestBody MemberDailyRoutineCreateRequest request + ); + + @Operation( + summary = "데일리 루틴 삭제", + description = "회원의 데일리 루틴을 삭제한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity deleteMemberDailyRoutines( + @Parameter(hidden = true) Principal principal, + @Parameter( + name = "routines", + description = "삭제할 회원의 데일리 루틴 id 목록", + in = ParameterIn.QUERY, + example = "1,2,3" + ) @RequestParam List routines + ); + + @Operation( + summary = "데일리 루틴 달성", + description = "회원의 데일리 루틴을 달성한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> achieveMemberDailyRoutine( + @Parameter(hidden = true) Principal principal, + @Parameter( + name = "routineId", + description = "달성한 회원의 데일리 루틴 id", + in = ParameterIn.PATH, + example = "1" + ) @PathVariable long routineId + ); + + @Operation( + summary = "회원의 데일리 루틴 목록 조회", + description = "회원의 데일리 루틴을 달성 여부, 달성 횟수, 루틴 이름 순으로 정렬된 목록으로 조회한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> getMemberDailyRoutines( + @Parameter(hidden = true) Principal principal + ); +} diff --git a/src/main/java/com/soptie/server/member/controller/v1/docs/MemberHappinessRoutineApi.java b/src/main/java/com/soptie/server/member/controller/v1/docs/MemberHappinessRoutineApi.java new file mode 100644 index 00000000..7e67ad25 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/docs/MemberHappinessRoutineApi.java @@ -0,0 +1,139 @@ +package com.soptie.server.member.controller.v1.docs; + +import java.security.Principal; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; + +import com.soptie.server.common.dto.BaseResponse; +import com.soptie.server.common.dto.ErrorResponse; +import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.member.controller.v1.dto.request.MemberHappinessRoutineRequest; +import com.soptie.server.member.controller.v1.dto.response.MemberHappinessRoutineCreateResponse; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "member happiness routines V1", description = "회원의 행복 루틴 API Version1") +public interface MemberHappinessRoutineApi { + + @Operation( + summary = "행복 루틴 추가", + description = "회원의 행복 루틴을 추가한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> createMemberHappinessRoutine( + @Parameter(hidden = true) Principal principal, + @RequestBody MemberHappinessRoutineRequest request + ); + + @Operation( + summary = "회원의 행복 루틴 목록 조회", + description = "회원의 행복 루틴을 조회한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), + @ApiResponse( + responseCode = "204", + description = "데이터 없음", + content = @Content(schema = @Schema(implementation = BaseResponse.class))), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity getMemberHappinessRoutine(@Parameter(hidden = true) Principal principal); + + @Operation( + summary = "행복 루틴 삭제", + description = "회원의 행복 루틴을 삭제한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity deleteMemberHappinessRoutine( + @Parameter(hidden = true) Principal principal, + @Parameter( + name = "routineId", + description = "삭제할 회원의 행복 루틴 id", + in = ParameterIn.PATH, + example = "1" + ) + @PathVariable Long routineId + ); + + @Operation( + summary = "행복 루틴 달성", + description = "회원의 행복 루틴을 달성한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity achieveMemberHappinessRoutine( + @Parameter(hidden = true) Principal principal, + @Parameter( + name = "routineId", + description = "달성한 회원의 행복 루틴 id", + in = ParameterIn.PATH, + example = "1" + ) + @PathVariable Long routineId + ); +} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/request/MemberDailyRoutineCreateRequest.java b/src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberDailyRoutineCreateRequest.java similarity index 51% rename from src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/request/MemberDailyRoutineCreateRequest.java rename to src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberDailyRoutineCreateRequest.java index e0e2268f..2cb8eff9 100644 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/request/MemberDailyRoutineCreateRequest.java +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberDailyRoutineCreateRequest.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.controller.v1.dto.request; +package com.soptie.server.member.controller.v1.dto.request; public record MemberDailyRoutineCreateRequest( long routineId diff --git a/src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberHappinessRoutineRequest.java b/src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberHappinessRoutineRequest.java new file mode 100644 index 00000000..9e5871eb --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberHappinessRoutineRequest.java @@ -0,0 +1,6 @@ +package com.soptie.server.member.controller.v1.dto.request; + +public record MemberHappinessRoutineRequest( + long subRoutineId +) { +} diff --git a/src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberProfileCreateRequest.java b/src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberProfileCreateRequest.java new file mode 100644 index 00000000..ee545386 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/request/MemberProfileCreateRequest.java @@ -0,0 +1,14 @@ +package com.soptie.server.member.controller.v1.dto.request; + +import java.util.List; + +import com.soptie.server.doll.entity.DollType; + +import lombok.NonNull; + +public record MemberProfileCreateRequest( + @NonNull DollType dollType, + @NonNull String name, + @NonNull List routines +) { +} diff --git a/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberCottonCountGetResponse.java b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberCottonCountGetResponse.java new file mode 100644 index 00000000..d5f44020 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberCottonCountGetResponse.java @@ -0,0 +1,19 @@ +package com.soptie.server.member.controller.v1.dto.response; + +import static lombok.AccessLevel.*; + +import com.soptie.server.member.service.dto.response.MemberCottonCountGetServiceResponse; + +import lombok.Builder; + +@Builder(access = PRIVATE) +public record MemberCottonCountGetResponse( + int cottonCount +) { + + public static MemberCottonCountGetResponse of(MemberCottonCountGetServiceResponse response) { + return MemberCottonCountGetResponse.builder() + .cottonCount(response.cottonCount()) + .build(); + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java similarity index 54% rename from src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java rename to src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java index e1cb5dd7..d18e5e3f 100644 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineAchieveResponse.java @@ -1,8 +1,8 @@ -package com.soptie.server.memberRoutine.controller.v1.dto.response; +package com.soptie.server.member.controller.v1.dto.response; import static lombok.AccessLevel.*; -import com.soptie.server.memberRoutine.service.dto.response.MemberRoutineAchieveServiceResponse; +import com.soptie.server.member.service.dto.response.routine.MemberRoutineAchieveServiceResponse; import lombok.Builder; @@ -15,9 +15,9 @@ public record MemberDailyRoutineAchieveResponse( public static MemberDailyRoutineAchieveResponse of(MemberRoutineAchieveServiceResponse response) { return MemberDailyRoutineAchieveResponse.builder() - .routineId(response.routineId()) - .isAchieve(response.isAchieve()) - .achieveCount(response.achieveCount()) - .build(); + .routineId(response.routineId()) + .isAchieve(response.isAchieve()) + .achieveCount(response.achieveCount()) + .build(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineCreateResponse.java b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineCreateResponse.java similarity index 59% rename from src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineCreateResponse.java rename to src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineCreateResponse.java index ed17daac..45abdeab 100644 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineCreateResponse.java +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineCreateResponse.java @@ -1,8 +1,8 @@ -package com.soptie.server.memberRoutine.controller.v1.dto.response; +package com.soptie.server.member.controller.v1.dto.response; import static lombok.AccessLevel.*; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineCreateServiceResponse; +import com.soptie.server.member.service.dto.response.routine.daily.MemberDailyRoutineCreateServiceResponse; import lombok.Builder; @@ -13,7 +13,7 @@ public record MemberDailyRoutineCreateResponse( public static MemberDailyRoutineCreateResponse of(MemberDailyRoutineCreateServiceResponse response) { return MemberDailyRoutineCreateResponse.builder() - .routineId(response.routineId()) - .build(); + .routineId(response.routineId()) + .build(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineListGetResponse.java b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineListGetResponse.java similarity index 69% rename from src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineListGetResponse.java rename to src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineListGetResponse.java index 485310e6..f456c015 100644 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberDailyRoutineListGetResponse.java +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberDailyRoutineListGetResponse.java @@ -1,11 +1,11 @@ -package com.soptie.server.memberRoutine.controller.v1.dto.response; +package com.soptie.server.member.controller.v1.dto.response; import static lombok.AccessLevel.*; import java.util.List; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineListGetServiceResponse; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineListGetServiceResponse.MemberDailyRoutineServiceResponse; +import com.soptie.server.member.service.dto.response.routine.daily.MemberDailyRoutineListGetServiceResponse; +import com.soptie.server.member.service.dto.response.routine.daily.MemberDailyRoutineListGetServiceResponse.MemberDailyRoutineServiceResponse; import lombok.Builder; import lombok.NonNull; @@ -17,8 +17,8 @@ public record MemberDailyRoutineListGetResponse( public static MemberDailyRoutineListGetResponse of(MemberDailyRoutineListGetServiceResponse response) { return MemberDailyRoutineListGetResponse.builder() - .routines(response.routines().stream().map(MemberDailyRoutineResponse::of).toList()) - .build(); + .routines(response.routines().stream().map(MemberDailyRoutineResponse::of).toList()) + .build(); } @Builder(access = PRIVATE) diff --git a/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHappinessRoutineCreateResponse.java b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHappinessRoutineCreateResponse.java new file mode 100644 index 00000000..3e7eeb98 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHappinessRoutineCreateResponse.java @@ -0,0 +1,19 @@ +package com.soptie.server.member.controller.v1.dto.response; + +import static lombok.AccessLevel.*; + +import com.soptie.server.member.service.dto.response.routine.happiness.MemberHappinessRoutineCreateServiceResponse; + +import lombok.Builder; + +@Builder(access = PRIVATE) +public record MemberHappinessRoutineCreateResponse( + long routineId +) { + + public static MemberHappinessRoutineCreateResponse of(MemberHappinessRoutineCreateServiceResponse response) { + return MemberHappinessRoutineCreateResponse.builder() + .routineId(response.routineId()) + .build(); + } +} diff --git a/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHappinessRoutineGetResponse.java b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHappinessRoutineGetResponse.java new file mode 100644 index 00000000..29dd4a83 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHappinessRoutineGetResponse.java @@ -0,0 +1,38 @@ +package com.soptie.server.member.controller.v1.dto.response; + +import static lombok.AccessLevel.*; + +import com.soptie.server.member.service.dto.response.routine.happiness.MemberHappinessRoutineGetServiceResponse; + +import lombok.Builder; +import lombok.NonNull; + +@Builder(access = PRIVATE) +public record MemberHappinessRoutineGetResponse( + long routineId, + @NonNull String iconImageUrl, + @NonNull String contentImageUrl, + @NonNull String themeName, + @NonNull String themeNameColor, + @NonNull String title, + @NonNull String content, + @NonNull String detailContent, + @NonNull String place, + @NonNull String timeTaken +) { + + public static MemberHappinessRoutineGetResponse of(MemberHappinessRoutineGetServiceResponse response) { + return MemberHappinessRoutineGetResponse.builder() + .routineId(response.routineId()) + .iconImageUrl(response.theme().iconImageUrl()) + .contentImageUrl(response.theme().cardImageUrl()) + .themeName(response.theme().name()) + .themeNameColor(response.theme().color()) + .title(response.routineContent()) + .content(response.content()) + .detailContent(response.description()) + .place(response.place()) + .timeTaken(response.requiredTime()) + .build(); + } +} diff --git a/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHomeInfoGetResponse.java b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHomeInfoGetResponse.java new file mode 100644 index 00000000..adb18961 --- /dev/null +++ b/src/main/java/com/soptie/server/member/controller/v1/dto/response/MemberHomeInfoGetResponse.java @@ -0,0 +1,33 @@ +package com.soptie.server.member.controller.v1.dto.response; + +import static lombok.AccessLevel.*; + +import java.util.List; + +import com.soptie.server.doll.entity.DollType; +import com.soptie.server.member.service.dto.response.MemberHomeInfoGetServiceResponse; + +import lombok.Builder; +import lombok.NonNull; + +@Builder(access = PRIVATE) +public record MemberHomeInfoGetResponse( + @NonNull String name, + @NonNull DollType dollType, + @NonNull String frameImageUrl, + int dailyCottonCount, + int happinessCottonCount, + @NonNull List conversations +) { + + public static MemberHomeInfoGetResponse of(MemberHomeInfoGetServiceResponse response) { + return MemberHomeInfoGetResponse.builder() + .name(response.name()) + .dollType(response.dollType()) + .frameImageUrl(response.frameImageUrl()) + .dailyCottonCount(response.dailyCottonCount()) + .happinessCottonCount(response.happinessCottonCount()) + .conversations(response.conversations()) + .build(); + } +} diff --git a/src/main/java/com/soptie/server/member/entity/Cotton.java b/src/main/java/com/soptie/server/member/entity/Cotton.java index 1431aa1a..3f3e83ea 100644 --- a/src/main/java/com/soptie/server/member/entity/Cotton.java +++ b/src/main/java/com/soptie/server/member/entity/Cotton.java @@ -2,19 +2,18 @@ import static com.soptie.server.common.config.ValueConfig.*; import static com.soptie.server.member.message.ErrorCode.*; +import static lombok.AccessLevel.*; import com.soptie.server.member.exception.MemberException; -import com.soptie.server.memberDoll.entity.MemberDoll; import jakarta.persistence.Embeddable; -import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @Embeddable @NoArgsConstructor -@AllArgsConstructor(access = AccessLevel.PACKAGE) +@AllArgsConstructor(access = PACKAGE) @Getter public class Cotton { @@ -25,7 +24,7 @@ protected void addDailyCotton() { this.dailyCottonCount++; } - protected void addHappinessCotton(){ + protected void addHappinessCotton() { this.happinessCottonCount++; } diff --git a/src/main/java/com/soptie/server/member/entity/CottonType.java b/src/main/java/com/soptie/server/member/entity/CottonType.java index a197929c..18afed4a 100644 --- a/src/main/java/com/soptie/server/member/entity/CottonType.java +++ b/src/main/java/com/soptie/server/member/entity/CottonType.java @@ -1,6 +1,6 @@ package com.soptie.server.member.entity; public enum CottonType { - DAILY, - HAPPINESS + DAILY, + HAPPINESS } diff --git a/src/main/java/com/soptie/server/memberRoutine/entity/DeletedMemberRoutine.java b/src/main/java/com/soptie/server/member/entity/DeletedMemberRoutine.java similarity index 94% rename from src/main/java/com/soptie/server/memberRoutine/entity/DeletedMemberRoutine.java rename to src/main/java/com/soptie/server/member/entity/DeletedMemberRoutine.java index 519ffe79..b2cf3aa6 100644 --- a/src/main/java/com/soptie/server/memberRoutine/entity/DeletedMemberRoutine.java +++ b/src/main/java/com/soptie/server/member/entity/DeletedMemberRoutine.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.entity; +package com.soptie.server.member.entity; import static jakarta.persistence.EnumType.*; @@ -7,7 +7,6 @@ import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; -import com.soptie.server.member.entity.Member; import com.soptie.server.routine.entity.RoutineType; import jakarta.persistence.Column; diff --git a/src/main/java/com/soptie/server/member/entity/Member.java b/src/main/java/com/soptie/server/member/entity/Member.java index 40b22777..e92dea5a 100644 --- a/src/main/java/com/soptie/server/member/entity/Member.java +++ b/src/main/java/com/soptie/server/member/entity/Member.java @@ -1,16 +1,26 @@ package com.soptie.server.member.entity; import static com.soptie.server.member.message.ErrorCode.*; +import static jakarta.persistence.EnumType.*; +import static jakarta.persistence.GenerationType.*; + +import java.util.Objects; import com.soptie.server.common.entity.BaseTime; import com.soptie.server.member.exception.MemberException; -import com.soptie.server.memberDoll.entity.MemberDoll; import com.soptie.server.routine.entity.RoutineType; -import jakarta.persistence.*; -import lombok.*; - -import java.util.Objects; +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.Enumerated; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Entity @NoArgsConstructor @@ -18,11 +28,11 @@ public class Member extends BaseTime { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) + @GeneratedValue(strategy = IDENTITY) @Column(name = "member_id") private Long id; - @Enumerated(value = EnumType.STRING) + @Enumerated(value = STRING) private SocialType socialType; private String socialId; @@ -52,7 +62,7 @@ public Member(Long id) { this.id = id; } - public void setMemberDoll(MemberDoll memberDoll) { + public void registerMemberDoll(MemberDoll memberDoll) { this.memberDoll = memberDoll; } diff --git a/src/main/java/com/soptie/server/memberDoll/entity/MemberDoll.java b/src/main/java/com/soptie/server/member/entity/MemberDoll.java similarity index 90% rename from src/main/java/com/soptie/server/memberDoll/entity/MemberDoll.java rename to src/main/java/com/soptie/server/member/entity/MemberDoll.java index 29f6596a..29e47cc4 100644 --- a/src/main/java/com/soptie/server/memberDoll/entity/MemberDoll.java +++ b/src/main/java/com/soptie/server/member/entity/MemberDoll.java @@ -1,10 +1,12 @@ -package com.soptie.server.memberDoll.entity; +package com.soptie.server.member.entity; + +import static com.soptie.server.common.config.ValueConfig.*; +import static com.soptie.server.doll.message.ErrorCode.*; import com.soptie.server.common.entity.BaseTime; import com.soptie.server.doll.entity.Doll; -import com.soptie.server.member.entity.Member; +import com.soptie.server.member.exception.MemberDollException; -import com.soptie.server.memberDoll.exception.MemberDollException; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; @@ -17,9 +19,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import static com.soptie.server.common.config.ValueConfig.*; -import static com.soptie.server.doll.message.ErrorCode.*; - @Entity @NoArgsConstructor @Getter @@ -61,7 +60,7 @@ public MemberDoll(Long id, String name, int happinessCottonCount, Doll doll) { private void setMember(Member member) { this.member = member; - member.setMemberDoll(this); + member.registerMemberDoll(this); } private void setName(String name) { diff --git a/src/main/java/com/soptie/server/memberRoutine/entity/MemberRoutine.java b/src/main/java/com/soptie/server/member/entity/MemberRoutine.java similarity index 93% rename from src/main/java/com/soptie/server/memberRoutine/entity/MemberRoutine.java rename to src/main/java/com/soptie/server/member/entity/MemberRoutine.java index 1929d238..6fe5cf8f 100644 --- a/src/main/java/com/soptie/server/memberRoutine/entity/MemberRoutine.java +++ b/src/main/java/com/soptie/server/member/entity/MemberRoutine.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.entity; +package com.soptie.server.member.entity; import static com.soptie.server.member.message.ErrorCode.*; import static com.soptie.server.routine.entity.RoutineType.*; @@ -8,11 +8,10 @@ import java.time.LocalDate; -import com.soptie.server.member.entity.Member; import com.soptie.server.member.exception.MemberException; +import com.soptie.server.routine.entity.Challenge; import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.entity.RoutineType; -import com.soptie.server.routine.entity.Challenge; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -72,8 +71,8 @@ public MemberRoutine(DeletedMemberRoutine deletedMemberRoutine) { } public MemberRoutine( - Long id, boolean isAchieve, int achieveCount, - RoutineType type, long routineId, Member member + Long id, boolean isAchieve, int achieveCount, + RoutineType type, long routineId, Member member ) { this.id = id; this.isAchieve = isAchieve; diff --git a/src/main/java/com/soptie/server/member/exception/MemberDollException.java b/src/main/java/com/soptie/server/member/exception/MemberDollException.java new file mode 100644 index 00000000..40f43f0c --- /dev/null +++ b/src/main/java/com/soptie/server/member/exception/MemberDollException.java @@ -0,0 +1,16 @@ +package com.soptie.server.member.exception; + +import com.soptie.server.doll.message.ErrorCode; + +import lombok.Getter; + +@Getter +public class MemberDollException extends RuntimeException { + + private final ErrorCode errorCode; + + public MemberDollException(ErrorCode errorCode) { + super("[MemberDollException] : " + errorCode.getMessage()); + this.errorCode = errorCode; + } +} diff --git a/src/main/java/com/soptie/server/member/message/ErrorCode.java b/src/main/java/com/soptie/server/member/message/ErrorCode.java index 90c06ccd..0a55842b 100644 --- a/src/main/java/com/soptie/server/member/message/ErrorCode.java +++ b/src/main/java/com/soptie/server/member/message/ErrorCode.java @@ -20,8 +20,7 @@ public enum ErrorCode { NOT_EXIST_DOLL(NOT_FOUND, "인형을 가지고 있지 않은 회원입니다."), /* 409 CONFLICT : 중복된 데이터 존재 */ - EXIST_PROFILE(CONFLICT, "프로필이 이미 존재합니다."), - ; + EXIST_PROFILE(CONFLICT, "프로필이 이미 존재합니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/soptie/server/memberRoutine/message/SuccessMessage.java b/src/main/java/com/soptie/server/member/message/MemberRoutineSuccessMassage.java similarity index 68% rename from src/main/java/com/soptie/server/memberRoutine/message/SuccessMessage.java rename to src/main/java/com/soptie/server/member/message/MemberRoutineSuccessMassage.java index c9f939b7..8c8b8353 100644 --- a/src/main/java/com/soptie/server/memberRoutine/message/SuccessMessage.java +++ b/src/main/java/com/soptie/server/member/message/MemberRoutineSuccessMassage.java @@ -1,16 +1,15 @@ -package com.soptie.server.memberRoutine.message; +package com.soptie.server.member.message; import lombok.Getter; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Getter -public enum SuccessMessage { +public enum MemberRoutineSuccessMassage { SUCCESS_CREATE_ROUTINE("루틴 추가 성공"), SUCCESS_DELETE_ROUTINE("루틴 삭제 성공"), SUCCESS_ACHIEVE_ROUTINE("루틴 달성 성공"), - SUCCESS_GET_ROUTINE("루틴 조회 성공"), - ; + SUCCESS_GET_ROUTINE("루틴 조회 성공"); private final String message; } diff --git a/src/main/java/com/soptie/server/member/message/MemberSuccessMessage.java b/src/main/java/com/soptie/server/member/message/MemberSuccessMessage.java new file mode 100644 index 00000000..e6d69794 --- /dev/null +++ b/src/main/java/com/soptie/server/member/message/MemberSuccessMessage.java @@ -0,0 +1,15 @@ +package com.soptie.server.member.message; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum MemberSuccessMessage { + + SUCCESS_CREATE_PROFILE("프로필 생성 성공"), + SUCCESS_GIVE_COTTON("솜뭉치 주기 성공"), + SUCCESS_HOME_INFO("홈 화면 불러오기 성공"); + + private final String message; +} diff --git a/src/main/java/com/soptie/server/member/message/SuccessMessage.java b/src/main/java/com/soptie/server/member/message/SuccessMessage.java deleted file mode 100644 index 9b51e8b3..00000000 --- a/src/main/java/com/soptie/server/member/message/SuccessMessage.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.soptie.server.member.message; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public enum SuccessMessage { - - SUCCESS_CREATE_PROFILE("프로필 생성 성공"), - SUCCESS_GIVE_COTTON("솜뭉치 주기 성공"), - SUCCESS_HOME_INFO("홈 화면 불러오기 성공") - ; - - private final String message; -} diff --git a/src/main/java/com/soptie/server/memberRoutine/repository/DeletedMemberRoutineRepository.java b/src/main/java/com/soptie/server/member/repository/DeletedMemberRoutineRepository.java similarity index 81% rename from src/main/java/com/soptie/server/memberRoutine/repository/DeletedMemberRoutineRepository.java rename to src/main/java/com/soptie/server/member/repository/DeletedMemberRoutineRepository.java index da1d2974..03cdc618 100644 --- a/src/main/java/com/soptie/server/memberRoutine/repository/DeletedMemberRoutineRepository.java +++ b/src/main/java/com/soptie/server/member/repository/DeletedMemberRoutineRepository.java @@ -1,15 +1,17 @@ -package com.soptie.server.memberRoutine.repository; +package com.soptie.server.member.repository; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; +import com.soptie.server.member.entity.DeletedMemberRoutine; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.entity.DeletedMemberRoutine; import com.soptie.server.routine.entity.RoutineType; public interface DeletedMemberRoutineRepository extends JpaRepository { Optional findByMemberAndTypeAndRoutineId(Member member, RoutineType type, long routineId); + boolean existsByMemberAndTypeAndRoutineId(Member member, RoutineType type, long routineId); + void deleteByMember(Member member); } diff --git a/src/main/java/com/soptie/server/memberDoll/repository/MemberDollRepository.java b/src/main/java/com/soptie/server/member/repository/MemberDollRepository.java similarity index 58% rename from src/main/java/com/soptie/server/memberDoll/repository/MemberDollRepository.java rename to src/main/java/com/soptie/server/member/repository/MemberDollRepository.java index 516f29d9..622cc76a 100644 --- a/src/main/java/com/soptie/server/memberDoll/repository/MemberDollRepository.java +++ b/src/main/java/com/soptie/server/member/repository/MemberDollRepository.java @@ -1,7 +1,8 @@ -package com.soptie.server.memberDoll.repository; +package com.soptie.server.member.repository; -import com.soptie.server.memberDoll.entity.MemberDoll; import org.springframework.data.jpa.repository.JpaRepository; +import com.soptie.server.member.entity.MemberDoll; + public interface MemberDollRepository extends JpaRepository { } diff --git a/src/main/java/com/soptie/server/member/repository/MemberRepository.java b/src/main/java/com/soptie/server/member/repository/MemberRepository.java index 1ec5716c..048018aa 100644 --- a/src/main/java/com/soptie/server/member/repository/MemberRepository.java +++ b/src/main/java/com/soptie/server/member/repository/MemberRepository.java @@ -1,12 +1,14 @@ package com.soptie.server.member.repository; -import com.soptie.server.member.entity.Member; -import com.soptie.server.member.entity.SocialType; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; -import java.util.Optional; +import com.soptie.server.member.entity.Member; +import com.soptie.server.member.entity.SocialType; public interface MemberRepository extends JpaRepository { - Optional findBySocialTypeAndSocialId(SocialType socialType, String socialId); - Optional findByRefreshToken(String refreshToken); + Optional findBySocialTypeAndSocialId(SocialType socialType, String socialId); + + Optional findByRefreshToken(String refreshToken); } diff --git a/src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineCustomRepository.java b/src/main/java/com/soptie/server/member/repository/MemberRoutineCustomRepository.java similarity index 63% rename from src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineCustomRepository.java rename to src/main/java/com/soptie/server/member/repository/MemberRoutineCustomRepository.java index b699441a..1d1287b7 100644 --- a/src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineCustomRepository.java +++ b/src/main/java/com/soptie/server/member/repository/MemberRoutineCustomRepository.java @@ -1,14 +1,15 @@ -package com.soptie.server.memberRoutine.repository; +package com.soptie.server.member.repository; import java.util.List; import java.util.Optional; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.repository.dto.MemberChallengeResponse; -import com.soptie.server.memberRoutine.repository.dto.MemberRoutineResponse; +import com.soptie.server.member.repository.dto.MemberChallengeResponse; +import com.soptie.server.member.repository.dto.MemberRoutineResponse; import com.soptie.server.routine.entity.RoutineType; public interface MemberRoutineCustomRepository { List findByTypeAndMember(RoutineType type, Member member); + Optional findChallengeByMember(Member member); } diff --git a/src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineRepository.java b/src/main/java/com/soptie/server/member/repository/MemberRoutineRepository.java similarity index 86% rename from src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineRepository.java rename to src/main/java/com/soptie/server/member/repository/MemberRoutineRepository.java index 09a8b400..e2c6c045 100644 --- a/src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineRepository.java +++ b/src/main/java/com/soptie/server/member/repository/MemberRoutineRepository.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.repository; +package com.soptie.server.member.repository; import java.util.List; import java.util.Optional; @@ -6,14 +6,18 @@ import org.springframework.data.jpa.repository.JpaRepository; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.entity.MemberRoutine; +import com.soptie.server.member.entity.MemberRoutine; import com.soptie.server.routine.entity.RoutineType; public interface MemberRoutineRepository extends JpaRepository, MemberRoutineCustomRepository { boolean existsByMemberAndTypeAndRoutineId(Member member, RoutineType type, long routineId); + Optional findByMemberAndTypeAndRoutineId(Member member, RoutineType type, long routineId); + @SuppressWarnings("SpringDataMethodInconsistencyInspection") List findByIsAchieve(boolean isAchieve); + void deleteByMember(Member member); + boolean existsByMemberAndType(Member member, RoutineType type); } diff --git a/src/main/java/com/soptie/server/member/repository/MemberRoutineRepositoryImpl.java b/src/main/java/com/soptie/server/member/repository/MemberRoutineRepositoryImpl.java new file mode 100644 index 00000000..52c6443c --- /dev/null +++ b/src/main/java/com/soptie/server/member/repository/MemberRoutineRepositoryImpl.java @@ -0,0 +1,65 @@ +package com.soptie.server.member.repository; + +import static com.soptie.server.member.entity.QMemberRoutine.*; +import static com.soptie.server.routine.entity.QChallenge.*; +import static com.soptie.server.routine.entity.QRoutine.*; +import static com.soptie.server.routine.entity.RoutineType.*; +import static com.soptie.server.theme.entity.QTheme.*; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.soptie.server.common.support.ExpressionGenerator; +import com.soptie.server.member.entity.Member; +import com.soptie.server.member.repository.dto.MemberChallengeResponse; +import com.soptie.server.member.repository.dto.MemberRoutineResponse; +import com.soptie.server.member.repository.dto.QMemberChallengeResponse; +import com.soptie.server.member.repository.dto.QMemberRoutineResponse; +import com.soptie.server.routine.entity.RoutineType; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class MemberRoutineRepositoryImpl implements MemberRoutineCustomRepository { + + private final JPAQueryFactory queryFactory; + + @Override + public List findByTypeAndMember(RoutineType type, Member member) { + return queryFactory + .select(new QMemberRoutineResponse(memberRoutine, routine)) + .from(memberRoutine) + .leftJoin(routine).on(memberRoutine.routineId.eq(routine.id)) + .leftJoin(routine.theme, theme).fetchJoin() + .where( + memberRoutine.type.eq(type), + memberRoutine.member.eq(member) + ) + .orderBy( + memberRoutine.isAchieve.asc(), + memberRoutine.achieveCount.desc(), + ExpressionGenerator.getFirstLetter(routine.content).asc() + ) + .fetch(); + } + + @Override + public Optional findChallengeByMember(Member member) { + return Optional.ofNullable(queryFactory + .select(new QMemberChallengeResponse(memberRoutine, challenge, theme)) + .from(memberRoutine) + .leftJoin(challenge).on(memberRoutine.routineId.eq(challenge.id)) + .leftJoin(challenge.routine, routine).fetchJoin() + .leftJoin(challenge.routine.theme, theme).fetchJoin() + .where( + memberRoutine.type.eq(CHALLENGE), + memberRoutine.member.eq(member) + ) + .fetchFirst() + ); + } +} diff --git a/src/main/java/com/soptie/server/member/repository/dto/MemberChallengeResponse.java b/src/main/java/com/soptie/server/member/repository/dto/MemberChallengeResponse.java new file mode 100644 index 00000000..feb1ebed --- /dev/null +++ b/src/main/java/com/soptie/server/member/repository/dto/MemberChallengeResponse.java @@ -0,0 +1,30 @@ +package com.soptie.server.member.repository.dto; + +import com.querydsl.core.annotations.QueryProjection; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.routine.entity.Challenge; +import com.soptie.server.theme.entity.Theme; + +public record MemberChallengeResponse( + Long id, + String routineContent, + String content, + String description, + String place, + String requiredTime, + Theme theme +) { + + @QueryProjection + public MemberChallengeResponse(MemberRoutine memberRoutine, Challenge challenge, Theme theme) { + this( + memberRoutine.getId(), + challenge.getRoutine().getContent(), + challenge.getContent(), + challenge.getDescription(), + challenge.getPlace(), + challenge.getRequiredTime(), + theme + ); + } +} diff --git a/src/main/java/com/soptie/server/member/repository/dto/MemberRoutineResponse.java b/src/main/java/com/soptie/server/member/repository/dto/MemberRoutineResponse.java new file mode 100644 index 00000000..f20e5245 --- /dev/null +++ b/src/main/java/com/soptie/server/member/repository/dto/MemberRoutineResponse.java @@ -0,0 +1,27 @@ +package com.soptie.server.member.repository.dto; + +import com.querydsl.core.annotations.QueryProjection; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.routine.entity.Routine; + +public record MemberRoutineResponse( + Long id, + String content, + String iconImageUrl, + String dailyIconImageUrl, + int achieveCount, + boolean isAchieve +) { + + @QueryProjection + public MemberRoutineResponse(MemberRoutine memberRoutine, Routine routine) { + this( + memberRoutine.getId(), + routine.getContent(), + routine.getTheme().getImageInfo().getIconImageUrl(), + routine.getTheme().getImageInfo().getDailyIconImageUrl(), + memberRoutine.getAchieveCount(), + memberRoutine.isAchieve() + ); + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/scheduler/MemberDailyRoutineScheduler.java b/src/main/java/com/soptie/server/member/scheduler/MemberDailyRoutineScheduler.java similarity index 80% rename from src/main/java/com/soptie/server/memberRoutine/scheduler/MemberDailyRoutineScheduler.java rename to src/main/java/com/soptie/server/member/scheduler/MemberDailyRoutineScheduler.java index f308ff33..3864423e 100644 --- a/src/main/java/com/soptie/server/memberRoutine/scheduler/MemberDailyRoutineScheduler.java +++ b/src/main/java/com/soptie/server/member/scheduler/MemberDailyRoutineScheduler.java @@ -1,10 +1,10 @@ -package com.soptie.server.memberRoutine.scheduler; +package com.soptie.server.member.scheduler; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import com.soptie.server.memberRoutine.service.MemberRoutineUpdateService; +import com.soptie.server.member.service.routine.MemberRoutineUpdateService; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/soptie/server/member/service/MemberService.java b/src/main/java/com/soptie/server/member/service/MemberService.java index 2e9c8d9c..3f47138f 100644 --- a/src/main/java/com/soptie/server/member/service/MemberService.java +++ b/src/main/java/com/soptie/server/member/service/MemberService.java @@ -1,16 +1,19 @@ package com.soptie.server.member.service; +import com.soptie.server.member.entity.Member; import com.soptie.server.member.service.dto.request.CottonGiveServiceRequest; import com.soptie.server.member.service.dto.request.MemberHomeInfoGetServiceRequest; +import com.soptie.server.member.service.dto.request.MemberProfileCreateServiceRequest; import com.soptie.server.member.service.dto.response.MemberCottonCountGetServiceResponse; import com.soptie.server.member.service.dto.response.MemberHomeInfoGetServiceResponse; -import com.soptie.server.member.service.dto.request.MemberProfileCreateServiceRequest; -import com.soptie.server.member.entity.Member; public interface MemberService { - void createMemberProfile(MemberProfileCreateServiceRequest request); - MemberCottonCountGetServiceResponse giveCotton(CottonGiveServiceRequest request); - MemberHomeInfoGetServiceResponse getMemberHomeInfo(MemberHomeInfoGetServiceRequest request); - void deleteMember(Member member); + void createMemberProfile(MemberProfileCreateServiceRequest request); + + MemberCottonCountGetServiceResponse giveCotton(CottonGiveServiceRequest request); + + MemberHomeInfoGetServiceResponse getMemberHomeInfo(MemberHomeInfoGetServiceRequest request); + + void deleteMember(Member member); } diff --git a/src/main/java/com/soptie/server/member/service/MemberServiceImpl.java b/src/main/java/com/soptie/server/member/service/MemberServiceImpl.java index 84b96011..0cbcdf94 100644 --- a/src/main/java/com/soptie/server/member/service/MemberServiceImpl.java +++ b/src/main/java/com/soptie/server/member/service/MemberServiceImpl.java @@ -1,95 +1,87 @@ package com.soptie.server.member.service; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + import com.soptie.server.conversation.adapter.ConversationFinder; import com.soptie.server.conversation.entity.Conversation; -import com.soptie.server.conversation.repository.ConversationRepository; import com.soptie.server.doll.adapter.DollFinder; import com.soptie.server.doll.entity.DollType; import com.soptie.server.member.adapter.MemberDeleter; +import com.soptie.server.member.adapter.MemberDollSaver; import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.member.adapter.MemberRoutineSaver; +import com.soptie.server.member.entity.Member; +import com.soptie.server.member.entity.MemberDoll; import com.soptie.server.member.service.dto.request.CottonGiveServiceRequest; import com.soptie.server.member.service.dto.request.MemberHomeInfoGetServiceRequest; +import com.soptie.server.member.service.dto.request.MemberProfileCreateServiceRequest; import com.soptie.server.member.service.dto.response.MemberCottonCountGetServiceResponse; import com.soptie.server.member.service.dto.response.MemberHomeInfoGetServiceResponse; -import com.soptie.server.member.service.dto.request.MemberProfileCreateServiceRequest; -import com.soptie.server.member.entity.Member; -import com.soptie.server.member.exception.MemberException; -import com.soptie.server.member.repository.MemberRepository; -import com.soptie.server.memberDoll.adapter.MemberDollSaver; -import com.soptie.server.memberDoll.entity.MemberDoll; -import com.soptie.server.memberDoll.service.MemberDollService; -import com.soptie.server.memberRoutine.adapter.MemberRoutineSaver; -import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; - import com.soptie.server.routine.adapter.RoutineFinder; + import lombok.RequiredArgsConstructor; import lombok.val; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static com.soptie.server.member.message.ErrorCode.*; @Service @RequiredArgsConstructor @Transactional(readOnly = true) public class MemberServiceImpl implements MemberService { - private final ConversationFinder conversationFinder; - private final MemberFinder memberFinder; - private final MemberDeleter memberDeleter; - private final DollFinder dollFinder; - private final RoutineFinder routineFinder; - private final MemberDollSaver memberDollSaver; - private final MemberRoutineSaver memberRoutineSaver; + private final ConversationFinder conversationFinder; + private final MemberFinder memberFinder; + private final MemberDeleter memberDeleter; + private final DollFinder dollFinder; + private final RoutineFinder routineFinder; + private final MemberDollSaver memberDollSaver; + private final MemberRoutineSaver memberRoutineSaver; - @Override - @Transactional - public void createMemberProfile(MemberProfileCreateServiceRequest request) { - val member = memberFinder.findById(request.memberId()); - member.checkMemberDollNonExist(); - createDailyRoutines(member, request.routines()); - createMemberDoll(member, request.dollType(), request.name()); - } + @Override + @Transactional + public void createMemberProfile(MemberProfileCreateServiceRequest request) { + val member = memberFinder.findById(request.memberId()); + member.checkMemberDollNonExist(); + createDailyRoutines(member, request.routines()); + createMemberDoll(member, request.dollType(), request.name()); + } - @Override - @Transactional - public MemberCottonCountGetServiceResponse giveCotton(CottonGiveServiceRequest request) { - val member = memberFinder.findById(request.memberId()); - val cottonCount = member.subtractAndGetCotton(request.cottonType()); - return MemberCottonCountGetServiceResponse.of(cottonCount); - } + @Override + @Transactional + public MemberCottonCountGetServiceResponse giveCotton(CottonGiveServiceRequest request) { + val member = memberFinder.findById(request.memberId()); + val cottonCount = member.subtractAndGetCotton(request.cottonType()); + return MemberCottonCountGetServiceResponse.of(cottonCount); + } - @Override - public MemberHomeInfoGetServiceResponse getMemberHomeInfo(MemberHomeInfoGetServiceRequest request) { - val member = memberFinder.findById(request.memberId()); - member.checkMemberDollExist(); - val conversations = getConversations(); - return MemberHomeInfoGetServiceResponse.of(member, conversations); - } + @Override + public MemberHomeInfoGetServiceResponse getMemberHomeInfo(MemberHomeInfoGetServiceRequest request) { + val member = memberFinder.findById(request.memberId()); + member.checkMemberDollExist(); + val conversations = getConversations(); + return MemberHomeInfoGetServiceResponse.of(member, conversations); + } - @Override - public void deleteMember(Member member) { - memberDeleter.delete(member); - } + @Override + public void deleteMember(Member member) { + memberDeleter.delete(member); + } - private void createDailyRoutines(Member member, List routineIds) { - routineIds.forEach(id -> { - val routine = routineFinder.findById(id); - memberRoutineSaver.checkHasDeletedAndSave(member, routine); - }); - } + private void createDailyRoutines(Member member, List routineIds) { + routineIds.forEach(id -> { + val routine = routineFinder.findById(id); + memberRoutineSaver.checkHasDeletedAndSave(member, routine); + }); + } - private void createMemberDoll(Member member, DollType dollType, String name) { - val doll = dollFinder.findByType(dollType); - val memberDoll = new MemberDoll(member, doll, name); - memberDollSaver.save(memberDoll); - } + private void createMemberDoll(Member member, DollType dollType, String name) { + val doll = dollFinder.findByType(dollType); + val memberDoll = new MemberDoll(member, doll, name); + memberDollSaver.save(memberDoll); + } - private List getConversations() { - return conversationFinder.findAll().stream() - .map(Conversation::getContent) - .toList(); - } + private List getConversations() { + return conversationFinder.findAll().stream().map(Conversation::getContent).toList(); + } } diff --git a/src/main/java/com/soptie/server/member/service/doll/MemberDollService.java b/src/main/java/com/soptie/server/member/service/doll/MemberDollService.java new file mode 100644 index 00000000..a932129d --- /dev/null +++ b/src/main/java/com/soptie/server/member/service/doll/MemberDollService.java @@ -0,0 +1,12 @@ +package com.soptie.server.member.service.doll; + +import com.soptie.server.doll.entity.DollType; +import com.soptie.server.member.entity.Member; +import com.soptie.server.member.entity.MemberDoll; + +public interface MemberDollService { + + void createMemberDoll(Member member, DollType dollType, String name); + + void deleteMemberDoll(MemberDoll memberDoll); +} diff --git a/src/main/java/com/soptie/server/member/service/doll/MemberDollServiceImpl.java b/src/main/java/com/soptie/server/member/service/doll/MemberDollServiceImpl.java new file mode 100644 index 00000000..2ee96f22 --- /dev/null +++ b/src/main/java/com/soptie/server/member/service/doll/MemberDollServiceImpl.java @@ -0,0 +1,45 @@ +package com.soptie.server.member.service.doll; + +import static com.soptie.server.doll.message.ErrorCode.*; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.soptie.server.doll.entity.Doll; +import com.soptie.server.doll.entity.DollType; +import com.soptie.server.doll.exception.DollException; +import com.soptie.server.doll.repository.DollRepository; +import com.soptie.server.member.entity.Member; +import com.soptie.server.member.entity.MemberDoll; +import com.soptie.server.member.repository.MemberDollRepository; + +import lombok.RequiredArgsConstructor; +import lombok.val; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class MemberDollServiceImpl implements MemberDollService { + + private final MemberDollRepository memberDollRepository; + private final DollRepository dollRepository; + + @Override + @Transactional + public void createMemberDoll(Member member, DollType dollType, String name) { + val doll = findDoll(dollType); + val memberDoll = new MemberDoll(member, doll, name); + memberDollRepository.save(memberDoll); + } + + @Override + @Transactional + public void deleteMemberDoll(MemberDoll memberDoll) { + memberDollRepository.delete(memberDoll); + } + + private Doll findDoll(DollType type) { + return dollRepository.findByDollType(type) + .orElseThrow(() -> new DollException(INVALID_TYPE)); + } +} diff --git a/src/main/java/com/soptie/server/member/service/dto/request/CottonGiveServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/CottonGiveServiceRequest.java index 08128792..8bb7c4d4 100644 --- a/src/main/java/com/soptie/server/member/service/dto/request/CottonGiveServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/CottonGiveServiceRequest.java @@ -1,21 +1,22 @@ package com.soptie.server.member.service.dto.request; +import static lombok.AccessLevel.*; + import com.soptie.server.member.entity.CottonType; + import lombok.Builder; import lombok.NonNull; -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record CottonGiveServiceRequest( - long memberId, - @NonNull CottonType cottonType + long memberId, + @NonNull CottonType cottonType ) { - public static CottonGiveServiceRequest of(long memberId, CottonType cottonType) { - return CottonGiveServiceRequest.builder() - .memberId(memberId) - .cottonType(cottonType) - .build(); - } + public static CottonGiveServiceRequest of(long memberId, CottonType cottonType) { + return CottonGiveServiceRequest.builder() + .memberId(memberId) + .cottonType(cottonType) + .build(); + } } diff --git a/src/main/java/com/soptie/server/member/service/dto/request/MemberHomeInfoGetServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/MemberHomeInfoGetServiceRequest.java index aaa34a78..6c51d057 100644 --- a/src/main/java/com/soptie/server/member/service/dto/request/MemberHomeInfoGetServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/MemberHomeInfoGetServiceRequest.java @@ -1,17 +1,17 @@ package com.soptie.server.member.service.dto.request; -import lombok.Builder; +import static lombok.AccessLevel.*; -import static lombok.AccessLevel.PRIVATE; +import lombok.Builder; @Builder(access = PRIVATE) public record MemberHomeInfoGetServiceRequest( - long memberId + long memberId ) { - public static MemberHomeInfoGetServiceRequest of(long memberId) { - return MemberHomeInfoGetServiceRequest.builder() - .memberId(memberId) - .build(); - } + public static MemberHomeInfoGetServiceRequest of(long memberId) { + return MemberHomeInfoGetServiceRequest.builder() + .memberId(memberId) + .build(); + } } diff --git a/src/main/java/com/soptie/server/member/service/dto/request/MemberProfileCreateServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/MemberProfileCreateServiceRequest.java index e52c102b..ec345893 100644 --- a/src/main/java/com/soptie/server/member/service/dto/request/MemberProfileCreateServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/MemberProfileCreateServiceRequest.java @@ -1,29 +1,29 @@ package com.soptie.server.member.service.dto.request; -import com.soptie.server.doll.entity.DollType; +import static lombok.AccessLevel.*; import java.util.List; -import com.soptie.server.member.controller.dto.request.MemberProfileCreateRequest; +import com.soptie.server.doll.entity.DollType; +import com.soptie.server.member.controller.v1.dto.request.MemberProfileCreateRequest; + import lombok.Builder; import lombok.NonNull; -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record MemberProfileCreateServiceRequest( - long memberId, - @NonNull DollType dollType, - @NonNull String name, - @NonNull List routines + long memberId, + @NonNull DollType dollType, + @NonNull String name, + @NonNull List routines ) { - public static MemberProfileCreateServiceRequest of(long memberId, MemberProfileCreateRequest request) { - return MemberProfileCreateServiceRequest.builder() - .memberId(memberId) - .dollType(request.dollType()) - .name(request.name()) - .routines(request.routines()) - .build(); - } + public static MemberProfileCreateServiceRequest of(long memberId, MemberProfileCreateRequest request) { + return MemberProfileCreateServiceRequest.builder() + .memberId(memberId) + .dollType(request.dollType()) + .name(request.name()) + .routines(request.routines()) + .build(); + } } diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutineAchieveServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutineAchieveServiceRequest.java similarity index 62% rename from src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutineAchieveServiceRequest.java rename to src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutineAchieveServiceRequest.java index db05f27e..65b40542 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutineAchieveServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutineAchieveServiceRequest.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service.dto.request; +package com.soptie.server.member.service.dto.request.routine; import static lombok.AccessLevel.*; @@ -6,14 +6,14 @@ @Builder(access = PRIVATE) public record MemberRoutineAchieveServiceRequest( - long memberId, - long memberRoutineId + long memberId, + long memberRoutineId ) { public static MemberRoutineAchieveServiceRequest of(long memberId, long memberRoutineId) { return MemberRoutineAchieveServiceRequest.builder() - .memberId(memberId) - .memberRoutineId(memberRoutineId) - .build(); + .memberId(memberId) + .memberRoutineId(memberRoutineId) + .build(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutineDeleteServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutineDeleteServiceRequest.java similarity index 64% rename from src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutineDeleteServiceRequest.java rename to src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutineDeleteServiceRequest.java index eb9e504d..cf396e04 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutineDeleteServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutineDeleteServiceRequest.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service.dto.request; +package com.soptie.server.member.service.dto.request.routine; import static lombok.AccessLevel.*; @@ -6,14 +6,14 @@ @Builder(access = PRIVATE) public record MemberRoutineDeleteServiceRequest( - long memberId, - long routineId + long memberId, + long routineId ) { public static MemberRoutineDeleteServiceRequest of(long memberId, long routineId) { return MemberRoutineDeleteServiceRequest.builder() - .memberId(memberId) - .routineId(routineId) - .build(); + .memberId(memberId) + .routineId(routineId) + .build(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutinesDeleteServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutinesDeleteServiceRequest.java similarity index 65% rename from src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutinesDeleteServiceRequest.java rename to src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutinesDeleteServiceRequest.java index 793f05a4..8795aab7 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberRoutinesDeleteServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/routine/MemberRoutinesDeleteServiceRequest.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service.dto.request; +package com.soptie.server.member.service.dto.request.routine; import static lombok.AccessLevel.*; @@ -8,14 +8,14 @@ @Builder(access = PRIVATE) public record MemberRoutinesDeleteServiceRequest( - long memberId, - List routineIds + long memberId, + List routineIds ) { public static MemberRoutinesDeleteServiceRequest of(long memberId, List routineIds) { return MemberRoutinesDeleteServiceRequest.builder() - .memberId(memberId) - .routineIds(routineIds) - .build(); + .memberId(memberId) + .routineIds(routineIds) + .build(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberDailyRoutineCreateServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/routine/daily/MemberDailyRoutineCreateServiceRequest.java similarity index 55% rename from src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberDailyRoutineCreateServiceRequest.java rename to src/main/java/com/soptie/server/member/service/dto/request/routine/daily/MemberDailyRoutineCreateServiceRequest.java index 4138aa92..775a0e04 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberDailyRoutineCreateServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/routine/daily/MemberDailyRoutineCreateServiceRequest.java @@ -1,21 +1,21 @@ -package com.soptie.server.memberRoutine.service.dto.request; +package com.soptie.server.member.service.dto.request.routine.daily; import static lombok.AccessLevel.*; -import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberDailyRoutineCreateRequest; +import com.soptie.server.member.controller.v1.dto.request.MemberDailyRoutineCreateRequest; import lombok.Builder; @Builder(access = PRIVATE) public record MemberDailyRoutineCreateServiceRequest( - long memberId, - long routineId + long memberId, + long routineId ) { public static MemberDailyRoutineCreateServiceRequest of(long memberId, MemberDailyRoutineCreateRequest request) { return MemberDailyRoutineCreateServiceRequest.builder() - .memberId(memberId) - .routineId(request.routineId()) - .build(); + .memberId(memberId) + .routineId(request.routineId()) + .build(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberDailyRoutineListGetServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/routine/daily/MemberDailyRoutineListGetServiceRequest.java similarity index 70% rename from src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberDailyRoutineListGetServiceRequest.java rename to src/main/java/com/soptie/server/member/service/dto/request/routine/daily/MemberDailyRoutineListGetServiceRequest.java index c3d36cbb..3bcdea9c 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberDailyRoutineListGetServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/routine/daily/MemberDailyRoutineListGetServiceRequest.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service.dto.request; +package com.soptie.server.member.service.dto.request.routine.daily; import static lombok.AccessLevel.*; @@ -6,12 +6,12 @@ @Builder(access = PRIVATE) public record MemberDailyRoutineListGetServiceRequest( - long memberId + long memberId ) { public static MemberDailyRoutineListGetServiceRequest of(long memberId) { return MemberDailyRoutineListGetServiceRequest.builder() - .memberId(memberId) - .build(); + .memberId(memberId) + .build(); } } diff --git a/src/main/java/com/soptie/server/member/service/dto/request/routine/happiness/MemberHappinessRoutineCreateServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/routine/happiness/MemberHappinessRoutineCreateServiceRequest.java new file mode 100644 index 00000000..d34c1ad4 --- /dev/null +++ b/src/main/java/com/soptie/server/member/service/dto/request/routine/happiness/MemberHappinessRoutineCreateServiceRequest.java @@ -0,0 +1,21 @@ +package com.soptie.server.member.service.dto.request.routine.happiness; + +import static lombok.AccessLevel.*; + +import com.soptie.server.member.controller.v1.dto.request.MemberHappinessRoutineRequest; + +import lombok.Builder; + +@Builder(access = PRIVATE) +public record MemberHappinessRoutineCreateServiceRequest( + long memberId, + long challengeId +) { + + public static MemberHappinessRoutineCreateServiceRequest of(long memberId, MemberHappinessRoutineRequest request) { + return MemberHappinessRoutineCreateServiceRequest.builder() + .memberId(memberId) + .challengeId(request.subRoutineId()) + .build(); + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberHappinessRoutineGetServiceRequest.java b/src/main/java/com/soptie/server/member/service/dto/request/routine/happiness/MemberHappinessRoutineGetServiceRequest.java similarity index 70% rename from src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberHappinessRoutineGetServiceRequest.java rename to src/main/java/com/soptie/server/member/service/dto/request/routine/happiness/MemberHappinessRoutineGetServiceRequest.java index a44bb5f6..80e6afb9 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberHappinessRoutineGetServiceRequest.java +++ b/src/main/java/com/soptie/server/member/service/dto/request/routine/happiness/MemberHappinessRoutineGetServiceRequest.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service.dto.request; +package com.soptie.server.member.service.dto.request.routine.happiness; import static lombok.AccessLevel.*; @@ -6,12 +6,12 @@ @Builder(access = PRIVATE) public record MemberHappinessRoutineGetServiceRequest( - long memberId + long memberId ) { public static MemberHappinessRoutineGetServiceRequest of(long memberId) { return MemberHappinessRoutineGetServiceRequest.builder() - .memberId(memberId) - .build(); + .memberId(memberId) + .build(); } } diff --git a/src/main/java/com/soptie/server/member/service/dto/response/MemberCottonCountGetServiceResponse.java b/src/main/java/com/soptie/server/member/service/dto/response/MemberCottonCountGetServiceResponse.java index 3f1977a4..72c983dd 100644 --- a/src/main/java/com/soptie/server/member/service/dto/response/MemberCottonCountGetServiceResponse.java +++ b/src/main/java/com/soptie/server/member/service/dto/response/MemberCottonCountGetServiceResponse.java @@ -1,17 +1,17 @@ package com.soptie.server.member.service.dto.response; -import lombok.Builder; +import static lombok.AccessLevel.*; -import static lombok.AccessLevel.PRIVATE; +import lombok.Builder; @Builder(access = PRIVATE) public record MemberCottonCountGetServiceResponse( - int cottonCount + int cottonCount ) { - public static MemberCottonCountGetServiceResponse of(int cottonCount) { - return MemberCottonCountGetServiceResponse.builder() - .cottonCount(cottonCount) - .build(); - } + public static MemberCottonCountGetServiceResponse of(int cottonCount) { + return MemberCottonCountGetServiceResponse.builder() + .cottonCount(cottonCount) + .build(); + } } diff --git a/src/main/java/com/soptie/server/member/service/dto/response/MemberHomeInfoGetServiceResponse.java b/src/main/java/com/soptie/server/member/service/dto/response/MemberHomeInfoGetServiceResponse.java index 1d159db1..addbf7f4 100644 --- a/src/main/java/com/soptie/server/member/service/dto/response/MemberHomeInfoGetServiceResponse.java +++ b/src/main/java/com/soptie/server/member/service/dto/response/MemberHomeInfoGetServiceResponse.java @@ -1,32 +1,33 @@ package com.soptie.server.member.service.dto.response; +import static lombok.AccessLevel.*; + +import java.util.List; + import com.soptie.server.doll.entity.DollType; import com.soptie.server.member.entity.Member; + import lombok.Builder; import lombok.NonNull; -import java.util.List; - -import static lombok.AccessLevel.PRIVATE; - @Builder(access = PRIVATE) public record MemberHomeInfoGetServiceResponse( - @NonNull String name, - @NonNull DollType dollType, - @NonNull String frameImageUrl, - int dailyCottonCount, - int happinessCottonCount, - @NonNull List conversations + @NonNull String name, + @NonNull DollType dollType, + @NonNull String frameImageUrl, + int dailyCottonCount, + int happinessCottonCount, + @NonNull List conversations ) { - public static MemberHomeInfoGetServiceResponse of(Member member, List conversations) { - return MemberHomeInfoGetServiceResponse.builder() - .name(member.getMemberDoll().getName()) - .dollType(member.getMemberDoll().getDoll().getDollType()) - .frameImageUrl(member.getMemberDoll().getDoll().getImageInfo().getFrameImageUrl()) - .dailyCottonCount(member.getCottonInfo().getDailyCottonCount()) - .happinessCottonCount(member.getCottonInfo().getHappinessCottonCount()) - .conversations(conversations) - .build(); - } + public static MemberHomeInfoGetServiceResponse of(Member member, List conversations) { + return MemberHomeInfoGetServiceResponse.builder() + .name(member.getMemberDoll().getName()) + .dollType(member.getMemberDoll().getDoll().getDollType()) + .frameImageUrl(member.getMemberDoll().getDoll().getImageInfo().getFrameImageUrl()) + .dailyCottonCount(member.getCottonInfo().getDailyCottonCount()) + .happinessCottonCount(member.getCottonInfo().getHappinessCottonCount()) + .conversations(conversations) + .build(); + } } diff --git a/src/main/java/com/soptie/server/member/service/dto/response/routine/MemberRoutineAchieveServiceResponse.java b/src/main/java/com/soptie/server/member/service/dto/response/routine/MemberRoutineAchieveServiceResponse.java new file mode 100644 index 00000000..50e09604 --- /dev/null +++ b/src/main/java/com/soptie/server/member/service/dto/response/routine/MemberRoutineAchieveServiceResponse.java @@ -0,0 +1,23 @@ +package com.soptie.server.member.service.dto.response.routine; + +import static lombok.AccessLevel.*; + +import com.soptie.server.member.entity.MemberRoutine; + +import lombok.Builder; + +@Builder(access = PRIVATE) +public record MemberRoutineAchieveServiceResponse( + long routineId, + boolean isAchieve, + int achieveCount +) { + + public static MemberRoutineAchieveServiceResponse of(MemberRoutine routine) { + return MemberRoutineAchieveServiceResponse.builder() + .routineId(routine.getId()) + .isAchieve(routine.isAchieve()) + .achieveCount(routine.getAchieveCount()) + .build(); + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberDailyRoutineCreateServiceResponse.java b/src/main/java/com/soptie/server/member/service/dto/response/routine/daily/MemberDailyRoutineCreateServiceResponse.java similarity index 61% rename from src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberDailyRoutineCreateServiceResponse.java rename to src/main/java/com/soptie/server/member/service/dto/response/routine/daily/MemberDailyRoutineCreateServiceResponse.java index 5739aa99..f5c7ef24 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberDailyRoutineCreateServiceResponse.java +++ b/src/main/java/com/soptie/server/member/service/dto/response/routine/daily/MemberDailyRoutineCreateServiceResponse.java @@ -1,19 +1,19 @@ -package com.soptie.server.memberRoutine.service.dto.response; +package com.soptie.server.member.service.dto.response.routine.daily; import static lombok.AccessLevel.*; -import com.soptie.server.memberRoutine.entity.MemberRoutine; +import com.soptie.server.member.entity.MemberRoutine; import lombok.Builder; @Builder(access = PRIVATE) public record MemberDailyRoutineCreateServiceResponse( - long routineId + long routineId ) { public static MemberDailyRoutineCreateServiceResponse of(MemberRoutine routine) { return MemberDailyRoutineCreateServiceResponse.builder() - .routineId(routine.getId()) - .build(); + .routineId(routine.getId()) + .build(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberDailyRoutineListGetServiceResponse.java b/src/main/java/com/soptie/server/member/service/dto/response/routine/daily/MemberDailyRoutineListGetServiceResponse.java similarity index 80% rename from src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberDailyRoutineListGetServiceResponse.java rename to src/main/java/com/soptie/server/member/service/dto/response/routine/daily/MemberDailyRoutineListGetServiceResponse.java index 1fe2807c..dd78c138 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberDailyRoutineListGetServiceResponse.java +++ b/src/main/java/com/soptie/server/member/service/dto/response/routine/daily/MemberDailyRoutineListGetServiceResponse.java @@ -1,10 +1,10 @@ -package com.soptie.server.memberRoutine.service.dto.response; +package com.soptie.server.member.service.dto.response.routine.daily; import static lombok.AccessLevel.*; import java.util.List; -import com.soptie.server.memberRoutine.repository.dto.MemberRoutineResponse; +import com.soptie.server.member.repository.dto.MemberRoutineResponse; import lombok.Builder; import lombok.NonNull; @@ -16,8 +16,8 @@ public record MemberDailyRoutineListGetServiceResponse( public static MemberDailyRoutineListGetServiceResponse of(List routines) { return MemberDailyRoutineListGetServiceResponse.builder() - .routines(routines.stream().map(MemberDailyRoutineServiceResponse::of).toList()) - .build(); + .routines(routines.stream().map(MemberDailyRoutineServiceResponse::of).toList()) + .build(); } @Builder(access = PRIVATE) diff --git a/src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineCreateServiceResponse.java b/src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineCreateServiceResponse.java new file mode 100644 index 00000000..8ed3f895 --- /dev/null +++ b/src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineCreateServiceResponse.java @@ -0,0 +1,19 @@ +package com.soptie.server.member.service.dto.response.routine.happiness; + +import static lombok.AccessLevel.*; + +import com.soptie.server.member.entity.MemberRoutine; + +import lombok.Builder; + +@Builder(access = PRIVATE) +public record MemberHappinessRoutineCreateServiceResponse( + long routineId +) { + + public static MemberHappinessRoutineCreateServiceResponse of(MemberRoutine memberRoutine) { + return MemberHappinessRoutineCreateServiceResponse.builder() + .routineId(memberRoutine.getId()) + .build(); + } +} diff --git a/src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineGetServiceResponse.java b/src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineGetServiceResponse.java new file mode 100644 index 00000000..47036b3b --- /dev/null +++ b/src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineGetServiceResponse.java @@ -0,0 +1,50 @@ +package com.soptie.server.member.service.dto.response.routine.happiness; + +import static lombok.AccessLevel.*; + +import com.soptie.server.member.repository.dto.MemberChallengeResponse; +import com.soptie.server.theme.entity.Theme; + +import lombok.Builder; + +@Builder(access = PRIVATE) +public record MemberHappinessRoutineGetServiceResponse( + long routineId, + ThemeServiceResponse theme, + String routineContent, + String content, + String description, + String place, + String requiredTime +) { + + public static MemberHappinessRoutineGetServiceResponse of(MemberChallengeResponse routine) { + return MemberHappinessRoutineGetServiceResponse.builder() + .routineId(routine.id()) + .theme(ThemeServiceResponse.of(routine.theme())) + .routineContent(routine.routineContent()) + .content(routine.content()) + .description(routine.description()) + .place(routine.place()) + .requiredTime(routine.requiredTime()) + .build(); + } + + @Builder(access = PRIVATE) + public record ThemeServiceResponse( + String iconImageUrl, + String cardImageUrl, + String name, + String color + ) { + + private static ThemeServiceResponse of(Theme theme) { + return ThemeServiceResponse.builder() + .iconImageUrl(theme.getImageInfo().getIconImageUrl()) + .cardImageUrl(theme.getImageInfo().getHappinessCardImageUrl()) + .name(theme.getName()) + .color(theme.getColor()) + .build(); + } + } +} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineCreateService.java b/src/main/java/com/soptie/server/member/service/routine/MemberRoutineCreateService.java similarity index 76% rename from src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineCreateService.java rename to src/main/java/com/soptie/server/member/service/routine/MemberRoutineCreateService.java index f82c179c..3897c581 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineCreateService.java +++ b/src/main/java/com/soptie/server/member/service/routine/MemberRoutineCreateService.java @@ -1,20 +1,18 @@ -package com.soptie.server.memberRoutine.service; +package com.soptie.server.member.service.routine; import static com.soptie.server.routine.message.RoutineErrorCode.*; -import java.util.List; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.member.adapter.MemberRoutineFinder; +import com.soptie.server.member.adapter.MemberRoutineSaver; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; -import com.soptie.server.memberRoutine.adapter.MemberRoutineSaver; -import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineCreateServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineCreateServiceRequest; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineCreateServiceResponse; -import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineCreateServiceResponse; +import com.soptie.server.member.service.dto.request.routine.daily.MemberDailyRoutineCreateServiceRequest; +import com.soptie.server.member.service.dto.request.routine.happiness.MemberHappinessRoutineCreateServiceRequest; +import com.soptie.server.member.service.dto.response.routine.daily.MemberDailyRoutineCreateServiceResponse; +import com.soptie.server.member.service.dto.response.routine.happiness.MemberHappinessRoutineCreateServiceResponse; import com.soptie.server.routine.adapter.ChallengeFinder; import com.soptie.server.routine.adapter.RoutineFinder; import com.soptie.server.routine.entity.Routine; @@ -43,7 +41,7 @@ public MemberDailyRoutineCreateServiceResponse createDailyRoutine(MemberDailyRou } public MemberHappinessRoutineCreateServiceResponse createHappinessRoutine( - MemberHappinessRoutineCreateServiceRequest request + MemberHappinessRoutineCreateServiceRequest request ) { val member = memberFinder.findById(request.memberId()); checkMemberHasChallengeAlready(member); diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineDeleteService.java b/src/main/java/com/soptie/server/member/service/routine/MemberRoutineDeleteService.java similarity index 69% rename from src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineDeleteService.java rename to src/main/java/com/soptie/server/member/service/routine/MemberRoutineDeleteService.java index 2668428f..7db67962 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineDeleteService.java +++ b/src/main/java/com/soptie/server/member/service/routine/MemberRoutineDeleteService.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service; +package com.soptie.server.member.service.routine; import java.util.List; @@ -6,12 +6,12 @@ import org.springframework.transaction.annotation.Transactional; import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.member.adapter.MemberRoutineDeleter; +import com.soptie.server.member.adapter.MemberRoutineFinder; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.adapter.MemberRoutineDeleter; -import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineDeleteServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutinesDeleteServiceRequest; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.member.service.dto.request.routine.MemberRoutineDeleteServiceRequest; +import com.soptie.server.member.service.dto.request.routine.MemberRoutinesDeleteServiceRequest; import lombok.RequiredArgsConstructor; import lombok.val; @@ -40,8 +40,8 @@ public void deleteMemberRoutine(MemberRoutineDeleteServiceRequest request) { private List filterMemberRoutines(Member member, List routineIds) { return routineIds.stream() - .map(memberRoutineFinder::findById) - .filter(routine -> routine.getMember().equals(member)) - .toList(); + .map(memberRoutineFinder::findById) + .filter(routine -> routine.getMember().equals(member)) + .toList(); } } diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineReadService.java b/src/main/java/com/soptie/server/member/service/routine/MemberRoutineReadService.java similarity index 64% rename from src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineReadService.java rename to src/main/java/com/soptie/server/member/service/routine/MemberRoutineReadService.java index c5a8c837..c6c9191d 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineReadService.java +++ b/src/main/java/com/soptie/server/member/service/routine/MemberRoutineReadService.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service; +package com.soptie.server.member.service.routine; import java.util.Optional; @@ -6,11 +6,11 @@ import org.springframework.transaction.annotation.Transactional; import com.soptie.server.member.adapter.MemberFinder; -import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; -import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineListGetServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineGetServiceRequest; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineListGetServiceResponse; -import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineGetServiceResponse; +import com.soptie.server.member.adapter.MemberRoutineFinder; +import com.soptie.server.member.service.dto.request.routine.daily.MemberDailyRoutineListGetServiceRequest; +import com.soptie.server.member.service.dto.request.routine.happiness.MemberHappinessRoutineGetServiceRequest; +import com.soptie.server.member.service.dto.response.routine.daily.MemberDailyRoutineListGetServiceResponse; +import com.soptie.server.member.service.dto.response.routine.happiness.MemberHappinessRoutineGetServiceResponse; import lombok.RequiredArgsConstructor; import lombok.val; @@ -30,7 +30,7 @@ public MemberDailyRoutineListGetServiceResponse getDailyRoutines(MemberDailyRout } public Optional getHappinessRoutine( - MemberHappinessRoutineGetServiceRequest request + MemberHappinessRoutineGetServiceRequest request ) { val member = memberFinder.findById(request.memberId()); val memberRoutine = memberRoutineFinder.findChallengeByMember(member); diff --git a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineUpdateService.java b/src/main/java/com/soptie/server/member/service/routine/MemberRoutineUpdateService.java similarity index 75% rename from src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineUpdateService.java rename to src/main/java/com/soptie/server/member/service/routine/MemberRoutineUpdateService.java index b87a3d90..0ea3bccf 100644 --- a/src/main/java/com/soptie/server/memberRoutine/service/MemberRoutineUpdateService.java +++ b/src/main/java/com/soptie/server/member/service/routine/MemberRoutineUpdateService.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service; +package com.soptie.server.member.service.routine; import static com.soptie.server.routine.entity.RoutineType.*; @@ -6,11 +6,11 @@ import org.springframework.transaction.annotation.Transactional; import com.soptie.server.member.adapter.MemberFinder; -import com.soptie.server.memberRoutine.adapter.MemberRoutineDeleter; -import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineAchieveServiceRequest; -import com.soptie.server.memberRoutine.service.dto.response.MemberRoutineAchieveServiceResponse; +import com.soptie.server.member.adapter.MemberRoutineDeleter; +import com.soptie.server.member.adapter.MemberRoutineFinder; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.member.service.dto.request.routine.MemberRoutineAchieveServiceRequest; +import com.soptie.server.member.service.dto.response.routine.MemberRoutineAchieveServiceResponse; import lombok.RequiredArgsConstructor; import lombok.val; diff --git a/src/main/java/com/soptie/server/memberDoll/adapter/MemberDollSaver.java b/src/main/java/com/soptie/server/memberDoll/adapter/MemberDollSaver.java deleted file mode 100644 index 1c838f30..00000000 --- a/src/main/java/com/soptie/server/memberDoll/adapter/MemberDollSaver.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.soptie.server.memberDoll.adapter; - -import com.soptie.server.common.support.RepositoryAdapter; -import com.soptie.server.memberDoll.entity.MemberDoll; -import com.soptie.server.memberDoll.repository.MemberDollRepository; -import lombok.RequiredArgsConstructor; - -@RepositoryAdapter -@RequiredArgsConstructor -public class MemberDollSaver { - - private final MemberDollRepository memberDollRepository; - - public void save(MemberDoll memberDoll) { - memberDollRepository.save(memberDoll); - } -} diff --git a/src/main/java/com/soptie/server/memberDoll/exception/MemberDollException.java b/src/main/java/com/soptie/server/memberDoll/exception/MemberDollException.java deleted file mode 100644 index a24c6aff..00000000 --- a/src/main/java/com/soptie/server/memberDoll/exception/MemberDollException.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.soptie.server.memberDoll.exception; - -import com.soptie.server.doll.message.ErrorCode; -import lombok.Getter; - -@Getter -public class MemberDollException extends RuntimeException { - - private final ErrorCode errorCode; - - public MemberDollException(ErrorCode errorCode) { - super("[MemberDollException] : " + errorCode.getMessage()); - this.errorCode = errorCode; - } -} diff --git a/src/main/java/com/soptie/server/memberDoll/service/MemberDollService.java b/src/main/java/com/soptie/server/memberDoll/service/MemberDollService.java deleted file mode 100644 index ab7e46ea..00000000 --- a/src/main/java/com/soptie/server/memberDoll/service/MemberDollService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.soptie.server.memberDoll.service; - -import com.soptie.server.doll.entity.DollType; -import com.soptie.server.member.entity.Member; -import com.soptie.server.memberDoll.entity.MemberDoll; - -public interface MemberDollService { - - void createMemberDoll(Member member, DollType dollType, String name); - void deleteMemberDoll(MemberDoll memberDoll); -} diff --git a/src/main/java/com/soptie/server/memberDoll/service/MemberDollServiceImpl.java b/src/main/java/com/soptie/server/memberDoll/service/MemberDollServiceImpl.java deleted file mode 100644 index 7e010c1d..00000000 --- a/src/main/java/com/soptie/server/memberDoll/service/MemberDollServiceImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.soptie.server.memberDoll.service; - -import com.soptie.server.doll.entity.Doll; -import com.soptie.server.doll.entity.DollType; -import com.soptie.server.doll.exception.DollException; -import com.soptie.server.doll.repository.DollRepository; -import com.soptie.server.member.entity.Member; -import com.soptie.server.memberDoll.entity.MemberDoll; -import com.soptie.server.memberDoll.repository.MemberDollRepository; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import static com.soptie.server.doll.message.ErrorCode.INVALID_TYPE; - -@Service -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class MemberDollServiceImpl implements MemberDollService { - - private final MemberDollRepository memberDollRepository; - private final DollRepository dollRepository; - - @Override - @Transactional - public void createMemberDoll(Member member, DollType dollType, String name) { - val doll = findDoll(dollType); - val memberDoll = new MemberDoll(member, doll, name); - memberDollRepository.save(memberDoll); - } - - @Override - @Transactional - public void deleteMemberDoll(MemberDoll memberDoll) { - memberDollRepository.delete(memberDoll); - } - - private Doll findDoll(DollType type) { - return dollRepository.findByDollType(type) - .orElseThrow(() -> new DollException(INVALID_TYPE)); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberHappinessRoutineController.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberHappinessRoutineController.java deleted file mode 100644 index f24aa76c..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/MemberHappinessRoutineController.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.soptie.server.memberRoutine.controller.v1; - -import com.soptie.server.common.dto.BaseResponse; -import com.soptie.server.common.dto.SuccessResponse; -import com.soptie.server.common.support.UriGenerator; -import com.soptie.server.memberRoutine.controller.v1.api.MemberHappinessRoutineApi; -import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberHappinessRoutineRequest; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberHappinessRoutineCreateResponse; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberHappinessRoutineGetResponse; -import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; -import com.soptie.server.memberRoutine.service.MemberRoutineDeleteService; -import com.soptie.server.memberRoutine.service.MemberRoutineReadService; -import com.soptie.server.memberRoutine.service.MemberRoutineUpdateService; -import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineCreateServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineGetServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineAchieveServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineDeleteServiceRequest; - -import lombok.RequiredArgsConstructor; -import lombok.val; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.security.Principal; - -import static com.soptie.server.common.dto.SuccessResponse.*; -import static com.soptie.server.memberRoutine.message.SuccessMessage.*; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/v1/routines/happiness/member") -public class MemberHappinessRoutineController implements MemberHappinessRoutineApi { - - private final MemberRoutineCreateService memberRoutineCreateService; - private final MemberRoutineReadService memberRoutineReadService; - private final MemberRoutineUpdateService memberRoutineUpdateService; - private final MemberRoutineDeleteService memberRoutineDeleteService; - - @PostMapping - public ResponseEntity> createMemberHappinessRoutine( - Principal principal, @RequestBody MemberHappinessRoutineRequest request) { - val memberId = Long.parseLong(principal.getName()); - val response = MemberHappinessRoutineCreateResponse.of(memberRoutineCreateService.createHappinessRoutine( - MemberHappinessRoutineCreateServiceRequest.of(memberId, request))); - return ResponseEntity - .created(UriGenerator.getURI("/api/v1/routines/happiness/member", response.routineId())) - .body(success(SUCCESS_CREATE_ROUTINE.getMessage(), response)); - } - - @GetMapping - public ResponseEntity getMemberHappinessRoutine(Principal principal) { - val memberId = Long.parseLong(principal.getName()); - return memberRoutineReadService.getHappinessRoutine(MemberHappinessRoutineGetServiceRequest.of(memberId)) - .map(response -> ResponseEntity.ok(SuccessResponse.success( - SUCCESS_GET_ROUTINE.getMessage(), - MemberHappinessRoutineGetResponse.of(response)))) - .orElseGet(() -> ResponseEntity.noContent().build()); - } - - @DeleteMapping("/routine/{routineId}") - public ResponseEntity deleteMemberHappinessRoutine( - Principal principal, - @PathVariable Long routineId - ) { - val memberId = Long.parseLong(principal.getName()); - memberRoutineDeleteService.deleteMemberRoutine(MemberRoutineDeleteServiceRequest.of(memberId, routineId)); - return ResponseEntity.ok(success(SUCCESS_DELETE_ROUTINE.getMessage())); - } - - @PatchMapping("/routine/{routineId}") - public ResponseEntity achieveMemberHappinessRoutine( - Principal principal, - @PathVariable Long routineId - ) { - val memberId = Long.parseLong(principal.getName()); - memberRoutineUpdateService.achieveMemberRoutine(MemberRoutineAchieveServiceRequest.of(memberId, routineId)); - return ResponseEntity.ok(success(SUCCESS_ACHIEVE_ROUTINE.getMessage())); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberDailyRoutineApi.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberDailyRoutineApi.java deleted file mode 100644 index b5d15724..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberDailyRoutineApi.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.soptie.server.memberRoutine.controller.v1.api; - -import java.security.Principal; -import java.util.List; - -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -import com.soptie.server.common.dto.BaseResponse; -import com.soptie.server.common.dto.ErrorResponse; -import com.soptie.server.common.dto.SuccessResponse; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineAchieveResponse; -import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberDailyRoutineCreateRequest; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineCreateResponse; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberDailyRoutineListGetResponse; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.enums.ParameterIn; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; - -@Tag(name = "member daily routines V1", description = "회원의 데일리 루틴 API Version1") -public interface MemberDailyRoutineApi { - - @Operation( - summary = "데일리 루틴 추가", - description = "회원의 데일리 루틴을 추가한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "401", - description = "유효하지 않은 토큰", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> createMemberDailyRoutine( - @Parameter(hidden = true) Principal principal, - @RequestBody MemberDailyRoutineCreateRequest request - ); - - @Operation( - summary = "데일리 루틴 삭제", - description = "회원의 데일리 루틴을 삭제한다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), - @ApiResponse( - responseCode = "401", - description = "유효하지 않은 토큰", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity deleteMemberDailyRoutines( - @Parameter(hidden = true) Principal principal, - @Parameter( - name = "routines", - description = "삭제할 회원의 데일리 루틴 id 목록", - in = ParameterIn.QUERY, - example = "1,2,3" - ) @RequestParam List routines - ); - - @Operation( - summary = "데일리 루틴 달성", - description = "회원의 데일리 루틴을 달성한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "401", - description = "유효하지 않은 토큰", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> achieveMemberDailyRoutine( - @Parameter(hidden = true) Principal principal, - @Parameter( - name = "routineId", - description = "달성한 회원의 데일리 루틴 id", - in = ParameterIn.PATH, - example = "1" - ) @PathVariable long routineId - ); - - @Operation( - summary = "회원의 데일리 루틴 목록 조회", - description = "회원의 데일리 루틴을 달성 여부, 달성 횟수, 루틴 이름 순으로 정렬된 목록으로 조회한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "401", - description = "유효하지 않은 토큰", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> getMemberDailyRoutines( - @Parameter(hidden = true) Principal principal - ); -} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberHappinessRoutineApi.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberHappinessRoutineApi.java deleted file mode 100644 index f430b2af..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberHappinessRoutineApi.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.soptie.server.memberRoutine.controller.v1.api; - -import com.soptie.server.common.dto.BaseResponse; -import com.soptie.server.common.dto.ErrorResponse; -import com.soptie.server.common.dto.SuccessResponse; -import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberHappinessRoutineRequest; -import com.soptie.server.memberRoutine.controller.v1.dto.response.MemberHappinessRoutineCreateResponse; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.enums.ParameterIn; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; - -import java.security.Principal; - -@Tag(name = "member happiness routines V1", description = "회원의 행복 루틴 API Version1") -public interface MemberHappinessRoutineApi { - - @Operation( - summary = "행복 루틴 추가", - description = "회원의 행복 루틴을 추가한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "401", - description = "유효하지 않은 토큰", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> createMemberHappinessRoutine( - @Parameter(hidden = true) Principal principal, - @RequestBody MemberHappinessRoutineRequest request - ); - - @Operation( - summary = "회원의 행복 루틴 목록 조회", - description = "회원의 행복 루틴을 조회한다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), - @ApiResponse( - responseCode = "204", - description = "데이터 없음", - content = @Content(schema = @Schema(implementation = BaseResponse.class))), - @ApiResponse( - responseCode = "401", - description = "유효하지 않은 토큰", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity getMemberHappinessRoutine(@Parameter(hidden = true) Principal principal); - - @Operation( - summary = "행복 루틴 삭제", - description = "회원의 행복 루틴을 삭제한다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), - @ApiResponse( - responseCode = "401", - description = "유효하지 않은 토큰", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity deleteMemberHappinessRoutine( - @Parameter(hidden = true) Principal principal, - @Parameter( - name = "routineId", - description = "삭제할 회원의 행복 루틴 id", - in = ParameterIn.PATH, - example = "1" - ) - @PathVariable Long routineId - ); - - @Operation( - summary = "행복 루틴 달성", - description = "회원의 행복 루틴을 달성한다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), - @ApiResponse( - responseCode = "401", - description = "유효하지 않은 토큰", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity achieveMemberHappinessRoutine( - @Parameter(hidden = true) Principal principal, - @Parameter( - name = "routineId", - description = "달성한 회원의 행복 루틴 id", - in = ParameterIn.PATH, - example = "1" - ) - @PathVariable Long routineId - ); -} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/request/MemberHappinessRoutineRequest.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/request/MemberHappinessRoutineRequest.java deleted file mode 100644 index 085c9f46..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/request/MemberHappinessRoutineRequest.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.soptie.server.memberRoutine.controller.v1.dto.request; - -public record MemberHappinessRoutineRequest( - long subRoutineId -) { -} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberHappinessRoutineCreateResponse.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberHappinessRoutineCreateResponse.java deleted file mode 100644 index 7beb5c9e..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberHappinessRoutineCreateResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.soptie.server.memberRoutine.controller.v1.dto.response; - -import static lombok.AccessLevel.*; - -import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineCreateServiceResponse; - -import lombok.Builder; - -@Builder(access = PRIVATE) -public record MemberHappinessRoutineCreateResponse( - long routineId -) { - - public static MemberHappinessRoutineCreateResponse of(MemberHappinessRoutineCreateServiceResponse response) { - return MemberHappinessRoutineCreateResponse.builder() - .routineId(response.routineId()) - .build(); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberHappinessRoutineGetResponse.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberHappinessRoutineGetResponse.java deleted file mode 100644 index 7bd5d0cb..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/controller/v1/dto/response/MemberHappinessRoutineGetResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.soptie.server.memberRoutine.controller.v1.dto.response; - -import static lombok.AccessLevel.*; - -import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineGetServiceResponse; - -import lombok.Builder; -import lombok.NonNull; - -@Builder(access = PRIVATE) -public record MemberHappinessRoutineGetResponse( - long routineId, - @NonNull String iconImageUrl, - @NonNull String contentImageUrl, - @NonNull String themeName, - @NonNull String themeNameColor, - @NonNull String title, - @NonNull String content, - @NonNull String detailContent, - @NonNull String place, - @NonNull String timeTaken -) { - - public static MemberHappinessRoutineGetResponse of(MemberHappinessRoutineGetServiceResponse response) { - return MemberHappinessRoutineGetResponse.builder() - .routineId(response.routineId()) - .iconImageUrl(response.theme().iconImageUrl()) - .contentImageUrl(response.theme().cardImageUrl()) - .themeName(response.theme().name()) - .themeNameColor(response.theme().color()) - .title(response.routineContent()) - .content(response.content()) - .detailContent(response.description()) - .place(response.place()) - .timeTaken(response.requiredTime()) - .build(); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineRepositoryImpl.java b/src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineRepositoryImpl.java deleted file mode 100644 index c4082cfe..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/repository/MemberRoutineRepositoryImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.soptie.server.memberRoutine.repository; - -import static com.soptie.server.memberRoutine.entity.QMemberRoutine.*; -import static com.soptie.server.routine.entity.QChallenge.*; -import static com.soptie.server.routine.entity.QRoutine.*; -import static com.soptie.server.routine.entity.RoutineType.*; -import static com.soptie.server.theme.entity.QTheme.*; - -import java.util.List; -import java.util.Optional; - -import org.springframework.stereotype.Repository; - -import com.querydsl.jpa.impl.JPAQueryFactory; -import com.soptie.server.common.support.ExpressionGenerator; -import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.repository.dto.MemberChallengeResponse; -import com.soptie.server.memberRoutine.repository.dto.MemberRoutineResponse; -import com.soptie.server.memberRoutine.repository.dto.QMemberChallengeResponse; -import com.soptie.server.memberRoutine.repository.dto.QMemberRoutineResponse; -import com.soptie.server.routine.entity.RoutineType; - -import lombok.RequiredArgsConstructor; - -@Repository -@RequiredArgsConstructor -public class MemberRoutineRepositoryImpl implements MemberRoutineCustomRepository { - - private final JPAQueryFactory queryFactory; - - @Override - public List findByTypeAndMember(RoutineType type, Member member) { - return queryFactory - .select(new QMemberRoutineResponse(memberRoutine, routine)) - .from(memberRoutine) - .leftJoin(routine).on(memberRoutine.routineId.eq(routine.id)) - .leftJoin(routine.theme, theme).fetchJoin() - .where( - memberRoutine.type.eq(type), - memberRoutine.member.eq(member) - ) - .orderBy( - memberRoutine.isAchieve.asc(), - memberRoutine.achieveCount.desc(), - ExpressionGenerator.getFirstLetter(routine.content).asc() - ) - .fetch(); - } - - @Override - public Optional findChallengeByMember(Member member) { - return Optional.ofNullable(queryFactory - .select(new QMemberChallengeResponse(memberRoutine, challenge, theme)) - .from(memberRoutine) - .leftJoin(challenge).on(memberRoutine.routineId.eq(challenge.id)) - .leftJoin(challenge.routine, routine).fetchJoin() - .leftJoin(challenge.routine.theme, theme).fetchJoin() - .where( - memberRoutine.type.eq(CHALLENGE), - memberRoutine.member.eq(member) - ) - .fetchFirst() - ); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberChallengeResponse.java b/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberChallengeResponse.java deleted file mode 100644 index b680e65d..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberChallengeResponse.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.soptie.server.memberRoutine.repository.dto; - -import com.querydsl.core.annotations.QueryProjection; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.routine.entity.Challenge; -import com.soptie.server.theme.entity.Theme; - -public record MemberChallengeResponse( - Long id, - String routineContent, - String content, - String description, - String place, - String requiredTime, - Theme theme -) { - - @QueryProjection - public MemberChallengeResponse(MemberRoutine memberRoutine, Challenge challenge, Theme theme) { - this( - memberRoutine.getId(), - challenge.getRoutine().getContent(), - challenge.getContent(), - challenge.getDescription(), - challenge.getPlace(), - challenge.getRequiredTime(), - theme - ); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberRoutineResponse.java b/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberRoutineResponse.java deleted file mode 100644 index dbcb7106..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberRoutineResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.soptie.server.memberRoutine.repository.dto; - -import com.querydsl.core.annotations.QueryProjection; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.routine.entity.Routine; - -public record MemberRoutineResponse( - Long id, - String content, - String iconImageUrl, - String dailyIconImageUrl, - int achieveCount, - boolean isAchieve -) { - - @QueryProjection - public MemberRoutineResponse(MemberRoutine memberRoutine, Routine routine) { - this( - memberRoutine.getId(), - routine.getContent(), - routine.getTheme().getImageInfo().getIconImageUrl(), - routine.getTheme().getImageInfo().getDailyIconImageUrl(), - memberRoutine.getAchieveCount(), - memberRoutine.isAchieve() - ); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberHappinessRoutineCreateServiceRequest.java b/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberHappinessRoutineCreateServiceRequest.java deleted file mode 100644 index 0cc8aea5..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/request/MemberHappinessRoutineCreateServiceRequest.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.soptie.server.memberRoutine.service.dto.request; - -import static lombok.AccessLevel.*; - -import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberHappinessRoutineRequest; - -import lombok.Builder; - -@Builder(access = PRIVATE) -public record MemberHappinessRoutineCreateServiceRequest( - long memberId, - long challengeId -) { - - public static MemberHappinessRoutineCreateServiceRequest of(long memberId, MemberHappinessRoutineRequest request) { - return MemberHappinessRoutineCreateServiceRequest.builder() - .memberId(memberId) - .challengeId(request.subRoutineId()) - .build(); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineCreateServiceResponse.java b/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineCreateServiceResponse.java deleted file mode 100644 index 0469d57d..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineCreateServiceResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.soptie.server.memberRoutine.service.dto.response; - -import static lombok.AccessLevel.*; - -import com.soptie.server.memberRoutine.entity.MemberRoutine; - -import lombok.Builder; - -@Builder(access = PRIVATE) -public record MemberHappinessRoutineCreateServiceResponse( - long routineId -) { - - public static MemberHappinessRoutineCreateServiceResponse of(MemberRoutine memberRoutine) { - return MemberHappinessRoutineCreateServiceResponse.builder() - .routineId(memberRoutine.getId()) - .build(); - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineGetServiceResponse.java b/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineGetServiceResponse.java deleted file mode 100644 index 797cf672..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineGetServiceResponse.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.soptie.server.memberRoutine.service.dto.response; - -import static lombok.AccessLevel.*; - -import com.soptie.server.memberRoutine.repository.dto.MemberChallengeResponse; -import com.soptie.server.theme.entity.Theme; - -import lombok.Builder; - -@Builder(access = PRIVATE) -public record MemberHappinessRoutineGetServiceResponse( - long routineId, - ThemeServiceResponse theme, - String routineContent, - String content, - String description, - String place, - String requiredTime -) { - - public static MemberHappinessRoutineGetServiceResponse of(MemberChallengeResponse routine) { - return MemberHappinessRoutineGetServiceResponse.builder() - .routineId(routine.id()) - .theme(ThemeServiceResponse.of(routine.theme())) - .routineContent(routine.routineContent()) - .content(routine.content()) - .description(routine.description()) - .place(routine.place()) - .requiredTime(routine.requiredTime()) - .build(); - } - - @Builder(access = PRIVATE) - public record ThemeServiceResponse( - String iconImageUrl, - String cardImageUrl, - String name, - String color - ) { - - private static ThemeServiceResponse of(Theme theme) { - return ThemeServiceResponse.builder() - .iconImageUrl(theme.getImageInfo().getIconImageUrl()) - .cardImageUrl(theme.getImageInfo().getHappinessCardImageUrl()) - .name(theme.getName()) - .color(theme.getColor()) - .build(); - } - } -} diff --git a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberRoutineAchieveServiceResponse.java b/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberRoutineAchieveServiceResponse.java deleted file mode 100644 index 70d9364e..00000000 --- a/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberRoutineAchieveServiceResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.soptie.server.memberRoutine.service.dto.response; - -import static lombok.AccessLevel.*; - -import com.soptie.server.memberRoutine.entity.MemberRoutine; - -import lombok.Builder; - -@Builder(access = PRIVATE) -public record MemberRoutineAchieveServiceResponse( - long routineId, - boolean isAchieve, - int achieveCount -) { - - public static MemberRoutineAchieveServiceResponse of(MemberRoutine routine) { - return MemberRoutineAchieveServiceResponse.builder() - .routineId(routine.getId()) - .isAchieve(routine.isAchieve()) - .achieveCount(routine.getAchieveCount()) - .build(); - } -} diff --git a/src/main/java/com/soptie/server/routine/adapter/ChallengeFinder.java b/src/main/java/com/soptie/server/routine/adapter/ChallengeFinder.java index 68a60844..a4bc6f36 100644 --- a/src/main/java/com/soptie/server/routine/adapter/ChallengeFinder.java +++ b/src/main/java/com/soptie/server/routine/adapter/ChallengeFinder.java @@ -5,8 +5,8 @@ import java.util.List; import com.soptie.server.common.support.RepositoryAdapter; -import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.entity.Challenge; +import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.exception.RoutineException; import com.soptie.server.routine.repository.ChallengeRepository; @@ -20,7 +20,7 @@ public class ChallengeFinder { public Challenge findById(long id) { return challengeRepository.findById(id) - .orElseThrow(() -> new RoutineException(INVALID_ROUTINE)); + .orElseThrow(() -> new RoutineException(INVALID_ROUTINE)); } public List findByRoutine(Routine routine) { diff --git a/src/main/java/com/soptie/server/routine/controller/v1/DailyRoutineControllerV1.java b/src/main/java/com/soptie/server/routine/controller/v1/DailyRoutineControllerV1.java index 05c34f77..56722c18 100644 --- a/src/main/java/com/soptie/server/routine/controller/v1/DailyRoutineControllerV1.java +++ b/src/main/java/com/soptie/server/routine/controller/v1/DailyRoutineControllerV1.java @@ -21,7 +21,8 @@ import com.soptie.server.routine.service.dto.request.DailyRoutineListByThemeGetServiceRequest; import com.soptie.server.routine.service.dto.request.DailyRoutineListByThemesGetServiceRequest; -import lombok.*; +import lombok.RequiredArgsConstructor; +import lombok.val; @RestController @RequiredArgsConstructor @@ -32,21 +33,21 @@ public class DailyRoutineControllerV1 implements DailyRoutineApiV1 { @GetMapping public ResponseEntity> getRoutinesByThemes( - @RequestParam List themes + @RequestParam List themes ) { val response = DailyRoutineListByThemesGetResponse - .of(routineService.getRoutinesByThemes(DailyRoutineListByThemesGetServiceRequest.of(themes))); + .of(routineService.getRoutinesByThemes(DailyRoutineListByThemesGetServiceRequest.of(themes))); return ResponseEntity.ok(success(SUCCESS_GET_ROUTINE.getMessage(), response)); } @GetMapping("/theme/{themeId}") public ResponseEntity> getRoutinesByTheme( - Principal principal, - @PathVariable long themeId + Principal principal, + @PathVariable long themeId ) { val memberId = Long.parseLong(principal.getName()); val response = DailyRoutineListByThemeGetResponse - .of(routineService.getRoutinesByTheme(DailyRoutineListByThemeGetServiceRequest.of(memberId, themeId))); + .of(routineService.getRoutinesByTheme(DailyRoutineListByThemeGetServiceRequest.of(memberId, themeId))); return ResponseEntity.ok(success(SUCCESS_GET_ROUTINE.getMessage(), response)); } } diff --git a/src/main/java/com/soptie/server/routine/controller/v1/HappinessRoutineControllerV1.java b/src/main/java/com/soptie/server/routine/controller/v1/HappinessRoutineControllerV1.java index 6c0bd492..3f6fc9c6 100644 --- a/src/main/java/com/soptie/server/routine/controller/v1/HappinessRoutineControllerV1.java +++ b/src/main/java/com/soptie/server/routine/controller/v1/HappinessRoutineControllerV1.java @@ -1,43 +1,46 @@ package com.soptie.server.routine.controller.v1; +import static com.soptie.server.common.dto.SuccessResponse.*; +import static com.soptie.server.routine.message.RoutineSuccessMessage.*; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.routine.controller.v1.api.HappinessRoutineApiV1; import com.soptie.server.routine.controller.v1.dto.response.HappinessRoutineListGetResponse; import com.soptie.server.routine.controller.v1.dto.response.HappinessSubRoutineListGetResponse; -import com.soptie.server.routine.controller.v1.api.HappinessRoutineApiV1; import com.soptie.server.routine.service.RoutineService; import com.soptie.server.routine.service.dto.request.HappinessRoutineListGetServiceRequest; import com.soptie.server.routine.service.dto.request.HappinessSubRoutineListGetServiceRequest; import lombok.RequiredArgsConstructor; import lombok.val; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import static com.soptie.server.common.dto.SuccessResponse.*; -import static com.soptie.server.routine.message.RoutineSuccessMessage.*; @RestController @RequiredArgsConstructor @RequestMapping("/api/v1/routines/happiness") public class HappinessRoutineControllerV1 implements HappinessRoutineApiV1 { - private final RoutineService routineService; - - @GetMapping - public ResponseEntity> getHappinessRoutinesByThemes( - @RequestParam(required = false) Long themeId - ) { - val response = HappinessRoutineListGetResponse.of( - routineService.getHappinessRoutinesByTheme(HappinessRoutineListGetServiceRequest.of(themeId))); - return ResponseEntity.ok(success(SUCCESS_GET_HAPPINESS_ROUTINE.getMessage(), response)); - } - - @GetMapping("/routine/{routineId}") - public ResponseEntity> getHappinessSubRoutinesByRoutineOfTheme( - @PathVariable long routineId - ) { - val response = HappinessSubRoutineListGetResponse.of( - routineService.getHappinessSubRoutines(HappinessSubRoutineListGetServiceRequest.of(routineId))); - return ResponseEntity.ok(success(SUCCESS_GET_HAPPINESS_SUB_ROUTINES.getMessage(), response)); - } + private final RoutineService routineService; + + @GetMapping + public ResponseEntity> getHappinessRoutinesByThemes( + @RequestParam(required = false) Long themeId) { + val response = HappinessRoutineListGetResponse.of( + routineService.getHappinessRoutinesByTheme(HappinessRoutineListGetServiceRequest.of(themeId))); + return ResponseEntity.ok(success(SUCCESS_GET_HAPPINESS_ROUTINE.getMessage(), response)); + } + + @GetMapping("/routine/{routineId}") + public ResponseEntity> getHappinessSubRoutinesByRoutineOfTheme( + @PathVariable long routineId) { + val response = HappinessSubRoutineListGetResponse.of( + routineService.getHappinessSubRoutines(HappinessSubRoutineListGetServiceRequest.of(routineId))); + return ResponseEntity.ok(success(SUCCESS_GET_HAPPINESS_SUB_ROUTINES.getMessage(), response)); + } } diff --git a/src/main/java/com/soptie/server/routine/controller/v1/api/DailyRoutineApiV1.java b/src/main/java/com/soptie/server/routine/controller/v1/api/DailyRoutineApiV1.java index cb2d17c3..a04319a0 100644 --- a/src/main/java/com/soptie/server/routine/controller/v1/api/DailyRoutineApiV1.java +++ b/src/main/java/com/soptie/server/routine/controller/v1/api/DailyRoutineApiV1.java @@ -24,55 +24,49 @@ public interface DailyRoutineApiV1 { @Operation( - summary = "테마 목록별 데일리 루틴 목록 조회", - description = "테마 목록 중 하나라도 해당되는 데일리 루틴 목록을 이름 오름차순으로 조회한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } + summary = "테마 목록별 데일리 루틴 목록 조회", + description = "테마 목록 중 하나라도 해당되는 데일리 루틴 목록을 이름 오름차순으로 조회한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) ResponseEntity> getRoutinesByThemes( - @Parameter( - name = "themes", - description = "조회할 데일리 루틴 테마 id 목록", - in = ParameterIn.QUERY, - example = "1,2,3" - ) @RequestParam List themes + @Parameter( + name = "themes", + description = "조회할 데일리 루틴 테마 id 목록", + in = ParameterIn.QUERY, + example = "1,2,3" + ) @RequestParam List themes ); @Operation( - summary = "테마별 데일리 루틴 목록 조회", - description = "테마에 해당되는 데일리 루틴 목록을 이름 오름차순으로 조회한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } + summary = "테마별 데일리 루틴 목록 조회", + description = "테마에 해당되는 데일리 루틴 목록을 이름 오름차순으로 조회한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) ResponseEntity> getRoutinesByTheme( - @Parameter(hidden = true) Principal principal, - @Parameter( - name = "themeId", - description = "조회할 데일리 루틴 테마 id", - in = ParameterIn.PATH, - example = "1" - ) @PathVariable long themeId + @Parameter(hidden = true) Principal principal, + @Parameter( + name = "themeId", + description = "조회할 데일리 루틴 테마 id", + in = ParameterIn.PATH, + example = "1" + ) @PathVariable long themeId ); } diff --git a/src/main/java/com/soptie/server/routine/controller/v1/api/HappinessRoutineApiV1.java b/src/main/java/com/soptie/server/routine/controller/v1/api/HappinessRoutineApiV1.java index 1f048dbc..a29f2e9a 100644 --- a/src/main/java/com/soptie/server/routine/controller/v1/api/HappinessRoutineApiV1.java +++ b/src/main/java/com/soptie/server/routine/controller/v1/api/HappinessRoutineApiV1.java @@ -1,9 +1,14 @@ package com.soptie.server.routine.controller.v1.api; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestParam; + import com.soptie.server.common.dto.ErrorResponse; import com.soptie.server.common.dto.SuccessResponse; import com.soptie.server.routine.controller.v1.dto.response.HappinessRoutineListGetResponse; import com.soptie.server.routine.controller.v1.dto.response.HappinessSubRoutineListGetResponse; + import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.enums.ParameterIn; @@ -11,62 +16,53 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; @Tag(name = "happiness routines", description = "행복 루틴 API") public interface HappinessRoutineApiV1 { - @Operation( - summary = "테마 목록별 행복 루틴 목록 조회", - description = "테마 목록 중 해당되는 행복 루틴 목록을 조회한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> getHappinessRoutinesByThemes( - @Parameter( - name = "themeId", - description = "조회할 행복 루틴 테마 id", - in = ParameterIn.QUERY, - example = "1" - ) @RequestParam(required = false) Long themeId - ); + @Operation( + summary = "테마 목록별 행복 루틴 목록 조회", + description = "테마 목록 중 해당되는 행복 루틴 목록을 조회한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> getHappinessRoutinesByThemes( + @Parameter( + name = "themeId", + description = "조회할 행복 루틴 테마 id", + in = ParameterIn.QUERY, + example = "1" + ) @RequestParam(required = false) Long themeId + ); - @Operation( - summary = "루틴 별 행복 서브 루틴 내용 조회", - description = "루틴에 해당되는 행복 서브 루틴 내용을 조회한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> getHappinessSubRoutinesByRoutineOfTheme( - @Parameter( - name = "routineId", - description = "조회할 서브 행복 루틴 id", - in = ParameterIn.PATH, - example = "1" - ) @PathVariable long routineId - ); + @Operation( + summary = "루틴 별 행복 서브 루틴 내용 조회", + description = "루틴에 해당되는 행복 서브 루틴 내용을 조회한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> getHappinessSubRoutinesByRoutineOfTheme( + @Parameter( + name = "routineId", + description = "조회할 서브 행복 루틴 id", + in = ParameterIn.PATH, + example = "1" + ) @PathVariable long routineId + ); } diff --git a/src/main/java/com/soptie/server/routine/controller/v1/dto/response/HappinessRoutineListGetResponse.java b/src/main/java/com/soptie/server/routine/controller/v1/dto/response/HappinessRoutineListGetResponse.java index 78ac5b9e..bdb40249 100644 --- a/src/main/java/com/soptie/server/routine/controller/v1/dto/response/HappinessRoutineListGetResponse.java +++ b/src/main/java/com/soptie/server/routine/controller/v1/dto/response/HappinessRoutineListGetResponse.java @@ -2,42 +2,37 @@ import static lombok.AccessLevel.*; +import java.util.List; + import com.soptie.server.routine.service.dto.response.HappinessRoutineListGetServiceResponse; import com.soptie.server.routine.service.dto.response.HappinessRoutineListGetServiceResponse.HappinessRoutineServiceResponse; import lombok.Builder; import lombok.NonNull; -import java.util.List; - @Builder(access = PRIVATE) -public record HappinessRoutineListGetResponse( - List routines -) { - - public static HappinessRoutineListGetResponse of(HappinessRoutineListGetServiceResponse response) { - return HappinessRoutineListGetResponse.builder() - .routines(response.routines().stream().map(HappinessRoutineResponse::of).toList()) - .build(); - } - - @Builder(access = PRIVATE) - public record HappinessRoutineResponse( - long routineId, - @NonNull String name, - @NonNull String nameColor, - @NonNull String title, - @NonNull String iconImageUrl - ) { - - public static HappinessRoutineResponse of(HappinessRoutineServiceResponse response) { - return HappinessRoutineResponse.builder() - .routineId(response.routineId()) - .name(response.themeName()) - .nameColor(response.themeColor()) - .title(response.content()) - .iconImageUrl(response.iconImageUrl()) - .build(); - } - } +public record HappinessRoutineListGetResponse(List routines) { + + public static HappinessRoutineListGetResponse of(HappinessRoutineListGetServiceResponse response) { + return HappinessRoutineListGetResponse.builder() + .routines(response.routines().stream().map(HappinessRoutineResponse::of).toList()) + .build(); + } + + @Builder(access = PRIVATE) + public record HappinessRoutineResponse( + long routineId, @NonNull String name, @NonNull String nameColor, + @NonNull String title, @NonNull String iconImageUrl + ) { + + public static HappinessRoutineResponse of(HappinessRoutineServiceResponse response) { + return HappinessRoutineResponse.builder() + .routineId(response.routineId()) + .name(response.themeName()) + .nameColor(response.themeColor()) + .title(response.content()) + .iconImageUrl(response.iconImageUrl()) + .build(); + } + } } diff --git a/src/main/java/com/soptie/server/routine/controller/v1/dto/response/HappinessSubRoutineListGetResponse.java b/src/main/java/com/soptie/server/routine/controller/v1/dto/response/HappinessSubRoutineListGetResponse.java index b39de253..34c8b1aa 100644 --- a/src/main/java/com/soptie/server/routine/controller/v1/dto/response/HappinessSubRoutineListGetResponse.java +++ b/src/main/java/com/soptie/server/routine/controller/v1/dto/response/HappinessSubRoutineListGetResponse.java @@ -2,52 +2,46 @@ import static lombok.AccessLevel.*; +import java.util.List; + import com.soptie.server.routine.service.dto.response.HappinessSubRoutineListGetServiceResponse; import com.soptie.server.routine.service.dto.response.HappinessSubRoutineListGetServiceResponse.HappinessSubRoutineServiceResponse; import lombok.Builder; import lombok.NonNull; -import java.util.List; - @Builder(access = PRIVATE) public record HappinessSubRoutineListGetResponse( - @NonNull String title, - @NonNull String name, - @NonNull String nameColor, - @NonNull String iconImageUrl, - @NonNull String contentImageUrl, - @NonNull List subRoutines + @NonNull String title, @NonNull String name, @NonNull String nameColor, + @NonNull String iconImageUrl, @NonNull String contentImageUrl, + @NonNull List subRoutines ) { - public static HappinessSubRoutineListGetResponse of(HappinessSubRoutineListGetServiceResponse response) { - return HappinessSubRoutineListGetResponse.builder() - .title(response.routineContent()) - .name(response.themeName()) - .nameColor(response.themeColor()) - .iconImageUrl(response.iconImageUrl()) - .contentImageUrl(response.backgroundImageUrl()) - .subRoutines(response.challenges().stream().map(HappinessSubRoutineResponse::of).toList()) - .build(); - } - - @Builder(access = PRIVATE) - public record HappinessSubRoutineResponse( - long subRoutineId, - @NonNull String content, - @NonNull String detailContent, - @NonNull String timeTaken, - @NonNull String place - ) { - - public static HappinessSubRoutineResponse of(HappinessSubRoutineServiceResponse response) { - return HappinessSubRoutineResponse.builder() - .subRoutineId(response.challengeId()) - .content(response.content()) - .detailContent(response.description()) - .timeTaken(response.requiredTime()) - .place(response.place()) - .build(); - } - } + public static HappinessSubRoutineListGetResponse of(HappinessSubRoutineListGetServiceResponse response) { + return HappinessSubRoutineListGetResponse.builder() + .title(response.routineContent()) + .name(response.themeName()) + .nameColor(response.themeColor()) + .iconImageUrl(response.iconImageUrl()) + .contentImageUrl(response.backgroundImageUrl()) + .subRoutines(response.challenges().stream().map(HappinessSubRoutineResponse::of).toList()) + .build(); + } + + @Builder(access = PRIVATE) + public record HappinessSubRoutineResponse( + long subRoutineId, @NonNull String content, @NonNull String detailContent, + @NonNull String timeTaken, @NonNull String place + ) { + + public static HappinessSubRoutineResponse of(HappinessSubRoutineServiceResponse response) { + return HappinessSubRoutineResponse.builder() + .subRoutineId(response.challengeId()) + .content(response.content()) + .detailContent(response.description()) + .timeTaken(response.requiredTime()) + .place(response.place()) + .build(); + } + } } diff --git a/src/main/java/com/soptie/server/routine/entity/RoutineType.java b/src/main/java/com/soptie/server/routine/entity/RoutineType.java index 32e97657..85de1923 100644 --- a/src/main/java/com/soptie/server/routine/entity/RoutineType.java +++ b/src/main/java/com/soptie/server/routine/entity/RoutineType.java @@ -10,8 +10,7 @@ public enum RoutineType { DAILY("데일리"), - CHALLENGE("도전"), - ; + CHALLENGE("도전"); private final String name; } diff --git a/src/main/java/com/soptie/server/routine/message/RoutineErrorCode.java b/src/main/java/com/soptie/server/routine/message/RoutineErrorCode.java index b4834bcc..b103efdf 100644 --- a/src/main/java/com/soptie/server/routine/message/RoutineErrorCode.java +++ b/src/main/java/com/soptie/server/routine/message/RoutineErrorCode.java @@ -18,8 +18,7 @@ public enum RoutineErrorCode { INVALID_ROUTINE(NOT_FOUND, "유효하지 않은 루틴입니다."), /* 409 CONFLICT : 중복된 데이터 존재 */ - DUPLICATED_ROUTINE(CONFLICT, "이미 추가한 루틴입니다."), - ; + DUPLICATED_ROUTINE(CONFLICT, "이미 추가한 루틴입니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/soptie/server/routine/message/RoutineSuccessMessage.java b/src/main/java/com/soptie/server/routine/message/RoutineSuccessMessage.java index 40e4345d..26d9f79e 100644 --- a/src/main/java/com/soptie/server/routine/message/RoutineSuccessMessage.java +++ b/src/main/java/com/soptie/server/routine/message/RoutineSuccessMessage.java @@ -9,8 +9,7 @@ public enum RoutineSuccessMessage { SUCCESS_GET_ROUTINE("데일리 루틴 조회 성공"), SUCCESS_GET_HAPPINESS_ROUTINE("행복 루틴 조회 성공"), - SUCCESS_GET_HAPPINESS_SUB_ROUTINES("행복 루틴 별 서브 루틴 리스트 조회 성공"), - ; + SUCCESS_GET_HAPPINESS_SUB_ROUTINES("행복 루틴 별 서브 루틴 리스트 조회 성공"); private final String message; } diff --git a/src/main/java/com/soptie/server/routine/repository/ChallengeRepository.java b/src/main/java/com/soptie/server/routine/repository/ChallengeRepository.java index c6df4896..ff37e8c5 100644 --- a/src/main/java/com/soptie/server/routine/repository/ChallengeRepository.java +++ b/src/main/java/com/soptie/server/routine/repository/ChallengeRepository.java @@ -4,8 +4,8 @@ import org.springframework.data.jpa.repository.JpaRepository; -import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.entity.Challenge; +import com.soptie.server.routine.entity.Routine; public interface ChallengeRepository extends JpaRepository { List findByRoutine(Routine routine); diff --git a/src/main/java/com/soptie/server/routine/repository/RoutineCustomRepository.java b/src/main/java/com/soptie/server/routine/repository/RoutineCustomRepository.java index 9ff3d733..1467362d 100644 --- a/src/main/java/com/soptie/server/routine/repository/RoutineCustomRepository.java +++ b/src/main/java/com/soptie/server/routine/repository/RoutineCustomRepository.java @@ -9,6 +9,8 @@ public interface RoutineCustomRepository { List findByTypeAndThemeIds(RoutineType type, List themeIds); + List findByTypeAndThemeAndNotMember(RoutineType type, Theme theme, Member member); + List findByTypeAndThemeId(RoutineType type, Long themeId); } diff --git a/src/main/java/com/soptie/server/routine/repository/RoutineRepositoryImpl.java b/src/main/java/com/soptie/server/routine/repository/RoutineRepositoryImpl.java index bb48d994..7b9e20e0 100644 --- a/src/main/java/com/soptie/server/routine/repository/RoutineRepositoryImpl.java +++ b/src/main/java/com/soptie/server/routine/repository/RoutineRepositoryImpl.java @@ -1,6 +1,6 @@ package com.soptie.server.routine.repository; -import static com.soptie.server.memberRoutine.entity.QMemberRoutine.*; +import static com.soptie.server.member.entity.QMemberRoutine.*; import static com.soptie.server.routine.entity.QRoutine.*; import static java.util.Objects.*; @@ -26,42 +26,42 @@ public class RoutineRepositoryImpl implements RoutineCustomRepository { public List findByTypeAndThemeIds(RoutineType type, List themeIds) { return queryFactory - .selectFrom(routine) - .where( - routine.type.eq(type), - routine.theme.id.in(themeIds) - ) - .orderBy(ExpressionGenerator.getFirstLetter(routine.content).asc()) - .fetch(); + .selectFrom(routine) + .where( + routine.type.eq(type), + routine.theme.id.in(themeIds) + ) + .orderBy(ExpressionGenerator.getFirstLetter(routine.content).asc()) + .fetch(); } public List findByTypeAndThemeAndNotMember(RoutineType type, Theme theme, Member member) { return queryFactory - .selectFrom(routine) - .leftJoin(memberRoutine) - .on( - routine.id.eq(memberRoutine.routineId), - memberRoutine.type.eq(type), - memberRoutine.member.eq(member) - ) - .where( - memberRoutine.isNull(), - routine.type.eq(type), - routine.theme.eq(theme) - ) - .orderBy(ExpressionGenerator.getFirstLetter(routine.content).asc()) - .fetch(); + .selectFrom(routine) + .leftJoin(memberRoutine) + .on( + routine.id.eq(memberRoutine.routineId), + memberRoutine.type.eq(type), + memberRoutine.member.eq(member) + ) + .where( + memberRoutine.isNull(), + routine.type.eq(type), + routine.theme.eq(theme) + ) + .orderBy(ExpressionGenerator.getFirstLetter(routine.content).asc()) + .fetch(); } public List findByTypeAndThemeId(RoutineType type, Long themeId) { return queryFactory - .selectFrom(routine) - .where( - routine.type.eq(type), - themeEq(themeId) - ) - .orderBy(ExpressionGenerator.getFirstLetter(routine.content).asc()) - .fetch(); + .selectFrom(routine) + .where( + routine.type.eq(type), + themeEq(themeId) + ) + .orderBy(ExpressionGenerator.getFirstLetter(routine.content).asc()) + .fetch(); } private BooleanExpression themeEq(Long themeId) { diff --git a/src/main/java/com/soptie/server/routine/service/RoutineService.java b/src/main/java/com/soptie/server/routine/service/RoutineService.java index 3036cc20..c92c9903 100644 --- a/src/main/java/com/soptie/server/routine/service/RoutineService.java +++ b/src/main/java/com/soptie/server/routine/service/RoutineService.java @@ -40,13 +40,15 @@ public DailyRoutineListGetServiceResponse getRoutinesByTheme(DailyRoutineListByT return DailyRoutineListGetServiceResponse.of(routines, theme); } - public HappinessRoutineListGetServiceResponse getHappinessRoutinesByTheme(HappinessRoutineListGetServiceRequest request) { + public HappinessRoutineListGetServiceResponse getHappinessRoutinesByTheme( + HappinessRoutineListGetServiceRequest request + ) { val routines = routineFinder.findChallengeRoutinesByTheme(request.themeId()); return HappinessRoutineListGetServiceResponse.of(routines); } public HappinessSubRoutineListGetServiceResponse getHappinessSubRoutines( - HappinessSubRoutineListGetServiceRequest request + HappinessSubRoutineListGetServiceRequest request ) { val routine = routineFinder.findById(request.routineId()); val subRoutines = challengeFinder.findByRoutine(routine); diff --git a/src/main/java/com/soptie/server/routine/service/dto/response/HappinessRoutineListGetServiceResponse.java b/src/main/java/com/soptie/server/routine/service/dto/response/HappinessRoutineListGetServiceResponse.java index 453513ed..bbace49b 100644 --- a/src/main/java/com/soptie/server/routine/service/dto/response/HappinessRoutineListGetServiceResponse.java +++ b/src/main/java/com/soptie/server/routine/service/dto/response/HappinessRoutineListGetServiceResponse.java @@ -1,42 +1,37 @@ package com.soptie.server.routine.service.dto.response; -import static lombok.AccessLevel.PRIVATE; +import static lombok.AccessLevel.*; + +import java.util.List; import com.soptie.server.routine.entity.Routine; import lombok.Builder; import lombok.NonNull; -import java.util.List; - @Builder(access = PRIVATE) -public record HappinessRoutineListGetServiceResponse( - List routines -) { - - public static HappinessRoutineListGetServiceResponse of(List routines) { - return HappinessRoutineListGetServiceResponse.builder() - .routines(routines.stream().map(HappinessRoutineServiceResponse::of).toList()) - .build(); - } - - @Builder - public record HappinessRoutineServiceResponse( - long routineId, - @NonNull String themeName, - @NonNull String themeColor, - @NonNull String content, - @NonNull String iconImageUrl - ) { - - private static HappinessRoutineServiceResponse of(Routine routine) { - return HappinessRoutineServiceResponse.builder() - .routineId(routine.getId()) - .themeName(routine.getTheme().getName()) - .themeColor(routine.getTheme().getColor()) - .content(routine.getContent()) - .iconImageUrl(routine.getTheme().getImageInfo().getIconImageUrl()) - .build(); - } - } +public record HappinessRoutineListGetServiceResponse(List routines) { + + public static HappinessRoutineListGetServiceResponse of(List routines) { + return HappinessRoutineListGetServiceResponse.builder() + .routines(routines.stream().map(HappinessRoutineServiceResponse::of).toList()) + .build(); + } + + @Builder + public record HappinessRoutineServiceResponse( + long routineId, @NonNull String themeName, @NonNull String themeColor, + @NonNull String content, @NonNull String iconImageUrl + ) { + + private static HappinessRoutineServiceResponse of(Routine routine) { + return HappinessRoutineServiceResponse.builder() + .routineId(routine.getId()) + .themeName(routine.getTheme().getName()) + .themeColor(routine.getTheme().getColor()) + .content(routine.getContent()) + .iconImageUrl(routine.getTheme().getImageInfo().getIconImageUrl()) + .build(); + } + } } diff --git a/src/main/java/com/soptie/server/routine/service/dto/response/HappinessSubRoutineListGetServiceResponse.java b/src/main/java/com/soptie/server/routine/service/dto/response/HappinessSubRoutineListGetServiceResponse.java index 8f1797bf..97484900 100644 --- a/src/main/java/com/soptie/server/routine/service/dto/response/HappinessSubRoutineListGetServiceResponse.java +++ b/src/main/java/com/soptie/server/routine/service/dto/response/HappinessSubRoutineListGetServiceResponse.java @@ -1,52 +1,44 @@ package com.soptie.server.routine.service.dto.response; -import static lombok.AccessLevel.PRIVATE; +import static lombok.AccessLevel.*; + +import java.util.List; -import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.entity.Challenge; +import com.soptie.server.routine.entity.Routine; import lombok.Builder; -import java.util.List; - @Builder(access = PRIVATE) -public record HappinessSubRoutineListGetServiceResponse( - String routineContent, - String themeName, - String themeColor, - String iconImageUrl, - String backgroundImageUrl, - List challenges -) { - - public static HappinessSubRoutineListGetServiceResponse of(Routine routine, List challenges) { - return HappinessSubRoutineListGetServiceResponse.builder() - .routineContent(routine.getContent()) - .themeName(routine.getTheme().getName()) - .themeColor(routine.getTheme().getColor()) - .iconImageUrl(routine.getTheme().getImageInfo().getIconImageUrl()) - .backgroundImageUrl(routine.getTheme().getImageInfo().getHappinessCardImageUrl()) - .challenges(challenges.stream().map(HappinessSubRoutineServiceResponse::of).toList()) - .build(); - } - - @Builder(access = PRIVATE) - public record HappinessSubRoutineServiceResponse( - long challengeId, - String content, - String description, - String requiredTime, - String place - ) { - - private static HappinessSubRoutineServiceResponse of(Challenge challenge) { - return HappinessSubRoutineServiceResponse.builder() - .challengeId(challenge.getId()) - .content(challenge.getContent()) - .description(challenge.getDescription()) - .requiredTime(challenge.getRequiredTime()) - .place(challenge.getPlace()) - .build(); - } - } +public record HappinessSubRoutineListGetServiceResponse(String routineContent, String themeName, String themeColor, + String iconImageUrl, String backgroundImageUrl, + List challenges) { + + public static HappinessSubRoutineListGetServiceResponse of(Routine routine, List challenges) { + return HappinessSubRoutineListGetServiceResponse.builder() + .routineContent(routine.getContent()) + .themeName(routine.getTheme().getName()) + .themeColor(routine.getTheme().getColor()) + .iconImageUrl(routine.getTheme().getImageInfo().getIconImageUrl()) + .backgroundImageUrl(routine.getTheme().getImageInfo().getHappinessCardImageUrl()) + .challenges(challenges.stream().map(HappinessSubRoutineServiceResponse::of).toList()) + .build(); + } + + @Builder(access = PRIVATE) + public record HappinessSubRoutineServiceResponse( + long challengeId, String content, String description, + String requiredTime, String place + ) { + + private static HappinessSubRoutineServiceResponse of(Challenge challenge) { + return HappinessSubRoutineServiceResponse.builder() + .challengeId(challenge.getId()) + .content(challenge.getContent()) + .description(challenge.getDescription()) + .requiredTime(challenge.getRequiredTime()) + .place(challenge.getPlace()) + .build(); + } + } } diff --git a/src/main/java/com/soptie/server/test/TestApi.java b/src/main/java/com/soptie/server/test/TestApi.java index 28b20c45..31c2f9bd 100644 --- a/src/main/java/com/soptie/server/test/TestApi.java +++ b/src/main/java/com/soptie/server/test/TestApi.java @@ -16,20 +16,18 @@ public interface TestApi { @Operation( - summary = "서버 연결", - description = "서버의 연결 여부를 테스트한다.", - responses = { - @ApiResponse( - responseCode = "200", - description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } + summary = "서버 연결", + description = "서버의 연결 여부를 테스트한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class)) + ), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) ResponseEntity test(); } diff --git a/src/main/java/com/soptie/server/theme/controller/v1/HappinessThemeControllerV1.java b/src/main/java/com/soptie/server/theme/controller/v1/HappinessThemeControllerV1.java index 63da1192..a154d831 100644 --- a/src/main/java/com/soptie/server/theme/controller/v1/HappinessThemeControllerV1.java +++ b/src/main/java/com/soptie/server/theme/controller/v1/HappinessThemeControllerV1.java @@ -21,11 +21,11 @@ @RequestMapping("/api/v1/routines/happiness/themes") public class HappinessThemeControllerV1 implements HappinessThemeApiV1 { - private final ThemeService themeService; + private final ThemeService themeService; - @GetMapping - public ResponseEntity> getHappinessThemes() { - val response = HappinessThemeListGetResponse.of(themeService.getThemes()); - return ResponseEntity.ok(success(SUCCESS_GET_HAPPINESS_THEME.getMessage(), response)); - } + @GetMapping + public ResponseEntity> getHappinessThemes() { + val response = HappinessThemeListGetResponse.of(themeService.getThemes()); + return ResponseEntity.ok(success(SUCCESS_GET_HAPPINESS_THEME.getMessage(), response)); + } } diff --git a/src/main/java/com/soptie/server/theme/controller/v1/api/DailyThemeApiV1.java b/src/main/java/com/soptie/server/theme/controller/v1/api/DailyThemeApiV1.java index 1910c00b..ccf2c5a5 100644 --- a/src/main/java/com/soptie/server/theme/controller/v1/api/DailyThemeApiV1.java +++ b/src/main/java/com/soptie/server/theme/controller/v1/api/DailyThemeApiV1.java @@ -16,21 +16,18 @@ public interface DailyThemeApiV1 { @Operation( - summary = "데일리 루틴 테마 목록 조회", - description = "데일리 루틴 테마 전체를 조회한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } + summary = "데일리 루틴 테마 목록 조회", + description = "데일리 루틴 테마 전체를 조회한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) ResponseEntity> getThemes(); } diff --git a/src/main/java/com/soptie/server/theme/controller/v1/api/HappinessThemeApiV1.java b/src/main/java/com/soptie/server/theme/controller/v1/api/HappinessThemeApiV1.java index 90ed6fc6..13268e87 100644 --- a/src/main/java/com/soptie/server/theme/controller/v1/api/HappinessThemeApiV1.java +++ b/src/main/java/com/soptie/server/theme/controller/v1/api/HappinessThemeApiV1.java @@ -15,18 +15,16 @@ @Tag(name = "happiness theme V1", description = "행복 테마 API Version1") public interface HappinessThemeApiV1 { - @Operation( - summary = "행복 루틴 테마 목록 조회", - description = "행복 루틴 테마 전체를 조회한다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } - ) - ResponseEntity> getHappinessThemes(); + @Operation( + summary = "행복 루틴 테마 목록 조회", + description = "행복 루틴 테마 전체를 조회한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> getHappinessThemes(); } diff --git a/src/main/java/com/soptie/server/theme/controller/v1/dto/response/HappinessThemeListGetResponse.java b/src/main/java/com/soptie/server/theme/controller/v1/dto/response/HappinessThemeListGetResponse.java index 3d411a98..b520bdcb 100644 --- a/src/main/java/com/soptie/server/theme/controller/v1/dto/response/HappinessThemeListGetResponse.java +++ b/src/main/java/com/soptie/server/theme/controller/v1/dto/response/HappinessThemeListGetResponse.java @@ -1,6 +1,8 @@ package com.soptie.server.theme.controller.v1.dto.response; -import static lombok.AccessLevel.PRIVATE; +import static lombok.AccessLevel.*; + +import java.util.List; import com.soptie.server.theme.service.dto.response.ThemeListGetServiceResponse; import com.soptie.server.theme.service.dto.response.ThemeListGetServiceResponse.ThemeServiceResponse; @@ -8,30 +10,20 @@ import lombok.Builder; import lombok.NonNull; -import java.util.List; - @Builder(access = PRIVATE) -public record HappinessThemeListGetResponse( - @NonNull List themes -) { - - public static HappinessThemeListGetResponse of(ThemeListGetServiceResponse response) { - return HappinessThemeListGetResponse.builder() - .themes(response.themes().stream().map(HappinessThemeResponse::of).toList()) - .build(); - } - - @Builder - public record HappinessThemeResponse( - long themeId, - @NonNull String name - ) { - - private static HappinessThemeResponse of(ThemeServiceResponse response) { - return HappinessThemeResponse.builder() - .themeId(response.themeId()) - .name(response.name()) - .build(); - } - } +public record HappinessThemeListGetResponse(@NonNull List themes) { + + public static HappinessThemeListGetResponse of(ThemeListGetServiceResponse response) { + return HappinessThemeListGetResponse.builder() + .themes(response.themes().stream().map(HappinessThemeResponse::of).toList()) + .build(); + } + + @Builder + public record HappinessThemeResponse(long themeId, @NonNull String name) { + + private static HappinessThemeResponse of(ThemeServiceResponse response) { + return HappinessThemeResponse.builder().themeId(response.themeId()).name(response.name()).build(); + } + } } diff --git a/src/main/java/com/soptie/server/theme/controller/v2/ThemeApi.java b/src/main/java/com/soptie/server/theme/controller/v2/ThemeApi.java index 770209a4..d081e38d 100644 --- a/src/main/java/com/soptie/server/theme/controller/v2/ThemeApi.java +++ b/src/main/java/com/soptie/server/theme/controller/v2/ThemeApi.java @@ -16,21 +16,18 @@ public interface ThemeApi { @Operation( - summary = "테마 목록 조회", - description = "일반 테마 목록을 조회한다. (전문가 테마 미포함)", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "4xx", - description = "클라이언트(요청) 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } + summary = "테마 목록 조회", + description = "일반 테마 목록을 조회한다. (전문가 테마 미포함)", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) ResponseEntity> acquireAllInBasic(); } diff --git a/src/main/java/com/soptie/server/theme/controller/v2/dto/response/ThemeListAcquireResponse.java b/src/main/java/com/soptie/server/theme/controller/v2/dto/response/ThemeListAcquireResponse.java index db4fdfea..a1bfb8d5 100644 --- a/src/main/java/com/soptie/server/theme/controller/v2/dto/response/ThemeListAcquireResponse.java +++ b/src/main/java/com/soptie/server/theme/controller/v2/dto/response/ThemeListAcquireResponse.java @@ -1,39 +1,40 @@ package com.soptie.server.theme.controller.v2.dto.response; +import static lombok.AccessLevel.*; + import java.util.List; import com.soptie.server.theme.service.vo.ThemeVO; -import lombok.AccessLevel; import lombok.Builder; import lombok.NonNull; -@Builder(access = AccessLevel.PRIVATE) +@Builder(access = PRIVATE) public record ThemeListAcquireResponse( - @NonNull List themes + @NonNull List themes ) { public static ThemeListAcquireResponse from(List themes) { return ThemeListAcquireResponse.builder() - .themes(themes.stream().map(ThemeResponse::from).toList()) - .build(); + .themes(themes.stream().map(ThemeResponse::from).toList()) + .build(); } - @Builder(access = AccessLevel.PRIVATE) + @Builder(access = PRIVATE) private record ThemeResponse( - long themeId, - @NonNull String title, - @NonNull String subTitle, - @NonNull String description + long themeId, + @NonNull String title, + @NonNull String subTitle, + @NonNull String description ) { private static ThemeResponse from(ThemeVO theme) { return ThemeResponse.builder() - .themeId(theme.themeId()) - .title(theme.name()) - .subTitle(theme.modifier()) - .description(theme.description()) - .build(); + .themeId(theme.themeId()) + .title(theme.name()) + .subTitle(theme.modifier()) + .description(theme.description()) + .build(); } } } diff --git a/src/main/java/com/soptie/server/theme/entity/ThemeImageInfo.java b/src/main/java/com/soptie/server/theme/entity/ThemeImageInfo.java index 10c72ea0..a1953a76 100644 --- a/src/main/java/com/soptie/server/theme/entity/ThemeImageInfo.java +++ b/src/main/java/com/soptie/server/theme/entity/ThemeImageInfo.java @@ -19,7 +19,10 @@ public class ThemeImageInfo { private String happinessCardImageUrl; - public ThemeImageInfo(String iconImageUrl, String backgroundImageUrl, String dailyCardImageUrl, String dailyIconImageUrl, String happinessCardImageUrl) { + public ThemeImageInfo( + String iconImageUrl, String backgroundImageUrl, String dailyCardImageUrl, String dailyIconImageUrl, + String happinessCardImageUrl + ) { this.iconImageUrl = iconImageUrl; this.backgroundImageUrl = backgroundImageUrl; this.dailyCardImageUrl = dailyCardImageUrl; diff --git a/src/main/java/com/soptie/server/theme/message/ThemeErrorCode.java b/src/main/java/com/soptie/server/theme/message/ThemeErrorCode.java index c566b66d..b9629583 100644 --- a/src/main/java/com/soptie/server/theme/message/ThemeErrorCode.java +++ b/src/main/java/com/soptie/server/theme/message/ThemeErrorCode.java @@ -12,8 +12,7 @@ public enum ThemeErrorCode { /* 404 NOT_FOUND : 자원을 찾을 수 없음 */ - INVALID_THEME(NOT_FOUND, "유효하지 않은 테마입니다."), - ; + INVALID_THEME(NOT_FOUND, "유효하지 않은 테마입니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/soptie/server/theme/message/ThemeSuccessMessage.java b/src/main/java/com/soptie/server/theme/message/ThemeSuccessMessage.java index e1472b4e..80d5da74 100644 --- a/src/main/java/com/soptie/server/theme/message/ThemeSuccessMessage.java +++ b/src/main/java/com/soptie/server/theme/message/ThemeSuccessMessage.java @@ -9,8 +9,7 @@ public enum ThemeSuccessMessage { SUCCESS_GET_THEME("데일리 루틴 테마 조회 성공"), SUCCESS_GET_HAPPINESS_THEME("행복 루틴 테마 조회 성공"), - SUCCESS_ACQUIRE_ALL("테마 목록 조회 성공") - ; + SUCCESS_ACQUIRE_ALL("테마 목록 조회 성공"); private final String message; } diff --git a/src/main/java/com/soptie/server/theme/repository/ThemeCustomRepository.java b/src/main/java/com/soptie/server/theme/repository/ThemeCustomRepository.java index 4081e408..09f77b84 100644 --- a/src/main/java/com/soptie/server/theme/repository/ThemeCustomRepository.java +++ b/src/main/java/com/soptie/server/theme/repository/ThemeCustomRepository.java @@ -6,5 +6,6 @@ public interface ThemeCustomRepository { List findAllOrderByNameAsc(); + List findAllInBasic(); } diff --git a/src/main/java/com/soptie/server/version/controller/VersionApi.java b/src/main/java/com/soptie/server/version/controller/VersionApi.java index d4e085b3..e479558b 100644 --- a/src/main/java/com/soptie/server/version/controller/VersionApi.java +++ b/src/main/java/com/soptie/server/version/controller/VersionApi.java @@ -16,16 +16,14 @@ public interface VersionApi { @Operation( - summary = "모바일 앱 버전 조회", - description = "모바일 앱(클라이언트) 버전 정보를 조회합니다.", - responses = { - @ApiResponse(responseCode = "200", description = "성공"), - @ApiResponse( - responseCode = "500", - description = "서버 내부 오류", - content = @Content(schema = @Schema(implementation = ErrorResponse.class)) - ) - } + summary = "모바일 앱 버전 조회", + description = "모바일 앱(클라이언트) 버전 정보를 조회합니다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) ResponseEntity> getClientAppVersion(); } diff --git a/src/main/java/com/soptie/server/version/message/SuccessMessage.java b/src/main/java/com/soptie/server/version/message/SuccessMessage.java index 303516c4..5d240b14 100644 --- a/src/main/java/com/soptie/server/version/message/SuccessMessage.java +++ b/src/main/java/com/soptie/server/version/message/SuccessMessage.java @@ -7,8 +7,7 @@ @Getter public enum SuccessMessage { - SUCCESS_GET_APP_VERSION("버전 정보 조회 성공"), - ; + SUCCESS_GET_APP_VERSION("버전 정보 조회 성공"); private final String message; } diff --git a/src/main/java/com/soptie/server/version/service/VersionServiceImpl.java b/src/main/java/com/soptie/server/version/service/VersionServiceImpl.java index 0c913d94..0f4ace27 100644 --- a/src/main/java/com/soptie/server/version/service/VersionServiceImpl.java +++ b/src/main/java/com/soptie/server/version/service/VersionServiceImpl.java @@ -13,16 +13,14 @@ @Transactional(readOnly = true) public class VersionServiceImpl implements VersionService { - private final ValueConfig valueConfig; - @Override public AppVersionGetServiceResponse getClientAppVersion() { return AppVersionGetServiceResponse.of( - valueConfig.getIOS_APP_VERSION(), - valueConfig.getIOS_FORCE_UPDATE_VERSION(), - valueConfig.getANDROID_APP_VERSION(), - valueConfig.getANDROID_FORCE_UPDATE_VERSION(), - valueConfig.getNOTIFICATION_TITLE(), - valueConfig.getNOTIFICATION_CONTENT()); + ValueConfig.IOS_APP_VERSION, + ValueConfig.IOS_FORCE_UPDATE_VERSION, + ValueConfig.ANDROID_APP_VERSION, + ValueConfig.ANDROID_FORCE_UPDATE_VERSION, + ValueConfig.NOTIFICATION_TITLE, + ValueConfig.NOTIFICATION_CONTENT); } } diff --git a/src/main/java/com/soptie/server/version/service/dto/response/AppVersionGetServiceResponse.java b/src/main/java/com/soptie/server/version/service/dto/response/AppVersionGetServiceResponse.java index 53dba70f..20ede984 100644 --- a/src/main/java/com/soptie/server/version/service/dto/response/AppVersionGetServiceResponse.java +++ b/src/main/java/com/soptie/server/version/service/dto/response/AppVersionGetServiceResponse.java @@ -1,44 +1,44 @@ package com.soptie.server.version.service.dto.response; -import static lombok.AccessLevel.PRIVATE; +import static lombok.AccessLevel.*; import lombok.Builder; @Builder(access = PRIVATE) public record AppVersionGetServiceResponse( - VersionServiceResponse iosVersion, - VersionServiceResponse androidVersion, - String notificationTitle, - String notificationContent + VersionServiceResponse iosVersion, + VersionServiceResponse androidVersion, + String notificationTitle, + String notificationContent ) { public static AppVersionGetServiceResponse of( - String iOSAppVersion, - String iosForceUpdateVersion, - String androidAppVersion, - String androidForceUpdateVersion, - String notificationTitle, - String notificationContent + String iosAppVersion, + String iosForceUpdateVersion, + String androidAppVersion, + String androidForceUpdateVersion, + String notificationTitle, + String notificationContent ) { return AppVersionGetServiceResponse.builder() - .iosVersion(VersionServiceResponse.of(iOSAppVersion, iosForceUpdateVersion)) - .androidVersion(VersionServiceResponse.of(androidAppVersion, androidForceUpdateVersion)) - .notificationTitle(notificationTitle) - .notificationContent(notificationContent) - .build(); + .iosVersion(VersionServiceResponse.of(iosAppVersion, iosForceUpdateVersion)) + .androidVersion(VersionServiceResponse.of(androidAppVersion, androidForceUpdateVersion)) + .notificationTitle(notificationTitle) + .notificationContent(notificationContent) + .build(); } @Builder(access = PRIVATE) public record VersionServiceResponse( - String appVersion, - String forceUpdateVersion + String appVersion, + String forceUpdateVersion ) { private static VersionServiceResponse of(String appVersion, String forceUpdateVersion) { return VersionServiceResponse.builder() - .appVersion(appVersion) - .forceUpdateVersion(forceUpdateVersion) - .build(); + .appVersion(appVersion) + .forceUpdateVersion(forceUpdateVersion) + .build(); } } } diff --git a/src/test/java/com/soptie/server/auth/service/AuthServiceImplTest.java b/src/test/java/com/soptie/server/auth/service/AuthServiceImplTest.java index d9702246..251f5101 100644 --- a/src/test/java/com/soptie/server/auth/service/AuthServiceImplTest.java +++ b/src/test/java/com/soptie/server/auth/service/AuthServiceImplTest.java @@ -1,13 +1,10 @@ package com.soptie.server.auth.service; -import com.soptie.server.auth.service.dto.request.TokenGetServiceRequest; -import com.soptie.server.auth.service.dto.response.TokenGetServiceResponse; -import com.soptie.server.auth.jwt.JwtTokenProvider; -import com.soptie.server.auth.jwt.UserAuthentication; -import com.soptie.server.common.config.ValueConfig; -import com.soptie.server.member.entity.Member; -import com.soptie.server.member.repository.MemberRepository; -import com.soptie.server.support.fixture.MemberFixture; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -15,65 +12,69 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.doReturn; +import com.soptie.server.auth.jwt.JwtTokenProvider; +import com.soptie.server.auth.jwt.UserAuthentication; +import com.soptie.server.auth.service.dto.request.TokenGetServiceRequest; +import com.soptie.server.auth.service.dto.response.TokenGetServiceResponse; +import com.soptie.server.common.config.ValueConfig; +import com.soptie.server.member.entity.Member; +import com.soptie.server.member.repository.MemberRepository; +import com.soptie.server.support.fixture.MemberFixture; @ExtendWith(MockitoExtension.class) class AuthServiceImplTest { - @InjectMocks - private AuthServiceImpl authService; - - @Mock - private MemberRepository memberRepository; - - @Mock - private ValueConfig valueConfig; - - @Mock - private JwtTokenProvider jwtTokenProvider; - - @Test - @DisplayName("로그아웃을 하면 리프레시 토큰 값이 null이 된다.") - void 로그아웃을_하면_리프레시_토큰이_비워진다() { - // given - long memberId = 1L; - Member member = member(memberId); - doReturn(Optional.of(member)).when(memberRepository).findById(memberId); - member.updateRefreshToken("refreshToken"); - - // when - authService.signOut(member.getId()); - - // then - assertThat(member.getRefreshToken()).isNull(); - } - - @Test - @DisplayName("파러미터로 받은 리프레시 토큰을 가지고 있는 멤버가 있다면 액세스 토큰을 재발급 해준다.") - void 리프레시_토큰을_가지고_있는_멤버가_있다면_액세스_토큰을_재발급_해줄_수_있다() { - // given - long memberId = 1L; - Member member = member(memberId); - String token = "refreshToken"; - doReturn(Optional.of(member)).when(memberRepository).findByRefreshToken(token); - doReturn("Bearer ").when(valueConfig).getBEARER_HEADER(); - doReturn("").when(valueConfig).getBLANK(); - doReturn(60000L).when(valueConfig).getAccessTokenExpired(); - doReturn(token).when(jwtTokenProvider) - .generateToken(new UserAuthentication(member.getId(), null, null), 60000L); - - // when - TokenGetServiceResponse result = authService.reissueToken(TokenGetServiceRequest.of("Bearer " + token)); - - // then - assertThat(result).isEqualTo(TokenGetServiceResponse.of(token)); - } - - private Member member(long memberId) { - Member member = MemberFixture.member().id(memberId).build(); - return member; - } + @InjectMocks + private AuthServiceImpl authService; + + @Mock + private MemberRepository memberRepository; + + @Mock + private ValueConfig valueConfig; + + @Mock + private JwtTokenProvider jwtTokenProvider; + + @Test + @DisplayName("로그아웃을 하면 리프레시 토큰 값이 null이 된다.") + void emptyRefreshTokenAfterLogout() { + // given + long memberId = 1L; + Member member = member(memberId); + doReturn(Optional.of(member)).when(memberRepository).findById(memberId); + member.updateRefreshToken("refreshToken"); + + // when + authService.signOut(member.getId()); + + // then + assertThat(member.getRefreshToken()).isNull(); + } + + @Test + @DisplayName("파러미터로 받은 리프레시 토큰을 가지고 있는 멤버가 있다면 액세스 토큰을 재발급 해준다.") + void refreshAccessTokenForMemberWithRefreshToken() { + // given + long memberId = 1L; + Member member = member(memberId); + String token = "refreshToken"; + doReturn(Optional.of(member)).when(memberRepository).findByRefreshToken(token); + // doReturn("Bearer ").when(valueConfig).getBEARER_HEADER(); + // doReturn("").when(valueConfig).getBLANK(); + doReturn(60000L).when(valueConfig).getAccessTokenExpired(); + doReturn(token).when(jwtTokenProvider) + .generateToken(new UserAuthentication(member.getId(), null, null), 60000L); + + // when + TokenGetServiceResponse result = authService.reissueToken(TokenGetServiceRequest.of("Bearer " + token)); + + // then + assertThat(result).isEqualTo(TokenGetServiceResponse.of(token)); + } + + private Member member(long memberId) { + Member member = MemberFixture.member().id(memberId).build(); + return member; + } } diff --git a/src/test/java/com/soptie/server/doll/service/DollServiceImplTest.java b/src/test/java/com/soptie/server/doll/service/DollServiceImplTest.java index 54e06c7c..8c2ae574 100644 --- a/src/test/java/com/soptie/server/doll/service/DollServiceImplTest.java +++ b/src/test/java/com/soptie/server/doll/service/DollServiceImplTest.java @@ -1,10 +1,10 @@ package com.soptie.server.doll.service; -import com.soptie.server.doll.dto.DollImageResponse; -import com.soptie.server.doll.entity.Doll; -import com.soptie.server.doll.entity.DollType; -import com.soptie.server.doll.repository.DollRepository; -import com.soptie.server.support.fixture.DollFixture; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -13,38 +13,39 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.doReturn; +import com.soptie.server.doll.dto.DollImageResponse; +import com.soptie.server.doll.entity.Doll; +import com.soptie.server.doll.entity.DollType; +import com.soptie.server.doll.repository.DollRepository; +import com.soptie.server.support.fixture.DollFixture; @ExtendWith(MockitoExtension.class) class DollServiceImplTest { - @InjectMocks - private DollServiceImpl dollService; + @InjectMocks + private DollServiceImpl dollService; - @Mock - private DollRepository dollRepository; + @Mock + private DollRepository dollRepository; - @ParameterizedTest - @DisplayName("인형 타입에 해당하는 인형 이미지 주소를 토대로 DollImageResponse를 생성한다.") - @CsvSource(value = {"brown, BROWN", "gray, GRAY", "red, RED", "white, WHITE"}) - void 인형_타입에_맞는_인형_이미지_주소를_가져온다(String faceImageUrl, DollType dollType) { - // given - Long id = 1L; - Doll doll = doll(id, dollType, faceImageUrl); + @ParameterizedTest + @DisplayName("인형 타입에 해당하는 인형 이미지 주소를 토대로 DollImageResponse를 생성한다.") + @CsvSource(value = {"brown, BROWN", "gray, GRAY", "red, RED", "white, WHITE"}) + void acquireImageUriByDollType(String faceImageUrl, DollType dollType) { + // given + Long id = 1L; + Doll doll = doll(id, dollType, faceImageUrl); - // when - DollImageResponse response = dollService.getDollImage(dollType); + // when + DollImageResponse response = dollService.getDollImage(dollType); - // then - assertThat(DollImageResponse.of(doll)).isEqualTo(response); - } + // then + assertThat(DollImageResponse.of(doll)).isEqualTo(response); + } - private Doll doll(Long id, DollType dollType, String faceImageUrl) { - Doll doll = DollFixture.doll().id(id).dollType(dollType).faceImageUrl(faceImageUrl).build(); - doReturn(Optional.of(doll)).when(dollRepository).findByDollType(dollType); - return doll; - } + private Doll doll(Long id, DollType dollType, String faceImageUrl) { + Doll doll = DollFixture.doll().id(id).dollType(dollType).faceImageUrl(faceImageUrl).build(); + doReturn(Optional.of(doll)).when(dollRepository).findByDollType(dollType); + return doll; + } } diff --git a/src/test/java/com/soptie/server/member/service/MemberDollServiceImplTest.java b/src/test/java/com/soptie/server/member/service/MemberDollServiceImplTest.java new file mode 100644 index 00000000..9eb77ee1 --- /dev/null +++ b/src/test/java/com/soptie/server/member/service/MemberDollServiceImplTest.java @@ -0,0 +1,55 @@ +package com.soptie.server.member.service; + +import static com.soptie.server.doll.entity.DollType.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Optional; + +import org.junit.jupiter.api.DisplayName; +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 com.soptie.server.doll.entity.Doll; +import com.soptie.server.doll.repository.DollRepository; +import com.soptie.server.member.entity.Member; +import com.soptie.server.member.repository.MemberDollRepository; +import com.soptie.server.member.service.doll.MemberDollServiceImpl; +import com.soptie.server.support.fixture.MemberFixture; + +@ExtendWith(MockitoExtension.class) +class MemberDollServiceImplTest { + + @InjectMocks + private MemberDollServiceImpl memberDollService; + + @Mock + private DollRepository dollRepository; + + @Mock + private MemberDollRepository memberDollRepository; + + @Test + @DisplayName("멤버 인형을 생성하고 이를 멤버의 멤버 인형으로 설정한다.") + void addMemberDoll() { + // given + long id = 1L; + String name = "brownie"; + Member member = member(id); + doReturn(Optional.of(new Doll())).when(dollRepository).findByDollType(BROWN); + + // when + memberDollService.createMemberDoll(member, BROWN, name); + + // then + assertThat(member.getMemberDoll().getName()).isEqualTo(name); + } + + private Member member(long memberId) { + Member member = MemberFixture.member().id(memberId).build(); + return member; + } +} diff --git a/src/test/java/com/soptie/server/memberRoutine/service/MemberRoutineServiceTest.java b/src/test/java/com/soptie/server/member/service/MemberRoutineServiceTest.java similarity index 79% rename from src/test/java/com/soptie/server/memberRoutine/service/MemberRoutineServiceTest.java rename to src/test/java/com/soptie/server/member/service/MemberRoutineServiceTest.java index 5ce45b1a..0f187756 100644 --- a/src/test/java/com/soptie/server/memberRoutine/service/MemberRoutineServiceTest.java +++ b/src/test/java/com/soptie/server/member/service/MemberRoutineServiceTest.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service; +package com.soptie.server.member.service; import static com.soptie.server.routine.entity.RoutineType.*; import static org.assertj.core.api.Assertions.*; @@ -16,11 +16,12 @@ import org.mockito.junit.jupiter.MockitoExtension; import com.soptie.server.member.adapter.MemberFinder; +import com.soptie.server.member.adapter.MemberRoutineDeleter; +import com.soptie.server.member.adapter.MemberRoutineFinder; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.adapter.MemberRoutineDeleter; -import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutineAchieveServiceRequest; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.member.service.dto.request.routine.MemberRoutineAchieveServiceRequest; +import com.soptie.server.member.service.routine.MemberRoutineUpdateService; import com.soptie.server.support.fixture.MemberFixture; import com.soptie.server.support.fixture.MemberRoutineFixture; @@ -49,20 +50,18 @@ void shouldUpdateAchieveCountAndCottonCountWhenAchieveDailyRoutine() { Member member = MemberFixture.member().id(1L).dailyCotton(beforeCottonCount).build(); MemberRoutine memberRoutine = MemberRoutineFixture.memberRoutine() - .id(3L) - .type(DAILY) - .isAchieve(false) - .achieveCount(beforeAchieveCount) - .member(member) - .build(); + .id(3L) + .type(DAILY) + .isAchieve(false) + .achieveCount(beforeAchieveCount) + .member(member) + .build(); doReturn(member).when(memberFinder).findById(member.getId()); doReturn(memberRoutine).when(memberRoutineFinder).findById(memberRoutine.getId()); - MemberRoutineAchieveServiceRequest request = MemberRoutineAchieveServiceRequest.of( - member.getId(), - memberRoutine.getId() - ); + MemberRoutineAchieveServiceRequest request = MemberRoutineAchieveServiceRequest.of(member.getId(), + memberRoutine.getId()); // when memberRoutineUpdateService.achieveMemberRoutine(request); @@ -82,21 +81,19 @@ void shouldUpdateAchieveCountAndCottonCountWhenAchieveHappinessRoutine() { Member member = MemberFixture.member().id(1L).dailyCotton(beforeCottonCount).build(); MemberRoutine memberRoutine = MemberRoutineFixture.memberRoutine() - .id(3L) - .type(CHALLENGE) - .isAchieve(false) - .achieveCount(beforeAchieveCount) - .member(member) - .build(); + .id(3L) + .type(CHALLENGE) + .isAchieve(false) + .achieveCount(beforeAchieveCount) + .member(member) + .build(); doReturn(member).when(memberFinder).findById(member.getId()); doReturn(memberRoutine).when(memberRoutineFinder).findById(memberRoutine.getId()); doNothing().when(memberRoutineDeleter).softDelete(memberRoutine); - MemberRoutineAchieveServiceRequest request = MemberRoutineAchieveServiceRequest.of( - member.getId(), - memberRoutine.getId() - ); + MemberRoutineAchieveServiceRequest request = MemberRoutineAchieveServiceRequest.of(member.getId(), + memberRoutine.getId()); // when memberRoutineUpdateService.achieveMemberRoutine(request); @@ -112,9 +109,8 @@ void shouldUpdateAchieveCountAndCottonCountWhenAchieveHappinessRoutine() { void updateAchieveFalseAchievedMemberRoutine() { // given List memberRoutines = List.of( - MemberRoutineFixture.memberRoutine().id(1L).isAchieve(true).build(), - MemberRoutineFixture.memberRoutine().id(2L).isAchieve(true).build() - ); + MemberRoutineFixture.memberRoutine().id(1L).isAchieve(true).build(), + MemberRoutineFixture.memberRoutine().id(2L).isAchieve(true).build()); doReturn(memberRoutines).when(memberRoutineFinder).findAchieved(); @@ -126,4 +122,4 @@ void updateAchieveFalseAchievedMemberRoutine() { assertThat(memberRoutines.get(1).isAchieve()).isFalse(); } -} \ No newline at end of file +} diff --git a/src/test/java/com/soptie/server/member/service/MemberServiceImplTest.java b/src/test/java/com/soptie/server/member/service/MemberServiceImplTest.java index 6c9ec4b3..069a5643 100644 --- a/src/test/java/com/soptie/server/member/service/MemberServiceImplTest.java +++ b/src/test/java/com/soptie/server/member/service/MemberServiceImplTest.java @@ -1,54 +1,47 @@ package com.soptie.server.member.service; +import static com.soptie.server.doll.entity.DollType.*; +import static com.soptie.server.member.message.ErrorCode.*; +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.List; + +import org.junit.jupiter.api.DisplayName; +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 com.soptie.server.conversation.adapter.ConversationFinder; import com.soptie.server.conversation.entity.Conversation; -import com.soptie.server.doll.adapter.DollFinder; import com.soptie.server.doll.entity.Doll; import com.soptie.server.doll.entity.DollType; -import com.soptie.server.member.adapter.MemberDeleter; import com.soptie.server.member.adapter.MemberFinder; -import com.soptie.server.member.controller.dto.request.MemberProfileCreateRequest; -import com.soptie.server.member.service.dto.request.CottonGiveServiceRequest; -import com.soptie.server.member.service.dto.request.MemberHomeInfoGetServiceRequest; -import com.soptie.server.member.service.dto.response.MemberHomeInfoGetServiceResponse; -import com.soptie.server.member.service.dto.request.MemberProfileCreateServiceRequest; import com.soptie.server.member.entity.CottonType; import com.soptie.server.member.entity.Member; +import com.soptie.server.member.entity.MemberDoll; import com.soptie.server.member.exception.MemberException; -import com.soptie.server.memberDoll.adapter.MemberDollSaver; -import com.soptie.server.memberDoll.entity.MemberDoll; -import com.soptie.server.memberRoutine.adapter.MemberRoutineSaver; -import com.soptie.server.routine.adapter.RoutineFinder; +import com.soptie.server.member.service.dto.request.CottonGiveServiceRequest; +import com.soptie.server.member.service.dto.request.MemberHomeInfoGetServiceRequest; +import com.soptie.server.member.service.dto.response.MemberHomeInfoGetServiceResponse; import com.soptie.server.support.fixture.ConversationFixture; import com.soptie.server.support.fixture.DollFixture; import com.soptie.server.support.fixture.MemberDollFixture; import com.soptie.server.support.fixture.MemberFixture; -import org.junit.jupiter.api.DisplayName; -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 java.util.List; - -import static com.soptie.server.doll.entity.DollType.BROWN; -import static com.soptie.server.member.message.ErrorCode.NOT_ENOUGH_COTTON; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class MemberServiceImplTest { - @InjectMocks - private MemberServiceImpl memberService; + @InjectMocks + private MemberServiceImpl memberService; - @Mock - private MemberFinder memberFinder; + @Mock + private MemberFinder memberFinder; - @Mock - private ConversationFinder conversationFinder; + @Mock + private ConversationFinder conversationFinder; /* @Test @DisplayName("멤버 프로필 생성 시, 멤버 데일리 루틴 생성과 멤버 인형 생성 메소드를 호출한다.") @@ -71,94 +64,100 @@ class MemberServiceImplTest { verify(memberService).createMemberDoll(member, dollType, name); }*/ - @Test - @DisplayName("솜뭉치 개수가 양수일 때 솜뭉치를 줄 수 있다.") - void canGiveCottonWhenCottonCountIsPositive() { - // given - long memberId = 1L; - MemberDoll memberDoll = new MemberDoll(1L); - Member member = member(memberId, memberDoll, 1); - int beforeCotton = member.getCottonInfo().getDailyCottonCount(); - - // when - memberService.giveCotton(CottonGiveServiceRequest.of(member.getId(), CottonType.DAILY)); - - // then - assertThat(member.getCottonInfo().getDailyCottonCount()).isEqualTo(beforeCotton - 1); - } - - @Test - @DisplayName("솜뭉치 개수가 0일 때 솜뭉치를 주려 하면 예외가 발생한다.") - void occurExceptionGiveCottonWhenCottonCountIsZero() { - // given - long memberId = 1L; - MemberDoll memberDoll = new MemberDoll(1L); - Member member = member(memberId, memberDoll); - - // when, then - assertThatThrownBy(() -> memberService.giveCotton(CottonGiveServiceRequest.of(member.getId(), CottonType.DAILY))) - .isInstanceOf(MemberException.class) - .hasMessage("[MemberException] : " + NOT_ENOUGH_COTTON.getMessage()); - } - - @Test - @DisplayName("멤버의 멤버 인형 정보와 솜뭉치 개수를 가져온다.") - void 멤버_프로필_정보를_가져온다() { - // given - long dollId = 1L; - Doll doll = doll(dollId, BROWN, "faceImageUrl"); - long memberDollId = 2L; - MemberDoll memberDoll = memberDoll(memberDollId, "memberDoll", 0, doll); - long memberId = 3L; - Member member = member(memberId, memberDoll); - List conversationIds = List.of(1L, 2L); - List conversations = conversations(conversationIds); - - // when - MemberHomeInfoGetServiceResponse result = memberService.getMemberHomeInfo(MemberHomeInfoGetServiceRequest.of(memberId)); - - // then - assertThat(MemberHomeInfoGetServiceResponse.of(member, conversations.stream().map(Conversation::getContent).toList())).isEqualTo(result); - } - - - private Member member(long memberId) { - Member member = MemberFixture.member().id(memberId).build(); - doReturn(member).when(memberFinder).findById(memberId); - return member; - } - - private Member member(long memberId, MemberDoll memberDoll) { - Member member = MemberFixture.member().id(memberId).memberDoll(memberDoll).build(); - doReturn(member).when(memberFinder).findById(memberId); - return member; - } - - private Member member(long memberId, MemberDoll memberDoll, int dailyCottonCount) { - Member member = MemberFixture.member().id(memberId).memberDoll(memberDoll).dailyCotton(dailyCottonCount).build(); - doReturn(member).when(memberFinder).findById(memberId); - return member; - } - - private MemberDoll memberDoll(long memberDollId, String name, int happinessCottonCount, Doll doll) { - MemberDoll memberDoll = MemberDollFixture.memberDoll().id(memberDollId).name(name) - .happinessCottonCount(happinessCottonCount).doll(doll).build(); - return memberDoll; - } - - private Doll doll(Long id, DollType dollType, String faceImageUrl) { - Doll doll = DollFixture.doll().id(id).dollType(dollType).faceImageUrl(faceImageUrl).build(); - return doll; - } - - private List conversations(List conversationIds) { - List conversations = conversationIds.stream() - .map(conversationId -> ConversationFixture.conversation() - .id(conversationId) - .content("conversation" + conversationId) - .build() - ).toList(); - doReturn(conversations).when(conversationFinder).findAll(); - return conversations; - } + @Test + @DisplayName("솜뭉치 개수가 양수일 때 솜뭉치를 줄 수 있다.") + void canGiveCottonWhenCottonCountIsPositive() { + // given + long memberId = 1L; + MemberDoll memberDoll = new MemberDoll(1L); + Member member = member(memberId, memberDoll, 1); + int beforeCotton = member.getCottonInfo().getDailyCottonCount(); + + // when + memberService.giveCotton(CottonGiveServiceRequest.of(member.getId(), CottonType.DAILY)); + + // then + assertThat(member.getCottonInfo().getDailyCottonCount()).isEqualTo(beforeCotton - 1); + } + + @Test + @DisplayName("솜뭉치 개수가 0일 때 솜뭉치를 주려 하면 예외가 발생한다.") + void occurExceptionGiveCottonWhenCottonCountIsZero() { + // given + long memberId = 1L; + MemberDoll memberDoll = new MemberDoll(1L); + Member member = member(memberId, memberDoll); + + // when, then + assertThatThrownBy( + () -> memberService.giveCotton(CottonGiveServiceRequest.of(member.getId(), CottonType.DAILY))) + .isInstanceOf(MemberException.class) + .hasMessage("[MemberException] : " + NOT_ENOUGH_COTTON.getMessage()); + } + + @Test + @DisplayName("멤버의 멤버 인형 정보와 솜뭉치 개수를 가져온다.") + void acquireProfile() { + // given + long dollId = 1L; + Doll doll = doll(dollId, BROWN, "faceImageUrl"); + long memberDollId = 2L; + MemberDoll memberDoll = memberDoll(memberDollId, "memberDoll", 0, doll); + long memberId = 3L; + Member member = member(memberId, memberDoll); + List conversationIds = List.of(1L, 2L); + List conversations = conversations(conversationIds); + + // when + MemberHomeInfoGetServiceResponse result = memberService.getMemberHomeInfo( + MemberHomeInfoGetServiceRequest.of(memberId)); + + // then + assertThat(MemberHomeInfoGetServiceResponse.of(member, + conversations.stream().map(Conversation::getContent).toList())).isEqualTo(result); + } + + private Member member(long memberId) { + Member member = MemberFixture.member().id(memberId).build(); + doReturn(member).when(memberFinder).findById(memberId); + return member; + } + + private Member member(long memberId, MemberDoll memberDoll) { + Member member = MemberFixture.member().id(memberId).memberDoll(memberDoll).build(); + doReturn(member).when(memberFinder).findById(memberId); + return member; + } + + private Member member(long memberId, MemberDoll memberDoll, int dailyCottonCount) { + Member member = MemberFixture.member() + .id(memberId) + .memberDoll(memberDoll) + .dailyCotton(dailyCottonCount) + .build(); + doReturn(member).when(memberFinder).findById(memberId); + return member; + } + + private MemberDoll memberDoll(long memberDollId, String name, int happinessCottonCount, Doll doll) { + MemberDoll memberDoll = MemberDollFixture.memberDoll().id(memberDollId).name(name) + .happinessCottonCount(happinessCottonCount).doll(doll).build(); + return memberDoll; + } + + private Doll doll(Long id, DollType dollType, String faceImageUrl) { + Doll doll = DollFixture.doll().id(id).dollType(dollType).faceImageUrl(faceImageUrl).build(); + return doll; + } + + private List conversations(List conversationIds) { + List conversations = conversationIds.stream() + .map(conversationId -> ConversationFixture.conversation() + .id(conversationId) + .content("conversation" + conversationId) + .build() + ).toList(); + doReturn(conversations).when(conversationFinder).findAll(); + return conversations; + } } diff --git a/src/test/java/com/soptie/server/memberRoutine/service/integration/MemberRoutineServiceIntegrationTest.java b/src/test/java/com/soptie/server/member/service/integration/MemberRoutineServiceIntegrationTest.java similarity index 55% rename from src/test/java/com/soptie/server/memberRoutine/service/integration/MemberRoutineServiceIntegrationTest.java rename to src/test/java/com/soptie/server/member/service/integration/MemberRoutineServiceIntegrationTest.java index 1f2c7791..8f8db1a3 100644 --- a/src/test/java/com/soptie/server/memberRoutine/service/integration/MemberRoutineServiceIntegrationTest.java +++ b/src/test/java/com/soptie/server/member/service/integration/MemberRoutineServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.soptie.server.memberRoutine.service.integration; +package com.soptie.server.member.service.integration; import static com.soptie.server.routine.entity.RoutineType.*; import static com.soptie.server.routine.message.RoutineErrorCode.*; @@ -14,27 +14,27 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; +import com.soptie.server.member.controller.v1.dto.request.MemberDailyRoutineCreateRequest; +import com.soptie.server.member.controller.v1.dto.request.MemberHappinessRoutineRequest; +import com.soptie.server.member.entity.DeletedMemberRoutine; import com.soptie.server.member.entity.Member; +import com.soptie.server.member.entity.MemberRoutine; +import com.soptie.server.member.repository.DeletedMemberRoutineRepository; import com.soptie.server.member.repository.MemberRepository; -import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberDailyRoutineCreateRequest; -import com.soptie.server.memberRoutine.controller.v1.dto.request.MemberHappinessRoutineRequest; -import com.soptie.server.memberRoutine.entity.DeletedMemberRoutine; -import com.soptie.server.memberRoutine.entity.MemberRoutine; -import com.soptie.server.memberRoutine.repository.DeletedMemberRoutineRepository; -import com.soptie.server.memberRoutine.repository.MemberRoutineRepository; -import com.soptie.server.memberRoutine.service.MemberRoutineCreateService; -import com.soptie.server.memberRoutine.service.MemberRoutineDeleteService; -import com.soptie.server.memberRoutine.service.MemberRoutineReadService; -import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineCreateServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberRoutinesDeleteServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberDailyRoutineListGetServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineCreateServiceRequest; -import com.soptie.server.memberRoutine.service.dto.request.MemberHappinessRoutineGetServiceRequest; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineListGetServiceResponse; -import com.soptie.server.memberRoutine.service.dto.response.MemberDailyRoutineListGetServiceResponse.MemberDailyRoutineServiceResponse; -import com.soptie.server.memberRoutine.service.dto.response.MemberHappinessRoutineGetServiceResponse; -import com.soptie.server.routine.entity.Routine; +import com.soptie.server.member.repository.MemberRoutineRepository; +import com.soptie.server.member.service.dto.request.routine.MemberRoutinesDeleteServiceRequest; +import com.soptie.server.member.service.dto.request.routine.daily.MemberDailyRoutineCreateServiceRequest; +import com.soptie.server.member.service.dto.request.routine.daily.MemberDailyRoutineListGetServiceRequest; +import com.soptie.server.member.service.dto.request.routine.happiness.MemberHappinessRoutineCreateServiceRequest; +import com.soptie.server.member.service.dto.request.routine.happiness.MemberHappinessRoutineGetServiceRequest; +import com.soptie.server.member.service.dto.response.routine.daily.MemberDailyRoutineListGetServiceResponse; +import com.soptie.server.member.service.dto.response.routine.daily.MemberDailyRoutineListGetServiceResponse.MemberDailyRoutineServiceResponse; +import com.soptie.server.member.service.dto.response.routine.happiness.MemberHappinessRoutineGetServiceResponse; +import com.soptie.server.member.service.routine.MemberRoutineCreateService; +import com.soptie.server.member.service.routine.MemberRoutineDeleteService; +import com.soptie.server.member.service.routine.MemberRoutineReadService; import com.soptie.server.routine.entity.Challenge; +import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.exception.RoutineException; import com.soptie.server.routine.repository.ChallengeRepository; import com.soptie.server.routine.repository.RoutineRepository; @@ -79,32 +79,32 @@ public class MemberRoutineServiceIntegrationTest { ChallengeRepository challengeRepository; @Nested - class createDailyRoutine { + class Add { Member member; Routine routine; + Challenge challenge; @BeforeEach void setUp() { member = memberRepository.save(MemberFixture.member().build()); routine = routineRepository.save(RoutineFixture.routine().build()); + challenge = challengeRepository.save(ChallengeFixture.challenge().build()); } @Test @DisplayName("[성공] 삭제한 적 없는 데일리 루틴을 추가한다.") void createHasNotDeletedDailyRoutine() { // given - MemberDailyRoutineCreateServiceRequest request = MemberDailyRoutineCreateServiceRequest.of( - member.getId(), - new MemberDailyRoutineCreateRequest(routine.getId()) - ); + MemberDailyRoutineCreateServiceRequest request = MemberDailyRoutineCreateServiceRequest.of(member.getId(), + new MemberDailyRoutineCreateRequest(routine.getId())); // when memberRoutineCreateService.createDailyRoutine(request); // then - assertThat(memberRoutineRepository - .existsByMemberAndTypeAndRoutineId(member, routine.getType(), routine.getId())).isTrue(); + assertThat(memberRoutineRepository.existsByMemberAndTypeAndRoutineId(member, routine.getType(), + routine.getId())).isTrue(); } @Test @@ -112,27 +112,24 @@ void createHasNotDeletedDailyRoutine() { void createHasDeletedDailyRoutine() { // given MemberRoutine memberRoutine = MemberRoutineFixture.memberRoutine() - .isAchieve(true) - .achieveCount(5) - .type(routine.getType()) - .routineId(routine.getId()) - .member(member) - .build(); + .isAchieve(true) + .achieveCount(5) + .type(routine.getType()) + .routineId(routine.getId()) + .member(member) + .build(); saveAndDelete(memberRoutine); - MemberDailyRoutineCreateServiceRequest request = MemberDailyRoutineCreateServiceRequest.of( - member.getId(), - new MemberDailyRoutineCreateRequest(routine.getId()) - ); + MemberDailyRoutineCreateServiceRequest request = MemberDailyRoutineCreateServiceRequest.of(member.getId(), + new MemberDailyRoutineCreateRequest(routine.getId())); // when memberRoutineCreateService.createDailyRoutine(request); // then - final MemberRoutine found = memberRoutineRepository - .findByMemberAndTypeAndRoutineId(member, routine.getType(), routine.getId()) - .orElseThrow(RuntimeException::new); + final MemberRoutine found = memberRoutineRepository.findByMemberAndTypeAndRoutineId(member, + routine.getType(), routine.getId()).orElseThrow(RuntimeException::new); assertThat(found.isAchieve()).isTrue(); assertThat(found.getAchieveCount()).isEqualTo(memberRoutine.getAchieveCount()); @@ -142,38 +139,18 @@ void createHasDeletedDailyRoutine() { @DisplayName("[예외] 가지고 있는 데일리 루틴은 추가할 수 없다.") void cannotCreateDailyRoutineIfAlreadyHave() { // given - memberRoutineRepository.save(MemberRoutineFixture - .memberRoutine().type(routine.getType()).routineId(routine.getId()).member(member).build()); + memberRoutineRepository.save(MemberRoutineFixture.memberRoutine() + .type(routine.getType()) + .routineId(routine.getId()) + .member(member) + .build()); - MemberDailyRoutineCreateServiceRequest request = MemberDailyRoutineCreateServiceRequest.of( - member.getId(), - new MemberDailyRoutineCreateRequest(routine.getId()) - ); + MemberDailyRoutineCreateServiceRequest request = MemberDailyRoutineCreateServiceRequest.of(member.getId(), + new MemberDailyRoutineCreateRequest(routine.getId())); // when & then - assertThatThrownBy(() -> memberRoutineCreateService.createDailyRoutine(request)) - .isInstanceOf(RoutineException.class) - .hasMessage("[RoutineException] : " + DUPLICATED_ROUTINE.getMessage()); - } - - private void saveAndDelete(MemberRoutine memberRoutine) { - MemberRoutine savedMemberRoutine = memberRoutineRepository.save(memberRoutine); - deletedMemberRoutineRepository.save(new DeletedMemberRoutine(savedMemberRoutine)); - memberRoutineRepository.delete(savedMemberRoutine); - } - - } - - @Nested - class createChallengeRoutine { - - Member member; - Challenge challenge; - - @BeforeEach - void setUp() { - member = memberRepository.save(MemberFixture.member().build()); - challenge = challengeRepository.save(ChallengeFixture.challenge().build()); + assertThatThrownBy(() -> memberRoutineCreateService.createDailyRoutine(request)).isInstanceOf( + RoutineException.class).hasMessage("[RoutineException] : " + DUPLICATED_ROUTINE.getMessage()); } @Test @@ -181,44 +158,39 @@ void setUp() { void createHasNotDeletedHappinessRoutine() { // given MemberHappinessRoutineCreateServiceRequest request = MemberHappinessRoutineCreateServiceRequest.of( - member.getId(), - new MemberHappinessRoutineRequest(challenge.getId()) - ); + member.getId(), new MemberHappinessRoutineRequest(challenge.getId())); // when memberRoutineCreateService.createHappinessRoutine(request); // then - assertThat(memberRoutineRepository - .existsByMemberAndTypeAndRoutineId(member, CHALLENGE, challenge.getId())).isTrue(); + assertThat(memberRoutineRepository.existsByMemberAndTypeAndRoutineId(member, CHALLENGE, + challenge.getId())).isTrue(); } @Test @DisplayName("[성공] 삭제한 적 있는 행복 루틴을 추가한디.") - void createHasDeletedDailyRoutine() { + void createHasDeletedHappinessRoutine() { // given MemberRoutine memberRoutine = MemberRoutineFixture.memberRoutine() - .isAchieve(true) - .achieveCount(5) - .type(CHALLENGE) - .routineId(challenge.getId()) - .member(member) - .build(); + .isAchieve(true) + .achieveCount(5) + .type(CHALLENGE) + .routineId(challenge.getId()) + .member(member) + .build(); saveAndDelete(memberRoutine); MemberHappinessRoutineCreateServiceRequest request = MemberHappinessRoutineCreateServiceRequest.of( - member.getId(), - new MemberHappinessRoutineRequest(challenge.getId()) - ); + member.getId(), new MemberHappinessRoutineRequest(challenge.getId())); // when memberRoutineCreateService.createHappinessRoutine(request); // then - final MemberRoutine found = memberRoutineRepository - .findByMemberAndTypeAndRoutineId(member, CHALLENGE, challenge.getId()) - .orElseThrow(RuntimeException::new); + final MemberRoutine found = memberRoutineRepository.findByMemberAndTypeAndRoutineId(member, CHALLENGE, + challenge.getId()).orElseThrow(RuntimeException::new); assertThat(found.isAchieve()).isTrue(); assertThat(found.getAchieveCount()).isEqualTo(memberRoutine.getAchieveCount()); @@ -229,18 +201,18 @@ void createHasDeletedDailyRoutine() { void cannotCreateChallengeRoutineIfAlreadyHaveOne() { // given Challenge challenge2 = challengeRepository.save(ChallengeFixture.challenge().build()); - memberRoutineRepository.save(MemberRoutineFixture - .memberRoutine().type(CHALLENGE).routineId(challenge2.getId()).member(member).build()); + memberRoutineRepository.save(MemberRoutineFixture.memberRoutine() + .type(CHALLENGE) + .routineId(challenge2.getId()) + .member(member) + .build()); MemberHappinessRoutineCreateServiceRequest request = MemberHappinessRoutineCreateServiceRequest.of( - member.getId(), - new MemberHappinessRoutineRequest(challenge.getId()) - ); + member.getId(), new MemberHappinessRoutineRequest(challenge.getId())); // when & then - assertThatThrownBy(() -> memberRoutineCreateService.createHappinessRoutine(request)) - .isInstanceOf(RoutineException.class) - .hasMessage("[RoutineException] : " + CANNOT_ADD_MEMBER_ROUTINE.getMessage()); + assertThatThrownBy(() -> memberRoutineCreateService.createHappinessRoutine(request)).isInstanceOf( + RoutineException.class).hasMessage("[RoutineException] : " + CANNOT_ADD_MEMBER_ROUTINE.getMessage()); } private void saveAndDelete(MemberRoutine memberRoutine) { @@ -248,10 +220,11 @@ private void saveAndDelete(MemberRoutine memberRoutine) { deletedMemberRoutineRepository.save(new DeletedMemberRoutine(savedMemberRoutine)); memberRoutineRepository.delete(savedMemberRoutine); } + } @Nested - class deleteDailyRoutines { + class Delete { Member member; Routine routine; @@ -261,34 +234,41 @@ class deleteDailyRoutines { void setUp() { member = memberRepository.save(MemberFixture.member().build()); routine = routineRepository.save(RoutineFixture.routine().build()); - memberRoutine = memberRoutineRepository.save(MemberRoutineFixture - .memberRoutine().member(member).routineId(routine.getId()).type(routine.getType()).build()); + memberRoutine = memberRoutineRepository.save(MemberRoutineFixture.memberRoutine() + .member(member) + .routineId(routine.getId()) + .type(routine.getType()) + .build()); } @Test @DisplayName("[성공] 회원이 가진 데일리 루틴을 삭제한다.") void deleteMemberDailyRoutines() { // given - MemberRoutinesDeleteServiceRequest request = MemberRoutinesDeleteServiceRequest.of( - member.getId(), - List.of(memberRoutine.getId()) - ); + MemberRoutinesDeleteServiceRequest request = MemberRoutinesDeleteServiceRequest.of(member.getId(), + List.of(memberRoutine.getId())); // when memberRoutineDeleteService.deleteMemberRoutines(request); // then - assertThat(memberRoutineRepository.existsByMemberAndTypeAndRoutineId(member, routine.getType(), routine.getId())).isFalse(); - assertThat(deletedMemberRoutineRepository.existsByMemberAndTypeAndRoutineId(member, routine.getType(), routine.getId())).isTrue(); + assertThat(memberRoutineRepository.existsByMemberAndTypeAndRoutineId(member, routine.getType(), + routine.getId())).isFalse(); + assertThat(deletedMemberRoutineRepository.existsByMemberAndTypeAndRoutineId(member, routine.getType(), + routine.getId())).isTrue(); } } @Nested - class getDailyRoutines { + class Acquire { - Member member1, member2; + Member member1; + Member member2; Theme theme; - Routine routine1, routine2, routine3; + Routine routine1; + Routine routine2; + Routine routine3; + Routine challengeRoutine; @BeforeEach void setUp() { @@ -297,9 +277,14 @@ void setUp() { theme = themeRepository.save(ThemeFixture.theme().build()); - routine1 = routineRepository.save(RoutineFixture.routine().theme(theme).type(DAILY).content("새로운 나").build()); - routine2 = routineRepository.save(RoutineFixture.routine().theme(theme).type(DAILY).content("깨끗한 나").build()); - routine3 = routineRepository.save(RoutineFixture.routine().theme(theme).type(DAILY).content("똑똑한 나").build()); + routine1 = routineRepository.save( + RoutineFixture.routine().theme(theme).type(DAILY).content("새로운 나").build()); + routine2 = routineRepository.save( + RoutineFixture.routine().theme(theme).type(DAILY).content("깨끗한 나").build()); + routine3 = routineRepository.save( + RoutineFixture.routine().theme(theme).type(DAILY).content("똑똑한 나").build()); + challengeRoutine = routineRepository.save( + RoutineFixture.routine().theme(theme).type(CHALLENGE).content("도전 루틴").build()); } @Test @@ -307,13 +292,28 @@ void setUp() { void getMemberDailyRoutinesByMember() { // given MemberRoutine memberRoutine1 = memberRoutineRepository.save(MemberRoutineFixture.memberRoutine() - .member(member1).routineId(routine1.getId()).type(routine1.getType()).build()); + .member(member1) + .routineId(routine1.getId()) + .type(routine1.getType()) + .build()); MemberRoutine memberRoutine2 = memberRoutineRepository.save(MemberRoutineFixture.memberRoutine() - .member(member1).routineId(routine2.getId()).type(routine2.getType()).build()); + .member(member1) + .routineId(routine2.getId()) + .type(routine2.getType()) + .build()); + memberRoutineRepository.save(MemberRoutineFixture.memberRoutine() + .member(member2) + .routineId(routine3.getId()) + .type(routine3.getType()) + .build()); memberRoutineRepository.save(MemberRoutineFixture.memberRoutine() - .member(member2).routineId(routine3.getId()).type(routine3.getType()).build()); + .member(member1) + .routineId(challengeRoutine.getId()) + .type(challengeRoutine.getType()) + .build()); - MemberDailyRoutineListGetServiceRequest request = MemberDailyRoutineListGetServiceRequest.of(member1.getId()); + MemberDailyRoutineListGetServiceRequest request = MemberDailyRoutineListGetServiceRequest.of( + member1.getId()); // when final MemberDailyRoutineListGetServiceResponse actual = memberRoutineReadService.getDailyRoutines(request); @@ -323,39 +323,36 @@ void getMemberDailyRoutinesByMember() { assertThat(contents).hasSize(2); assertThat(contents).containsExactlyInAnyOrder(routine1.getContent(), routine2.getContent()); - List memberRoutineIds = actual.routines().stream().map(MemberDailyRoutineServiceResponse::routineId).toList(); - assertThat(memberRoutineIds).containsExactlyInAnyOrder(memberRoutine1.getRoutineId(), memberRoutine2.getId()); - } - } - - @Nested - class getHappinessRoutine { - - Member member; - Theme theme; - Routine routine; - - @BeforeEach - void setUp() { - member = memberRepository.save(MemberFixture.member().build()); - theme = themeRepository.save(ThemeFixture.theme().build()); - routine = routineRepository.save(RoutineFixture.routine().type(CHALLENGE).theme(theme).build()); + List memberRoutineIds = actual.routines() + .stream() + .map(MemberDailyRoutineServiceResponse::routineId) + .toList(); + assertThat(memberRoutineIds).containsExactlyInAnyOrder(memberRoutine1.getRoutineId(), + memberRoutine2.getId()); } @Test @DisplayName("[성공] 회원이 가진 행복 루틴을 조회할 수 있다.") void getMemberHappinessRoutine() { // given - Challenge challenge = challengeRepository.save(ChallengeFixture - .challenge().content("무한~ 도전~").description("무한으로 즐겨요").routine(routine).build()); - memberRoutineRepository.save(MemberRoutineFixture - .memberRoutine().member(member).type(CHALLENGE).routineId(challenge.getId()).build()); + Challenge challenge = challengeRepository.save( + ChallengeFixture.challenge() + .content("무한~ 도전~") + .description("무한으로 즐겨요") + .routine(challengeRoutine) + .build()); + memberRoutineRepository.save(MemberRoutineFixture.memberRoutine() + .member(member1) + .type(CHALLENGE) + .routineId(challenge.getId()) + .build()); - MemberHappinessRoutineGetServiceRequest request = MemberHappinessRoutineGetServiceRequest.of(member.getId()); + MemberHappinessRoutineGetServiceRequest request = MemberHappinessRoutineGetServiceRequest.of( + member1.getId()); // when final Optional actual = memberRoutineReadService - .getHappinessRoutine(request); + .getHappinessRoutine(request); // then assertThat(actual).isPresent(); @@ -369,14 +366,16 @@ void getMemberHappinessRoutine() { @DisplayName("[성공] 회원이 가진 행복 루틴이 없으면 빈 값으로 조회된다.") void getEmptyWhenMemberHasNotHappinessRoutine() { // given - MemberHappinessRoutineGetServiceRequest request = MemberHappinessRoutineGetServiceRequest.of(member.getId()); + MemberHappinessRoutineGetServiceRequest request = MemberHappinessRoutineGetServiceRequest.of( + member1.getId()); // when final Optional actual = memberRoutineReadService - .getHappinessRoutine(request); + .getHappinessRoutine(request); // then assertThat(actual).isEmpty(); } } + } diff --git a/src/test/java/com/soptie/server/member/service/integration/MemberServiceIntegrationTest.java b/src/test/java/com/soptie/server/member/service/integration/MemberServiceIntegrationTest.java index e40bb847..d26cfa49 100644 --- a/src/test/java/com/soptie/server/member/service/integration/MemberServiceIntegrationTest.java +++ b/src/test/java/com/soptie/server/member/service/integration/MemberServiceIntegrationTest.java @@ -1,14 +1,27 @@ package com.soptie.server.member.service.integration; +import static com.soptie.server.doll.entity.DollType.*; +import static com.soptie.server.routine.entity.RoutineType.*; +import static org.assertj.core.api.Assertions.*; + +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + import com.soptie.server.doll.entity.DollType; import com.soptie.server.doll.repository.DollRepository; import com.soptie.server.member.adapter.MemberFinder; -import com.soptie.server.member.controller.dto.request.MemberProfileCreateRequest; +import com.soptie.server.member.adapter.MemberRoutineFinder; +import com.soptie.server.member.controller.v1.dto.request.MemberProfileCreateRequest; import com.soptie.server.member.entity.Member; import com.soptie.server.member.repository.MemberRepository; import com.soptie.server.member.service.MemberServiceImpl; import com.soptie.server.member.service.dto.request.MemberProfileCreateServiceRequest; -import com.soptie.server.memberRoutine.adapter.MemberRoutineFinder; import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.repository.RoutineRepository; import com.soptie.server.support.IntegrationTest; @@ -18,78 +31,69 @@ import com.soptie.server.support.fixture.ThemeFixture; import com.soptie.server.theme.entity.Theme; import com.soptie.server.theme.repository.ThemeRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static com.soptie.server.doll.entity.DollType.BROWN; -import static com.soptie.server.routine.entity.RoutineType.DAILY; -import static org.assertj.core.api.Assertions.assertThat; @IntegrationTest @Transactional public class MemberServiceIntegrationTest { - @Autowired - private MemberServiceImpl memberService; - - @Autowired - private MemberFinder memberFinder; - - @Autowired - private MemberRepository memberRepository; - - @Autowired - private RoutineRepository routineRepository; - - @Autowired - private ThemeRepository themeRepository; - - @Autowired - private DollRepository dollRepository; - - @Autowired - private MemberRoutineFinder memberRoutineFinder; - - @Nested - class createMember { - - Member member; - DollType dollType = BROWN; - Routine routine; - - @BeforeEach - void setUp() { - member = memberRepository.save(MemberFixture.member().build()); - Theme theme = themeRepository.save(ThemeFixture.theme().name("theme").build()); - dollRepository.save(DollFixture.doll().dollType(dollType).build()); - routine = routineRepository.save(RoutineFixture.routine().content("content").type(DAILY).theme(theme).build()); - } - - @Test - @DisplayName("[성공] 응답이 유효하면 회원 프로필이 생성된다.") - void CreateMemberProfile() { - // given - String name = "doll"; - List routines = List.of(routine.getId()); - MemberProfileCreateRequest controllerRequest = new MemberProfileCreateRequest(dollType, name, routines); - MemberProfileCreateServiceRequest request = - MemberProfileCreateServiceRequest.of(member.getId(), controllerRequest); - - // when - memberService.createMemberProfile(request); - - // then - Member foundMember = memberFinder.findById(member.getId()); - assertThat(foundMember.getMemberDoll().getDoll().getDollType()).isEqualTo(dollType); - assertThat(foundMember.getMemberDoll().getName()).isEqualTo(name); - assertThat(memberRoutineFinder.findDailyRoutinesByMember(foundMember).size()).isEqualTo(routines.size()); - assertThat(memberRoutineFinder.findDailyRoutinesByMember(foundMember).get(0).id()).isEqualTo(routine.getId()); - } - } + @Autowired + private MemberServiceImpl memberService; + + @Autowired + private MemberFinder memberFinder; + + @Autowired + private MemberRepository memberRepository; + + @Autowired + private RoutineRepository routineRepository; + + @Autowired + private ThemeRepository themeRepository; + + @Autowired + private DollRepository dollRepository; + + @Autowired + private MemberRoutineFinder memberRoutineFinder; + + @SuppressWarnings("checkstyle:TypeName") + @Nested + class Create { + + Member member; + DollType dollType = BROWN; + Routine routine; + + @BeforeEach + void setUp() { + member = memberRepository.save(MemberFixture.member().build()); + Theme theme = themeRepository.save(ThemeFixture.theme().name("theme").build()); + dollRepository.save(DollFixture.doll().dollType(dollType).build()); + routine = routineRepository.save( + RoutineFixture.routine().content("content").type(DAILY).theme(theme).build()); + } + + @Test + @DisplayName("[성공] 응답이 유효하면 회원 프로필이 생성된다.") + void registerProfile() { + // given + String name = "doll"; + List routines = List.of(routine.getId()); + MemberProfileCreateRequest controllerRequest = new MemberProfileCreateRequest(dollType, name, routines); + MemberProfileCreateServiceRequest request = MemberProfileCreateServiceRequest.of(member.getId(), + controllerRequest); + + // when + memberService.createMemberProfile(request); + + // then + Member foundMember = memberFinder.findById(member.getId()); + assertThat(foundMember.getMemberDoll().getDoll().getDollType()).isEqualTo(dollType); + assertThat(foundMember.getMemberDoll().getName()).isEqualTo(name); + assertThat(memberRoutineFinder.findDailyRoutinesByMember(foundMember).size()).isEqualTo(routines.size()); + assertThat(memberRoutineFinder.findDailyRoutinesByMember(foundMember).get(0).id()).isEqualTo( + routine.getId()); + } + } } diff --git a/src/test/java/com/soptie/server/memberDoll/service/MemberDollServiceImplTest.java b/src/test/java/com/soptie/server/memberDoll/service/MemberDollServiceImplTest.java deleted file mode 100644 index e900fdd1..00000000 --- a/src/test/java/com/soptie/server/memberDoll/service/MemberDollServiceImplTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.soptie.server.memberDoll.service; - -import com.soptie.server.doll.entity.Doll; -import com.soptie.server.doll.repository.DollRepository; -import com.soptie.server.member.entity.Member; -import com.soptie.server.memberDoll.repository.MemberDollRepository; -import com.soptie.server.support.fixture.MemberFixture; -import org.junit.jupiter.api.DisplayName; -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 java.util.Optional; - -import static com.soptie.server.doll.entity.DollType.BROWN; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.doReturn; - -@ExtendWith(MockitoExtension.class) -class MemberDollServiceImplTest { - - @InjectMocks - private MemberDollServiceImpl memberDollService; - - @Mock - private DollRepository dollRepository; - - @Mock - private MemberDollRepository memberDollRepository; - - @Test - @DisplayName("멤버 인형을 생성하고 이를 멤버의 멤버 인형으로 설정한다.") - void 멤버_인형을_생성하고_이를_멤버의_인형으로_세팅한다() { - // given - Long id = 1L; - String name = "brownie"; - Member member = member(id); - doReturn(Optional.of(new Doll())).when(dollRepository).findByDollType(BROWN); - - // when - memberDollService.createMemberDoll(member, BROWN, name); - - // then - assertThat(member.getMemberDoll().getName()).isEqualTo(name); - } - - private Member member(long memberId) { - Member member = MemberFixture.member().id(memberId).build(); - return member; - } -} diff --git a/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java b/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java index 25957954..1412790b 100644 --- a/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java +++ b/src/test/java/com/soptie/server/routine/service/integration/RoutineServiceIntegrationTest.java @@ -14,9 +14,9 @@ import com.soptie.server.member.entity.Member; import com.soptie.server.member.repository.MemberRepository; -import com.soptie.server.memberRoutine.repository.MemberRoutineRepository; -import com.soptie.server.routine.entity.Routine; +import com.soptie.server.member.repository.MemberRoutineRepository; import com.soptie.server.routine.entity.Challenge; +import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.repository.ChallengeRepository; import com.soptie.server.routine.repository.RoutineRepository; import com.soptie.server.routine.service.RoutineService; @@ -42,7 +42,7 @@ @IntegrationTest @Transactional public class RoutineServiceIntegrationTest { - + @Autowired RoutineService routineService; @@ -62,20 +62,27 @@ public class RoutineServiceIntegrationTest { ChallengeRepository challengeRepository; @Nested - class getDailyRoutinesByTheme { - - Routine routine1, routine2, routine3; - Theme theme1, theme2, theme3; - + class AcquireDailyRoutineByTheme { + + Routine routine1; + Routine routine2; + Routine routine3; + Theme theme1; + Theme theme2; + Theme theme3; + @BeforeEach void setUp() { theme1 = themeRepository.save(ThemeFixture.theme().name("관계 쌓기").build()); theme2 = themeRepository.save(ThemeFixture.theme().name("한 걸음 성장").build()); theme3 = themeRepository.save(ThemeFixture.theme().name("새로운 나").build()); - routine1 = routineRepository.save(RoutineFixture.routine().type(DAILY).content("관계를 쌓아보자").theme(theme1).build()); - routine2 = routineRepository.save(RoutineFixture.routine().type(DAILY).content("성장하자").theme(theme2).build()); - routine3 = routineRepository.save(RoutineFixture.routine().type(DAILY).content("보여줄게 완전히 달라진 나").theme(theme3).build()); + routine1 = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("관계를 쌓아보자").theme(theme1).build()); + routine2 = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("성장하자").theme(theme2).build()); + routine3 = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("보여줄게 완전히 달라진 나").theme(theme3).build()); } @Test @@ -96,32 +103,45 @@ void getDailyRoutinesByThemeIds() { } @Nested - class getDailyRoutinesByThemes { + class AcquireDailyRoutineByThemes { Member member; Theme theme; - Routine routine1, routine2, routineNoTheme, routineMemberHas, challengeRoutine; + Routine routine1; + Routine routine2; + Routine routineNoTheme; + Routine routineMemberHas; + Routine challengeRoutine; @BeforeEach void setUp() { member = memberRepository.save(MemberFixture.member().build()); theme = themeRepository.save(ThemeFixture.theme().name("관계 쌓기").build()); - routine1 = routineRepository.save(RoutineFixture.routine().type(DAILY).content("관계 쌓자").theme(theme).build()); - routine2 = routineRepository.save(RoutineFixture.routine().type(DAILY).content("쌓자 관계").theme(theme).build()); + routine1 = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("관계 쌓자").theme(theme).build()); + routine2 = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("쌓자 관계").theme(theme).build()); routineNoTheme = routineRepository.save(RoutineFixture.routine().type(DAILY).content("테마 없음").build()); - routineMemberHas = routineRepository.save(RoutineFixture.routine().type(DAILY).content("쌓자 관계").theme(theme).build()); - challengeRoutine = routineRepository.save(RoutineFixture.routine().type(CHALLENGE).content("관계 도전").theme(theme).build()); + routineMemberHas = routineRepository.save( + RoutineFixture.routine().type(DAILY).content("쌓자 관계").theme(theme).build()); + challengeRoutine = routineRepository.save( + RoutineFixture.routine().type(CHALLENGE).content("관계 도전").theme(theme).build()); memberRoutineRepository.save( - MemberRoutineFixture.memberRoutine().type(DAILY).routineId(routineMemberHas.getId()).member(member).build()); + MemberRoutineFixture.memberRoutine() + .type(DAILY) + .routineId(routineMemberHas.getId()) + .member(member) + .build()); } @Test @DisplayName("[성공] 회원에게 없으면서, 주어진 테마에 속하는 데일리 루틴 목록을 조회한다.") void getDailyRoutinesByThemeMemberNotHas() { // given - DailyRoutineListByThemeGetServiceRequest request = DailyRoutineListByThemeGetServiceRequest.of(member.getId(), theme.getId()); + DailyRoutineListByThemeGetServiceRequest request = DailyRoutineListByThemeGetServiceRequest.of( + member.getId(), theme.getId()); // when final DailyRoutineListGetServiceResponse actual = routineService.getRoutinesByTheme(request); @@ -133,19 +153,25 @@ void getDailyRoutinesByThemeMemberNotHas() { } @Nested - class getHappinessRoutines { + class AcquireHappinessRoutine { - Routine routine1, routine2, routine3; - Theme theme1, theme2; + Routine routine1; + Routine routine2; + Routine routine3; + Theme theme1; + Theme theme2; @BeforeEach void setUp() { theme1 = themeRepository.save(ThemeFixture.theme().name("관계 쌓기").color("라일락").build()); theme2 = themeRepository.save(ThemeFixture.theme().name("한 걸음 성장").color("민트").build()); - routine1 = routineRepository.save(RoutineFixture.routine().type(CHALLENGE).content("관계쌓는").theme(theme1).build()); - routine2 = routineRepository.save(RoutineFixture.routine().type(CHALLENGE).content("성장하는").theme(theme1).build()); - routine3 = routineRepository.save(RoutineFixture.routine().type(CHALLENGE).content("보여주는").theme(theme2).build()); + routine1 = routineRepository.save( + RoutineFixture.routine().type(CHALLENGE).content("관계쌓는").theme(theme1).build()); + routine2 = routineRepository.save( + RoutineFixture.routine().type(CHALLENGE).content("성장하는").theme(theme1).build()); + routine3 = routineRepository.save( + RoutineFixture.routine().type(CHALLENGE).content("보여주는").theme(theme2).build()); } @Test @@ -165,18 +191,23 @@ void getHappinessRoutinesByTheme() { } @Nested - class getHappinessSubRoutines { + class AcquireSubHappinessRoutine { - Challenge challenge1, challenge2, challenge3; - Routine routine1, routine2; + Challenge challenge1; + Challenge challenge2; + Challenge challenge3; + Routine routine1; + Routine routine2; Theme theme; @BeforeEach void setUp() { theme = themeRepository.save(ThemeFixture.theme().name("관계 쌓기").color("라일락").build()); - routine1 = routineRepository.save(RoutineFixture.routine().type(CHALLENGE).content("관계쌓는").theme(theme).build()); - routine2 = routineRepository.save(RoutineFixture.routine().type(CHALLENGE).content("성장하는").theme(theme).build()); + routine1 = routineRepository.save( + RoutineFixture.routine().type(CHALLENGE).content("관계쌓는").theme(theme).build()); + routine2 = routineRepository.save( + RoutineFixture.routine().type(CHALLENGE).content("성장하는").theme(theme).build()); challenge1 = challengeRepository.save(ChallengeFixture.challenge().routine(routine1).build()); challenge2 = challengeRepository.save(ChallengeFixture.challenge().routine(routine1).build()); @@ -187,7 +218,8 @@ void setUp() { @DisplayName("[성공] 행복 루틴에 포함된 서브 루틴 목록을 조회한다.") void getHappinessSubRoutinesByRoutine() { // given - HappinessSubRoutineListGetServiceRequest request = HappinessSubRoutineListGetServiceRequest.of(routine1.getId()); + HappinessSubRoutineListGetServiceRequest request = HappinessSubRoutineListGetServiceRequest.of( + routine1.getId()); // when final HappinessSubRoutineListGetServiceResponse actual = routineService.getHappinessSubRoutines(request); @@ -196,7 +228,7 @@ void getHappinessSubRoutinesByRoutine() { assertThat(actual.challenges()).hasSize(2); List challengeIds = actual.challenges().stream() - .map(HappinessSubRoutineServiceResponse::challengeId).toList(); + .map(HappinessSubRoutineServiceResponse::challengeId).toList(); assertThat(challengeIds).containsExactlyInAnyOrder(challenge1.getId(), challenge2.getId()); } } diff --git a/src/test/java/com/soptie/server/support/fixture/ChallengeFixture.java b/src/test/java/com/soptie/server/support/fixture/ChallengeFixture.java index d310e206..e27315b7 100644 --- a/src/test/java/com/soptie/server/support/fixture/ChallengeFixture.java +++ b/src/test/java/com/soptie/server/support/fixture/ChallengeFixture.java @@ -1,7 +1,7 @@ package com.soptie.server.support.fixture; -import com.soptie.server.routine.entity.Routine; import com.soptie.server.routine.entity.Challenge; +import com.soptie.server.routine.entity.Routine; public class ChallengeFixture { diff --git a/src/test/java/com/soptie/server/support/fixture/ConversationFixture.java b/src/test/java/com/soptie/server/support/fixture/ConversationFixture.java index a958ebb8..bf0682ba 100644 --- a/src/test/java/com/soptie/server/support/fixture/ConversationFixture.java +++ b/src/test/java/com/soptie/server/support/fixture/ConversationFixture.java @@ -4,27 +4,27 @@ public class ConversationFixture { - private Long id; - private String content; + private Long id; + private String content; - private ConversationFixture() { - } + private ConversationFixture() { + } - public static ConversationFixture conversation() { - return new ConversationFixture(); - } + public static ConversationFixture conversation() { + return new ConversationFixture(); + } - public ConversationFixture id(Long id) { - this.id = id; - return this; - } + public ConversationFixture id(Long id) { + this.id = id; + return this; + } - public ConversationFixture content(String content) { - this.content = content; - return this; - } + public ConversationFixture content(String content) { + this.content = content; + return this; + } - public Conversation build() { - return new Conversation(id, content); - } + public Conversation build() { + return new Conversation(id, content); + } } diff --git a/src/test/java/com/soptie/server/support/fixture/DollFixture.java b/src/test/java/com/soptie/server/support/fixture/DollFixture.java index 61dd6832..4e38365d 100644 --- a/src/test/java/com/soptie/server/support/fixture/DollFixture.java +++ b/src/test/java/com/soptie/server/support/fixture/DollFixture.java @@ -5,33 +5,33 @@ public class DollFixture { - private Long id; - private DollType dollType; - private String faceImageUrl; - - private DollFixture() { - } - - public static DollFixture doll() { - return new DollFixture(); - } - - public DollFixture id(Long id) { - this.id = id; - return this; - } - - public DollFixture dollType(DollType dollType) { - this.dollType = dollType; - return this; - } - - public DollFixture faceImageUrl(String faceImageUrl) { - this.faceImageUrl = faceImageUrl; - return this; - } - - public Doll build() { - return new Doll(id, dollType, faceImageUrl); - } + private Long id; + private DollType dollType; + private String faceImageUrl; + + private DollFixture() { + } + + public static DollFixture doll() { + return new DollFixture(); + } + + public DollFixture id(Long id) { + this.id = id; + return this; + } + + public DollFixture dollType(DollType dollType) { + this.dollType = dollType; + return this; + } + + public DollFixture faceImageUrl(String faceImageUrl) { + this.faceImageUrl = faceImageUrl; + return this; + } + + public Doll build() { + return new Doll(id, dollType, faceImageUrl); + } } diff --git a/src/test/java/com/soptie/server/support/fixture/MemberDollFixture.java b/src/test/java/com/soptie/server/support/fixture/MemberDollFixture.java index 54094713..80b117f0 100644 --- a/src/test/java/com/soptie/server/support/fixture/MemberDollFixture.java +++ b/src/test/java/com/soptie/server/support/fixture/MemberDollFixture.java @@ -1,43 +1,43 @@ package com.soptie.server.support.fixture; import com.soptie.server.doll.entity.Doll; -import com.soptie.server.memberDoll.entity.MemberDoll; +import com.soptie.server.member.entity.MemberDoll; public class MemberDollFixture { - private Long id; - private String name; - private int happinessCottonCount; - private Doll doll; - - public MemberDollFixture() { - } - - public static MemberDollFixture memberDoll() { - return new MemberDollFixture(); - } - - public MemberDollFixture id(Long id) { - this.id = id; - return this; - } - - public MemberDollFixture name(String name) { - this.name = name; - return this; - } - - public MemberDollFixture happinessCottonCount(int happinessCottonCount) { - this.happinessCottonCount = happinessCottonCount; - return this; - } - - public MemberDollFixture doll(Doll doll) { - this.doll = doll; - return this; - } - - public MemberDoll build() { - return new MemberDoll(id, name, happinessCottonCount, doll); - } + private Long id; + private String name; + private int happinessCottonCount; + private Doll doll; + + public MemberDollFixture() { + } + + public static MemberDollFixture memberDoll() { + return new MemberDollFixture(); + } + + public MemberDollFixture id(Long id) { + this.id = id; + return this; + } + + public MemberDollFixture name(String name) { + this.name = name; + return this; + } + + public MemberDollFixture happinessCottonCount(int happinessCottonCount) { + this.happinessCottonCount = happinessCottonCount; + return this; + } + + public MemberDollFixture doll(Doll doll) { + this.doll = doll; + return this; + } + + public MemberDoll build() { + return new MemberDoll(id, name, happinessCottonCount, doll); + } } diff --git a/src/test/java/com/soptie/server/support/fixture/MemberFixture.java b/src/test/java/com/soptie/server/support/fixture/MemberFixture.java index 7701c69c..90b0d16e 100644 --- a/src/test/java/com/soptie/server/support/fixture/MemberFixture.java +++ b/src/test/java/com/soptie/server/support/fixture/MemberFixture.java @@ -1,7 +1,7 @@ package com.soptie.server.support.fixture; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberDoll.entity.MemberDoll; +import com.soptie.server.member.entity.MemberDoll; public class MemberFixture { diff --git a/src/test/java/com/soptie/server/support/fixture/MemberRoutineFixture.java b/src/test/java/com/soptie/server/support/fixture/MemberRoutineFixture.java index 4df1f787..07aad948 100644 --- a/src/test/java/com/soptie/server/support/fixture/MemberRoutineFixture.java +++ b/src/test/java/com/soptie/server/support/fixture/MemberRoutineFixture.java @@ -1,7 +1,7 @@ package com.soptie.server.support.fixture; import com.soptie.server.member.entity.Member; -import com.soptie.server.memberRoutine.entity.MemberRoutine; +import com.soptie.server.member.entity.MemberRoutine; import com.soptie.server.routine.entity.RoutineType; public class MemberRoutineFixture { diff --git a/src/test/java/com/soptie/server/support/fixture/ThemeFixture.java b/src/test/java/com/soptie/server/support/fixture/ThemeFixture.java index 8e18383a..8795269a 100644 --- a/src/test/java/com/soptie/server/support/fixture/ThemeFixture.java +++ b/src/test/java/com/soptie/server/support/fixture/ThemeFixture.java @@ -1,7 +1,7 @@ package com.soptie.server.support.fixture; -import com.soptie.server.theme.entity.ThemeImageInfo; import com.soptie.server.theme.entity.Theme; +import com.soptie.server.theme.entity.ThemeImageInfo; import com.soptie.server.theme.entity.ThemeType; public class ThemeFixture { @@ -12,7 +12,8 @@ public class ThemeFixture { private String description = "default"; private String color; private ThemeType type = ThemeType.BASIC; - private final ThemeImageInfo imageInfo = new ThemeImageInfo("https://...", "https://...", "https://...", "https://...", "https://..."); + private final ThemeImageInfo imageInfo = new ThemeImageInfo("https://...", "https://...", "https://...", + "https://...", "https://..."); private ThemeFixture() { } diff --git a/src/test/java/com/soptie/server/theme/repository/ThemeRepositoryTest.java b/src/test/java/com/soptie/server/theme/repository/ThemeRepositoryTest.java index 295234c3..37cc8052 100644 --- a/src/test/java/com/soptie/server/theme/repository/ThemeRepositoryTest.java +++ b/src/test/java/com/soptie/server/theme/repository/ThemeRepositoryTest.java @@ -37,9 +37,9 @@ void findAllThemesOrderByNameAsc() { String thirdGetName = "한 걸음 성장"; themeRepository.saveAll(List.of( - ThemeFixture.theme().name(firstGetName).build(), - ThemeFixture.theme().name(thirdGetName).build(), - ThemeFixture.theme().name(secondGetName).build() + ThemeFixture.theme().name(firstGetName).build(), + ThemeFixture.theme().name(thirdGetName).build(), + ThemeFixture.theme().name(secondGetName).build() )); // when @@ -51,4 +51,4 @@ void findAllThemesOrderByNameAsc() { assertThat(actual.get(1).getName()).isEqualTo(secondGetName); assertThat(actual.get(2).getName()).isEqualTo(thirdGetName); } -} \ No newline at end of file +} diff --git a/src/test/java/com/soptie/server/theme/service/ThemeServiceTest.java b/src/test/java/com/soptie/server/theme/service/ThemeServiceTest.java index b54014a6..6bbf35a5 100644 --- a/src/test/java/com/soptie/server/theme/service/ThemeServiceTest.java +++ b/src/test/java/com/soptie/server/theme/service/ThemeServiceTest.java @@ -31,8 +31,8 @@ class ThemeServiceTest { void getAllThemes() { // given List themes = List.of( - ThemeFixture.theme().id(1L).build(), - ThemeFixture.theme().id(2L).build() + ThemeFixture.theme().id(1L).build(), + ThemeFixture.theme().id(2L).build() ); doReturn(themes).when(themeFinder).findAllOrderByNameAsc(); @@ -41,7 +41,9 @@ void getAllThemes() { final ThemeListGetServiceResponse actual = themeService.getThemes(); // then - List themeIds = actual.themes().stream().map(ThemeListGetServiceResponse.ThemeServiceResponse::themeId).toList(); + List themeIds = actual.themes().stream() + .map(ThemeListGetServiceResponse.ThemeServiceResponse::themeId) + .toList(); assertThat(themeIds).containsExactlyInAnyOrder(1L, 2L); } } diff --git a/src/test/java/com/soptie/server/theme/service/integration/ThemeServiceIntegrationTest.java b/src/test/java/com/soptie/server/theme/service/integration/ThemeServiceIntegrationTest.java index 72ac6304..ea0d70d6 100644 --- a/src/test/java/com/soptie/server/theme/service/integration/ThemeServiceIntegrationTest.java +++ b/src/test/java/com/soptie/server/theme/service/integration/ThemeServiceIntegrationTest.java @@ -30,14 +30,14 @@ public class ThemeServiceIntegrationTest { ThemeRepository themeRepository; @Nested - class acquire { + class Acquire { List themes = List.of( - ThemeFixture.theme().type(ThemeType.BASIC).build(), - ThemeFixture.theme().type(ThemeType.BASIC).build(), - ThemeFixture.theme().type(ThemeType.BASIC).build(), - ThemeFixture.theme().type(ThemeType.MAKER).build(), - ThemeFixture.theme().type(ThemeType.MAKER).build() + ThemeFixture.theme().type(ThemeType.BASIC).build(), + ThemeFixture.theme().type(ThemeType.BASIC).build(), + ThemeFixture.theme().type(ThemeType.BASIC).build(), + ThemeFixture.theme().type(ThemeType.MAKER).build(), + ThemeFixture.theme().type(ThemeType.MAKER).build() ); @BeforeEach @@ -55,7 +55,7 @@ void acquireAllInBasic() { List result = themeService.acquireAllInBasic(); // then - assertThat(result).hasSize((int) countOfBasic); + assertThat(result).hasSize((int)countOfBasic); } } } From e6cacf9fc3603a8f5f795737169d9265f9c8849c Mon Sep 17 00:00:00 2001 From: thguss Date: Fri, 21 Jun 2024 22:20:11 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[CHORE]=20checkStyle=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/soptie/server/test/TestApi.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/soptie/server/test/TestApi.java b/src/main/java/com/soptie/server/test/TestApi.java index 31c2f9bd..08b46b75 100644 --- a/src/main/java/com/soptie/server/test/TestApi.java +++ b/src/main/java/com/soptie/server/test/TestApi.java @@ -22,8 +22,7 @@ public interface TestApi { @ApiResponse( responseCode = "200", description = "성공", - content = @Content(schema = @Schema(implementation = SuccessResponse.class)) - ), + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), @ApiResponse( responseCode = "500", description = "서버 내부 오류", From b6ffa224c9143fb44d00f5e69637493d5ab66070 Mon Sep 17 00:00:00 2001 From: thguss Date: Fri, 21 Jun 2024 22:22:26 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[CHORE]=20checkStyle=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 891c9b99..40245db6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,22 +9,22 @@ jobs: runs-on: ubuntu-22.04 steps: - - name: 체크아웃 + - name: checkout uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: set up JDK 17 uses: actions/setup-java@v3 with: distribution: 'corretto' java-version: '17' - - name: application.yaml 생성 + - name: create application.yaml run: | cd src/main/resources echo "${{ secrets.APPLICATION_SECRET_YML }}" > ./application-secret.yml working-directory: ${{ env.working-directory }} - - name: 빌드 + - name: build run: | chmod +x gradlew ./gradlew build test From d0d6c8c712eda68e4d9bbf4f518ccf3077a2244a Mon Sep 17 00:00:00 2001 From: thguss Date: Sat, 22 Jun 2024 13:02:18 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[CHORE]=20=EC=B6=A9=EB=8F=8C=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=20=EB=B0=8F=20=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v1/api}/MemberDailyRoutineApi.java | 12 +- .../v1/docs/MemberDailyRoutineApi.java | 133 ++++++++++++++++++ .../repository/dto/MemberRoutineResponse.java | 33 +++++ ...berHappinessRoutineGetServiceResponse.java | 8 +- 4 files changed, 176 insertions(+), 10 deletions(-) rename src/main/java/com/soptie/server/{member/controller/v1/docs => memberRoutine/controller/v1/api}/MemberDailyRoutineApi.java (89%) create mode 100644 src/main/java/com/soptie/server/memberRoutine/controller/v1/docs/MemberDailyRoutineApi.java create mode 100644 src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberRoutineResponse.java rename src/main/java/com/soptie/server/{member/service/dto/response/routine/happiness => memberRoutine/service/dto/response}/MemberHappinessRoutineGetServiceResponse.java (80%) diff --git a/src/main/java/com/soptie/server/member/controller/v1/docs/MemberDailyRoutineApi.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberDailyRoutineApi.java similarity index 89% rename from src/main/java/com/soptie/server/member/controller/v1/docs/MemberDailyRoutineApi.java rename to src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberDailyRoutineApi.java index 01089e71..74629f28 100644 --- a/src/main/java/com/soptie/server/member/controller/v1/docs/MemberDailyRoutineApi.java +++ b/src/main/java/com/soptie/server/memberRoutine/controller/v1/api/MemberDailyRoutineApi.java @@ -1,4 +1,4 @@ -package com.soptie.server.member.controller.v1.docs; +package com.soptie.server.memberroutine.controller.v1.api; import java.security.Principal; import java.util.List; @@ -11,10 +11,10 @@ import com.soptie.server.common.dto.BaseResponse; import com.soptie.server.common.dto.ErrorResponse; import com.soptie.server.common.dto.SuccessResponse; -import com.soptie.server.member.controller.v1.dto.request.MemberDailyRoutineCreateRequest; -import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineAchieveResponse; -import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineCreateResponse; -import com.soptie.server.member.controller.v1.dto.response.MemberDailyRoutineListGetResponse; +import com.soptie.server.memberroutine.controller.v1.dto.request.MemberDailyRoutineCreateRequest; +import com.soptie.server.memberroutine.controller.v1.dto.response.MemberDailyRoutineAchieveResponse; +import com.soptie.server.memberroutine.controller.v1.dto.response.MemberDailyRoutineCreateResponse; +import com.soptie.server.memberroutine.controller.v1.dto.response.MemberDailyRoutineListAcquireResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -127,7 +127,7 @@ ResponseEntity> achieveMember description = "서버 내부 오류", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} ) - ResponseEntity> getMemberDailyRoutines( + ResponseEntity> getMemberDailyRoutines( @Parameter(hidden = true) Principal principal ); } diff --git a/src/main/java/com/soptie/server/memberRoutine/controller/v1/docs/MemberDailyRoutineApi.java b/src/main/java/com/soptie/server/memberRoutine/controller/v1/docs/MemberDailyRoutineApi.java new file mode 100644 index 00000000..e2a1db5a --- /dev/null +++ b/src/main/java/com/soptie/server/memberRoutine/controller/v1/docs/MemberDailyRoutineApi.java @@ -0,0 +1,133 @@ +package com.soptie.server.memberroutine.controller.v1.docs; + +import java.security.Principal; +import java.util.List; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import com.soptie.server.common.dto.BaseResponse; +import com.soptie.server.common.dto.ErrorResponse; +import com.soptie.server.common.dto.SuccessResponse; +import com.soptie.server.memberroutine.controller.v1.dto.request.MemberDailyRoutineCreateRequest; +import com.soptie.server.memberroutine.controller.v1.dto.response.MemberDailyRoutineAchieveResponse; +import com.soptie.server.memberroutine.controller.v1.dto.response.MemberDailyRoutineCreateResponse; +import com.soptie.server.memberroutine.controller.v1.dto.response.MemberDailyRoutineListAcquireResponse; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "member daily routines V1", description = "회원의 데일리 루틴 API Version1") +public interface MemberDailyRoutineApi { + + @Operation( + summary = "데일리 루틴 추가", + description = "회원의 데일리 루틴을 추가한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> createMemberDailyRoutine( + @Parameter(hidden = true) Principal principal, + @RequestBody MemberDailyRoutineCreateRequest request + ); + + @Operation( + summary = "데일리 루틴 삭제", + description = "회원의 데일리 루틴을 삭제한다.", + responses = { + @ApiResponse( + responseCode = "200", + description = "성공", + content = @Content(schema = @Schema(implementation = SuccessResponse.class))), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity deleteMemberDailyRoutines( + @Parameter(hidden = true) Principal principal, + @Parameter( + name = "routines", + description = "삭제할 회원의 데일리 루틴 id 목록", + in = ParameterIn.QUERY, + example = "1,2,3" + ) @RequestParam List routines + ); + + @Operation( + summary = "데일리 루틴 달성", + description = "회원의 데일리 루틴을 달성한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> achieveMemberDailyRoutine( + @Parameter(hidden = true) Principal principal, + @Parameter( + name = "routineId", + description = "달성한 회원의 데일리 루틴 id", + in = ParameterIn.PATH, + example = "1" + ) @PathVariable long routineId + ); + + @Operation( + summary = "회원의 데일리 루틴 목록 조회", + description = "회원의 데일리 루틴을 달성 여부, 달성 횟수, 루틴 이름 순으로 정렬된 목록으로 조회한다.", + responses = { + @ApiResponse(responseCode = "200", description = "성공"), + @ApiResponse( + responseCode = "401", + description = "유효하지 않은 토큰", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "4xx", + description = "클라이언트(요청) 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse( + responseCode = "500", + description = "서버 내부 오류", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)))} + ) + ResponseEntity> getMemberDailyRoutines( + @Parameter(hidden = true) Principal principal + ); +} diff --git a/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberRoutineResponse.java b/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberRoutineResponse.java new file mode 100644 index 00000000..453ceca7 --- /dev/null +++ b/src/main/java/com/soptie/server/memberRoutine/repository/dto/MemberRoutineResponse.java @@ -0,0 +1,33 @@ +package com.soptie.server.memberroutine.repository.dto; + +import com.querydsl.core.annotations.QueryProjection; +import com.soptie.server.memberroutine.entity.MemberRoutine; +import com.soptie.server.routine.entity.Routine; + +import lombok.NonNull; + +public record MemberRoutineResponse( + long id, + @NonNull String content, + @NonNull String iconImageUrl, + @NonNull String dailyIconImageUrl, + long themeId, + @NonNull String themeName, + int achieveCount, + boolean isAchieve +) { + + @QueryProjection + public MemberRoutineResponse(MemberRoutine memberRoutine, Routine routine) { + this( + memberRoutine.getId(), + routine.getContent(), + routine.getTheme().getImageLinks().getIconImageUrl(), + routine.getTheme().getImageLinks().getDailyIconImageUrl(), + routine.getTheme().getId(), + routine.getTheme().getName(), + memberRoutine.getAchieveCount(), + memberRoutine.isAchieve() + ); + } +} diff --git a/src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineGetServiceResponse.java b/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineGetServiceResponse.java similarity index 80% rename from src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineGetServiceResponse.java rename to src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineGetServiceResponse.java index 47036b3b..688134f3 100644 --- a/src/main/java/com/soptie/server/member/service/dto/response/routine/happiness/MemberHappinessRoutineGetServiceResponse.java +++ b/src/main/java/com/soptie/server/memberRoutine/service/dto/response/MemberHappinessRoutineGetServiceResponse.java @@ -1,8 +1,8 @@ -package com.soptie.server.member.service.dto.response.routine.happiness; +package com.soptie.server.memberroutine.service.dto.response; import static lombok.AccessLevel.*; -import com.soptie.server.member.repository.dto.MemberChallengeResponse; +import com.soptie.server.memberroutine.repository.dto.MemberChallengeResponse; import com.soptie.server.theme.entity.Theme; import lombok.Builder; @@ -40,8 +40,8 @@ public record ThemeServiceResponse( private static ThemeServiceResponse of(Theme theme) { return ThemeServiceResponse.builder() - .iconImageUrl(theme.getImageInfo().getIconImageUrl()) - .cardImageUrl(theme.getImageInfo().getHappinessCardImageUrl()) + .iconImageUrl(theme.getImageLinks().getIconImageUrl()) + .cardImageUrl(theme.getImageLinks().getHappinessCardImageUrl()) .name(theme.getName()) .color(theme.getColor()) .build(); From f31a4bb26fba7acf9d32d0968ce1bef2df10a017 Mon Sep 17 00:00:00 2001 From: thguss Date: Sat, 22 Jun 2024 13:59:58 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[DELETE]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/soptie/server/auth/controller/AuthApi.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/soptie/server/auth/controller/AuthApi.java b/src/main/java/com/soptie/server/auth/controller/AuthApi.java index 3a1f5a1e..f3c7176a 100644 --- a/src/main/java/com/soptie/server/auth/controller/AuthApi.java +++ b/src/main/java/com/soptie/server/auth/controller/AuthApi.java @@ -23,7 +23,6 @@ @Tag(name = "auth", description = "인증 API") public interface AuthApi { - @SuppressWarnings("checkstyle:Indentation") @Operation( summary = "소셜 로그인", description = "소셜 로그인을 진행한다.", From a6ccc39691aaa1b0f65c899ac5f28b26f0ffe4cb Mon Sep 17 00:00:00 2001 From: thguss Date: Sat, 22 Jun 2024 14:08:39 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[CHORE]=20=ED=95=9C=20=EC=A4=84=20=EB=9D=84?= =?UTF-8?q?=EC=96=B4=EC=93=B0=EA=B8=B0=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/soptie/server/common/dto/SuccessResponse.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/soptie/server/common/dto/SuccessResponse.java b/src/main/java/com/soptie/server/common/dto/SuccessResponse.java index c8b2e710..8ac06219 100644 --- a/src/main/java/com/soptie/server/common/dto/SuccessResponse.java +++ b/src/main/java/com/soptie/server/common/dto/SuccessResponse.java @@ -9,8 +9,11 @@ import lombok.NonNull; @Builder(access = PRIVATE) -public record SuccessResponse(boolean success, @NonNull String message, @JsonInclude(value = NON_NULL) T data) - implements BaseResponse { +public record SuccessResponse( + boolean success, + @NonNull String message, + @JsonInclude(value = NON_NULL) T data +) implements BaseResponse { public static SuccessResponse success(String message, T data) { return SuccessResponse.builder().success(true).message(message).data(data).build();