From a882edc7fc6dbfb8f419d554b57777cadbb97199 Mon Sep 17 00:00:00 2001 From: "DESKTOP-0N7JBUG\\user" Date: Sun, 18 May 2025 23:19:53 +0900 Subject: [PATCH 1/4] commit --- .github/workflows/main.yml | 22 +- README.md | 97 +++++- TEST.md | 48 +++ batch/.gitattributes | 3 + batch/.gitignore | 37 ++ batch/build.gradle | 24 ++ batch/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + batch/gradlew | 251 ++++++++++++++ batch/gradlew.bat | 94 +++++ batch/settings.gradle | 1 + .../com/project/imdang/BatchApplication.java | 14 + .../imdang/batch/DataSourceConfiguration.java | 29 ++ .../batch/LiftPenaltyJobConfiguration.java | 116 +++++++ .../java/com/project/imdang/batch/Member.java | 29 ++ .../imdang/scheduler/BatchScheduler.java | 47 +++ .../LiftPenaltyJobConfigurationTest.java | 90 +++++ batch/src/test/resources/schema.sql | 94 +++++ build.gradle | 322 +----------------- common/build.gradle | 0 common/common-application/build.gradle | 13 +- .../imdang/application/handler/ErrorDTO.java | 32 -- .../imdang/common/application/Property.java | 9 + .../common/application/dto/PagingRequest.java | 11 + .../exception}/ExternalApiException.java | 2 +- .../application/response/ErrorResponse.java | 39 +++ .../application/response/code}/ErrorCode.java | 9 +- .../handler/GlobalExceptionHandler.java | 82 +++++ .../src/main/resources/application.properties | 1 - common/common-domain/build.gradle | 0 .../common-application-service/build.gradle | 10 +- .../imdang/common/domain/dto/PagingQuery.java | 13 + .../event/DomainEventMessageListener.java | 22 ++ .../event/DomainEventMessagePublisher.java | 5 + .../domain/event/entry}/EventEntry.java | 3 +- .../domain/event/entry}/EventListener.java | 2 +- .../domain/event/entry/EventProcessor.java | 7 + .../domain/utils/PagingUtils.java | 2 +- ...ngeRequestAcceptedCountRequestMessage.java | 15 - .../ExchangeRequestCreatedRequestMessage.java | 13 - ...ngeRequestRejectedCountRequestMessage.java | 15 - ...ExchangeRequestRejectedRequestMessage.java | 13 - .../message/InsightAccusedRequestMessage.java | 15 - .../InsightCreatedCountRequestMessage.java | 15 - .../MemberCouponCancelledResponseMessage.java | 14 - .../MemberCouponUsedResponseMessage.java | 14 - .../src/main/resources/application.properties | 1 - .../common-domain-core/build.gradle | 6 - .../domain/entity/AggregateRoot.java | 2 +- .../domain/entity/BaseEntity.java | 2 +- .../domain/event/DomainEventMessage.java | 4 + .../DomainAlreadyExistException.java | 12 + .../domain/exception/DomainErrorCode.java | 12 + .../domain/exception/DomainException.java | 2 +- .../exception/DomainNotFoundException.java | 12 + .../common}/domain/valueobject/Access.java | 2 +- .../common}/domain/valueobject/Address.java | 14 +- .../domain/valueobject/ApartmentComplex.java | 2 +- .../domain/valueobject/BaseId.java | 2 +- .../valueobject/ComplexEnvironment.java | 15 +- .../common}/domain/valueobject/District.java | 14 +- .../common/domain/valueobject/File.java | 14 + .../common}/domain/valueobject/Gender.java | 2 +- .../common}/domain/valueobject/Infra.java | 32 +- .../domain/valueobject/InsightId.java | 2 +- .../domain/valueobject/MemberId.java | 2 +- .../domain/valueobject/MemberStatus.java | 4 +- .../valueobject/NotificationCategory.java | 27 ++ .../domain/valueobject/NotificationId.java | 4 +- .../common/domain/valueobject/OAuthType.java | 5 + .../domain/valueobject/ObjectiveItem.java | 2 +- .../common}/domain/valueobject/Opinion.java | 4 +- .../common}/domain/valueobject/Penalty.java | 9 +- .../domain/valueobject/PenaltyPeriod.java | 2 +- .../domain/valueobject/TermsAgreementId.java | 4 +- .../common/domain/valueobject/TermsId.java | 9 + .../domain/valueobject/VisitMethod.java | 5 + .../common/domain/valueobject/VisitTime.java | 5 + .../imdang/domain/event/EmptyEvent.java | 8 - .../event/publisher/DomainEventPublisher.java | 7 - .../ApplicationServiceException.java | 12 - .../imdang/domain/exception/ErrorCode.java | 21 -- .../imdang/domain/valueobject/CouponId.java | 9 - .../domain/valueobject/ExchangeRequestId.java | 9 - .../domain/valueobject/MemberCouponId.java | 7 - .../src/main/resources/application.properties | 1 - demo/src/App.jsx | 2 - demo/src/Header.jsx | 2 - demo/src/api-coupon.js | 19 -- demo/src/api-exchange.js | 57 ---- demo/src/api-my-coupon.js | 17 - demo/src/api-my-exchange.js | 33 -- demo/src/components/CreateInsight.jsx | 42 --- demo/src/components/DetailInsight.jsx | 204 +---------- demo/src/components/MyExchange.jsx | 106 ------ diagram.md | 1 + imdang-container/build.gradle | 48 +++ .../com/project/imdang/ImdangApplication.java | 13 + .../configuration/BeanConfiguration.java | 36 ++ .../DemoConfiguration.java | 2 +- .../configuration/SecurityConfiguration.java | 18 +- .../configuration/SwaggerConfiguration.java | 2 +- .../imdang/container/ImdangApplication.java | 25 -- .../project/imdang/jwt}/JwtAuthFilter.java | 23 +- .../jwt}/JwtAuthenticationEntryPoint.java | 9 +- .../src/main/resources/default_insert.sql | 22 -- .../src/main/resources/foreign_key.sql | 18 - .../src/main/resources/imdang.sql | 149 -------- .../src/main/resources/unique_key.sql | 5 - .../insight}/InsightControllerTest.java | 51 ++- .../insight}/MyInsightControllerTest.java | 29 +- .../com/project/imdang/insight/TestData.java | 137 ++++++++ .../imdang/member}/MemberControllerTest.java | 13 +- .../com/project/imdang/member/TestData.java | 23 ++ infrastructure/aws/s3/build.gradle | 7 +- .../com/project/imdang/aws/s3/S3Service.java | 45 +-- infrastructure/event/build.gradle | 6 - .../project/imdang/event/EventProcessor.java | 36 -- infrastructure/feign/build.gradle | 8 +- infrastructure/kafka/consumer/build.gradle | 0 infrastructure/kafka/producer/build.gradle | 0 infrastructure/saga/build.gradle | 7 +- .../src/main/resources/application.properties | 1 - .../insight-application/build.gradle | 19 +- .../dto/insight/AccuseInsightRequest.java | 21 ++ .../application/dto/insight/AddressDTO.java | 29 ++ .../dto/insight/ApartmentComplexDTO.java | 6 + .../dto/insight/ComplexEnvironmentDTO.java | 25 ++ .../dto/insight/CreateInsightRequest.java | 66 ++++ .../dto/insight/DeleteInsightRequest.java | 20 ++ .../application/dto/insight/DistrictDTO.java | 21 ++ .../application/dto/insight/InfraDTO.java | 38 +++ .../dto/insight/RecommendInsightRequest.java | 20 ++ .../dto/insight/UpdateInsightRequest.java | 66 ++++ .../mapper/InsightRequestResolver.java | 104 ++++++ .../application/rest/DistrictController.java | 52 +++ .../application/rest/InsightController.java | 267 +++++++++++++++ .../application/rest/MyInsightController.java | 104 ++++++ .../client/ApartmentComplexApiRestClient.java | 17 - .../handler/GlobalExceptionHandler.java | 60 ---- .../InsightGlobalExceptionHandler.java | 34 -- .../rest/ApartmentComplexController.java | 44 --- .../application/rest/DistrictController.java | 39 --- .../application/rest/ExchangeController.java | 89 ----- .../application/rest/InsightController.java | 211 ------------ .../rest/MyExchangeController.java | 55 --- .../application/rest/MyInsightController.java | 100 ------ .../src/main/resources/application.properties | 1 - .../insight-container/build.gradle | 6 - .../insight/service/BeanConfiguration.java | 21 -- .../service/InsightServiceApplication.java | 15 - .../service/RestClientConfiguration.java | 55 --- .../rest/ExchangeControllerTest.java | 113 ------ .../rest/MyExchangeControllerTest.java | 78 ----- .../application/rest/TestConfiguration.java | 11 - .../service/application/rest/TestData.java | 278 --------------- .../insight-application-service/build.gradle | 20 +- .../domain/InsightApplicationServiceImpl.java | 151 ++++++++ .../insight/accuse/AccuseInsightCommand.java | 19 ++ .../insight/create/CreateInsightCommand.java | 45 +++ .../insight/delete/DeleteInsightCommand.java | 18 + .../insight/detail/DetailInsightQuery.java | 16 + .../insight/detail/InsightDetailResult.java} | 42 +-- .../insight/list/ApartmentComplexResult.java | 15 + .../dto/insight/list/DistrictResult.java | 18 + .../dto/insight/list/InsightResult.java | 25 ++ .../insight/list/InsightSimpleResult.java} | 11 +- .../ListInsightByApartmentComplexQuery.java | 20 ++ .../insight/list/ListInsightByDateQuery.java | 22 ++ .../list/ListInsightByDistrictQuery.java | 25 ++ .../dto/insight/list/ListInsightQuery.java | 17 + .../list/ListMyInsightCreatedByMeQuery.java | 8 +- .../dto/insight/list/ListMyInsightQuery.java | 36 ++ .../dto/insight/list/MemberResult.java} | 5 +- .../list/MyApartmentComplexResult.java} | 4 +- .../dto/insight/list/MyDistrictResult.java} | 4 +- .../recommend/RecommendInsightCommand.java | 18 + .../insight/update/UpdateInsightCommand.java | 47 +++ .../insight/AccuseInsightCommandHandler.java | 63 ++++ .../insight/CreateInsightCommandHandler.java | 58 ++++ .../insight/DeleteInsightCommandHandler.java | 46 +++ .../insight/DetailInsightQueryHandler.java | 52 +++ .../insight/ListDistrictQueryHandler.java} | 10 +- .../insight/ListInsightQueryHandler.java | 113 ++++++ ...partmentComplexByDistrictQueryHandler.java | 30 ++ .../ListMyInsightCreatedByMeQueryHandler.java | 28 ++ .../ListMyInsightDistrictQueryHandler.java} | 24 +- .../insight/ListMyInsightQueryHandler.java | 33 ++ ...yVisitedApartmentComplexQueryHandler.java} | 14 +- .../RecommendInsightCommandHandler.java | 55 +++ .../insight/UpdateInsightCommandHandler.java | 68 ++++ .../helper}/AccuseHelper.java | 12 +- .../helper}/InsightHelper.java | 12 +- .../helper}/RecommendHelper.java | 12 +- .../domain/mapper/InsightDataMapper.java | 71 ++++ .../response/MemberAccusedResponse.java | 4 +- .../service/InsightApplicationService.java | 49 +++ .../domain/ports/output/file/FileService.java | 9 + .../InsightAccusedEventMessagePublisher.java | 7 + .../InsightCreatedEventMessagePublisher.java | 7 + .../InsightDeletedEventMessagePublisher.java | 7 + .../output/repository/AccuseRepository.java | 12 + .../output/repository/DistrictRepository.java | 4 +- .../output/repository/InsightRepository.java | 12 +- .../repository/RecommendRepository.java | 12 + .../ExchangeApplicationServiceImpl.java | 52 --- .../domain/InsightApplicationServiceImpl.java | 156 --------- .../accept/AcceptExchangeRequestCommand.java | 26 -- .../accept/AcceptExchangeRequestResponse.java | 17 - .../list/ListExchangeRequestedByMeQuery.java | 35 -- .../ListExchangeRequestedByOthersQuery.java | 33 -- .../reject/RejectExchangeRequestCommand.java | 25 -- .../RequestExchangeInsightCommand.java | 37 -- .../RequestExchangeInsightResponse.java | 19 -- .../insight/accuse/AccuseInsightCommand.java | 27 -- .../insight/accuse/AccuseInsightResponse.java | 17 - .../insight/create/CreateInsightCommand.java | 85 ----- .../insight/create/CreateInsightResponse.java | 17 - .../insight/delete/DeleteInsightCommand.java | 25 -- .../insight/detail/DetailInsightQuery.java | 20 -- .../dto/insight/list/InsightResponse.java | 32 -- .../ListInsightByApartmentComplexQuery.java | 22 -- .../insight/list/ListInsightByDateQuery.java | 25 -- .../list/ListInsightByDistrictQuery.java | 27 -- .../dto/insight/list/ListInsightQuery.java | 20 -- .../dto/insight/list/ListMyInsightQuery.java | 29 -- .../recommend/RecommendInsightCommand.java | 25 -- .../recommend/RecommendInsightResponse.java | 17 - .../request/RequestInsightCommand.java | 26 -- .../request/RequestInsightResponse.java | 17 - .../insight/update/UpdateInsightCommand.java | 84 ----- .../insight/update/UpdateInsightResponse.java | 17 - .../InsightApplicationServiceException.java | 20 -- .../handler/AccuseInsightMemberSaga.java | 26 -- ...uestAcceptedCountMessagePublisherImpl.java | 19 -- ...estCreatedRequestMessagePublisherImpl.java | 18 - .../domain/handler/ExchangeRequestHelper.java | 34 -- ...uestRejectedCountMessagePublisherImpl.java | 18 - ...stRejectedRequestMessagePublisherImpl.java | 18 - ...ghtAccusedRequestMessagePublisherImpl.java | 18 - ...sightCreatedCountMessagePublisherImpl.java | 19 -- ...berAccusedResponseMessageListenerImpl.java | 25 -- ...nCancelledResponseMessageListenerImpl.java | 25 -- ...CouponUsedResponseMessageListenerImpl.java | 25 -- .../domain/handler/MemberSnapshotHelper.java | 35 -- ...RejectExchangeRequestMemberCouponSaga.java | 26 -- .../RequestExchangeMemberCouponSaga.java | 28 -- .../domain/handler/SnapshotHelper.java | 27 -- .../domain/handler/UploadImageHelper.java | 35 -- .../AcceptExchangeRequestCommandHandler.java | 89 ----- .../ListExchangeRequestedByMeHandler.java | 74 ---- .../ListExchangeRequestedByOthersHandler.java | 77 ----- .../RejectExchangeRequestCommandHandler.java | 71 ---- .../RequestExchangeCommandHandler.java | 148 -------- .../insight/AccuseInsightCommandHandler.java | 65 ---- .../insight/CreateInsightCommandHandler.java | 70 ---- .../insight/DeleteInsightCommandHandler.java | 38 --- .../insight/DetailInsightCommandHandler.java | 237 ------------- ...sightByApartmentComplexCommandHandler.java | 57 ---- .../ListInsightByDateCommandHandler.java | 54 --- .../ListInsightByDistrictCommandHandler.java | 59 ---- .../insight/ListInsightCommandHandler.java | 53 --- ...rtmentComplexByDistrictCommandHandler.java | 34 -- .../insight/ListMyInsightCommandHandler.java | 105 ------ ...istMyInsightCreatedByMeCommandHandler.java | 72 ---- .../RecommendInsightCommandHandler.java | 72 ---- .../insight/UpdateInsightCommandHandler.java | 73 ---- .../mapper/ExchangeRequestDataMapper.java | 47 --- .../domain/mapper/InsightDataMapper.java | 119 ------- .../domain/mapper/SnapshotDataMapper.java | 74 ---- .../MemberAccusedResponseMessageListener.java | 7 - ...ouponCancelledResponseMessageListener.java | 7 - ...mberCouponUsedResponseMessageListener.java | 7 - .../service/ExchangeApplicationService.java | 22 -- .../service/InsightApplicationService.java | 53 --- .../domain/ports/output/file/FileService.java | 9 - .../output/lookup/InsightMemberLookup.java | 12 - ...eRequestAcceptedCountMessagePublisher.java | 7 - ...RequestCreatedRequestMessagePublisher.java | 7 - ...eRequestRejectedCountMessagePublisher.java | 7 - ...equestRejectedRequestMessagePublisher.java | 7 - ...InsightAccusedRequestMessagePublisher.java | 7 - .../InsightCreatedCountMessagePublisher.java | 7 - .../output/repository/AccuseRepository.java | 12 - .../repository/ExchangeRequestRepository.java | 34 -- .../repository/MemberSnapshotRepository.java | 31 -- .../repository/RecommendRepository.java | 12 - .../output/repository/SnapshotRepository.java | 15 - .../src/main/resources/application.properties | 1 - .../insight-domain-core/build.gradle | 10 +- .../insight/domain/InsightDomainService.java | 41 +++ .../domain/InsightDomainServiceImpl.java | 48 +-- .../{service => }/domain/entity/Accuse.java | 10 +- .../{service => }/domain/entity/Insight.java | 51 +-- .../domain/entity/Recommend.java | 10 +- .../domain/event/InsightAccusedEvent.java | 6 +- .../domain/event/InsightCreatedEvent.java | 11 + .../domain/event/InsightDeletedEvent.java | 4 +- .../domain/event/InsightEvent.java | 5 +- .../domain/event/InsightRecommendedEvent.java | 6 +- .../domain/event/InsightUpdatedEvent.java | 4 +- .../AccuseAlreadyExistException.java | 18 + .../exception/InsightDomainException.java | 4 +- .../exception/InsightNotFoundException.java | 7 +- .../exception/MemberNotFoundException.java | 19 ++ .../RecommendAlreadyExistException.java | 18 + .../insight/domain/valueobject/AccuseId.java | 9 + .../domain/valueobject/RecommendId.java | 4 +- .../service/domain/ExchangeDomainService.java | 16 - .../domain/ExchangeDomainServiceImpl.java | 45 --- .../service/domain/InsightDomainService.java | 50 --- .../domain/entity/ExchangeRequest.java | 94 ----- .../service/domain/entity/MemberSnapshot.java | 33 -- .../service/domain/entity/Snapshot.java | 106 ------ .../event/ExchangeRequestAcceptedEvent.java | 12 - .../ExchangeRequestByCouponCreatedEvent.java | 12 - .../event/ExchangeRequestCreatedEvent.java | 12 - .../domain/event/ExchangeRequestEvent.java | 15 - .../event/ExchangeRequestRejectedEvent.java | 12 - .../exception/ExchangeDomainException.java | 14 - .../ExchangeRequestNotFoundException.java | 18 - .../exception/SnapshotDomainException.java | 14 - .../exception/SnapshotNotFoundException.java | 23 -- .../service/domain/valueobject/AccuseId.java | 9 - .../domain/valueobject/ComplexFacility.java | 52 --- .../valueobject/ExchangeRequestStatus.java | 5 - .../domain/valueobject/FavorableNews.java | 76 ----- .../domain/valueobject/MemberInfo.java | 17 - .../domain/valueobject/MemberSnapshotId.java | 9 - .../domain/valueobject/SnapshotId.java | 9 - .../domain/valueobject/VisitMethod.java | 5 - .../service/domain/valueobject/VisitTime.java | 5 - .../src/main/resources/application.properties | 1 - .../insight-messaging/build.gradle | 6 - .../insight-messaging/listener/build.gradle | 7 + .../listener/ListenerApplicationTests.java | 13 + .../insight-messaging/message/build.gradle | 3 + .../message/InsightAccusedEventMessage.java | 10 + .../message/InsightCreatedEventMessage.java | 10 + .../message/InsightDeletedEventMessage.java | 10 + .../message/MessageApplicationTests.java | 13 + .../insight-messaging/publisher/build.gradle | 9 + ...sightAccusedEventMessagePublisherImpl.java | 21 ++ ...sightCreatedEventMessagePublisherImpl.java | 21 ++ ...sightDeletedEventMessagePublisherImpl.java | 21 ++ .../publisher/PublisherApplicationTests.java | 13 + .../src/main/resources/application.properties | 1 - .../insight-persistence/build.gradle | 18 +- .../adapter/AccuseRepositoryImpl.java | 16 +- .../adapter/DistrictRepositoryImpl.java | 8 +- .../persistence/adapter/FileServiceImpl.java | 21 ++ .../adapter/InsightRepositoryImpl.java | 24 +- .../adapter/RecommendRepositoryImpl.java | 16 +- .../client/ApartmentComplexApiRestClient.java | 17 + .../client/ApartmentComplexApiResult.java} | 4 +- .../ComplexEnvironmentConverter.java | 4 +- .../converter/EnumSetConverter.java | 2 +- .../persistence/converter/InfraConverter.java | 4 +- .../persistence/converter/JsonConverter.java | 2 +- .../converter/VisitMethodSetConverter.java | 4 +- .../converter/VisitTimeSetConverter.java | 4 +- .../persistence/entity/AccuseEntity.java | 2 +- .../persistence/entity/DistrictEntity.java | 2 +- .../persistence/entity/InsightEntity.java | 38 +-- .../persistence/entity/RecommendEntity.java | 2 +- .../mapper/AccusePersistenceMapper.java | 12 +- .../mapper/InsightPersistenceMapper.java | 14 +- .../mapper/RecommendPersistenceMapper.java | 12 +- .../repository/AccuseJpaRepository.java | 4 +- .../repository/DistrictJpaRepository.java | 4 +- .../repository/InsightJpaRepository.java | 6 +- .../repository/InsightSpecification.java | 4 +- .../repository/RecommendJpaRepository.java | 4 +- .../ExchangeRequestRepositoryImpl.java | 96 ------ .../persistence/adapter/FileServiceImpl.java | 21 -- .../adapter/InsightMemberLookupImpl.java | 77 ----- .../adapter/MemberSnapshotRepositoryImpl.java | 99 ------ .../adapter/SnapshotRepositoryImpl.java | 50 --- .../converter/ComplexFacilityConverter.java | 12 - .../converter/FavorableNewsConverter.java | 12 - .../entity/ExchangeRequestEntity.java | 59 ---- .../entity/MemberSnapshotEntity.java | 48 --- .../persistence/entity/SnapshotEntity.java | 112 ------ .../ExchangeRequestPersistenceException.java | 4 - .../ExchangeRequestPersistenceMapper.java | 58 ---- .../MemberSnapshotPersistenceMapper.java | 39 --- .../mapper/SnapshotPersistenceMapper.java | 56 --- .../ExchangeRequestJpaRepository.java | 26 -- .../MemberSnapshotJpaRepository.java | 74 ---- .../repository/SnapshotJpaRepository.java | 13 - .../member-application/build.gradle | 17 +- .../dto/auth/AppleLoginRequest.java | 6 + .../dto/auth/GoogleLoginRequest.java | 6 + .../dto/auth/JoinMemberRequest.java | 11 + .../dto/auth/KakaoLoginRequest.java | 6 + .../dto/auth/MockLoginRequest.java | 6 + .../dto/auth/ReissueTokenRequest.java | 6 + .../dto/member/OAuthWithdrawRequest.java | 6 + .../application/rest/AuthController.java | 137 ++++++++ .../application/rest/MemberController.java | 127 +++++++ .../handler/CouponGlobalExceptionHandler.java | 35 -- .../handler/GlobalExceptionHandler.java | 64 ---- .../MemberCouponGlobalExceptionHandler.java | 34 -- .../handler/MemberGlobalExceptionHandler.java | 35 -- .../application/rest/AuthController.java | 100 ------ .../application/rest/CouponController.java | 36 -- .../application/rest/MemberController.java | 107 ------ .../application/rest/MyCouponController.java | 37 -- .../src/main/resources/application.properties | 1 - member-service/member-container/build.gradle | 6 - .../member/service/BeanConfiguration.java | 27 -- .../test/java/rest/CouponControllerTest.java | 220 ------------ .../src/test/java/rest/CouponEventTest.java | 37 -- .../src/test/java/rest/TestConfiguration.java | 11 - .../src/test/java/rest/TestData.java | 75 ---- .../member-application-service/build.gradle | 14 +- .../domain/AccusePenaltyPolicyImpl.java | 32 ++ .../domain/AuthApplicationServiceImpl.java | 39 +++ .../domain/MemberApplicationServiceImpl.java | 75 ++++ .../dto/auth/JoinMemberCommand.java} | 12 +- .../member/domain/dto/auth/LoginResult.java | 25 ++ .../dto/auth}/OAuthLoginCommand.java | 4 +- .../dto/auth}/OAuthLoginResponse.java | 4 +- .../domain/dto/auth/ReissueTokenCommand.java | 14 +- .../dto/auth/ReissueTokenResult.java} | 4 +- .../member/domain/dto/auth/TokenResult.java | 15 + .../dto/auth}/apple/AppleLoginCommand.java | 6 +- .../dto/auth}/google/GoogleLoginCommand.java | 6 +- .../dto/auth}/kakao/KakaoLoginCommand.java | 7 +- .../dto/auth/mock}/MockLoginCommand.java | 6 +- .../domain/dto/member/MemberResult.java | 21 ++ .../domain/dto/member/MyPageInfoResult.java | 15 + .../dto/member/OAuthWithdrawCommand.java | 11 + .../dto/member}/OAuthWithdrawCommand_.java | 4 +- .../member/apple/AppleWithdrawCommand.java | 34 ++ .../member/google/GoogleWithdrawCommand.java | 34 ++ .../member}/kakao/KakaoWithdrawCommand.java | 14 +- .../domain/handler/MemberHelper.java | 16 +- .../handler/auth/JoinCommandHandler.java | 42 +++ .../handler/auth}/LogoutCommandHandler.java | 17 +- .../auth/OAuthLoginCommandHandler.java | 36 +- .../auth/ReissueTokenCommandHandler.java | 41 +++ .../domain/handler/auth/TokenHandler.java | 44 +++ .../handler/auth}/WithdrawCommandHandler.java | 23 +- .../member/AccuseMemberCommandHandler.java | 28 ++ .../member/DetailMemberQueryHandler.java | 26 ++ .../member/DetailMyPageInfoQueryHandler.java | 27 ++ .../member/ListMemberQueryHandler.java} | 18 +- .../UpdateInsightCountCommandHandler.java | 31 ++ .../domain/mapper/MemberDataMapper.java | 28 ++ .../input/service/AuthApplicationService.java | 13 + .../service/MemberApplicationService.java | 25 ++ .../output/client/OAuthApiClientHandler.java | 12 + .../ports/output/provider/TokenProvider.java | 21 ++ .../output/repository}/MemberRepository.java | 8 +- .../domain/MemberApplicationServiceImpl.java | 76 ----- .../MemberCouponApplicationServiceImpl.java | 29 -- .../service/domain/dto/DetailMyPageQuery.java | 15 - .../domain/dto/DetailMyPageResponse.java | 13 - .../service/domain/dto/LoginResponse.java | 30 -- .../service/domain/dto/MemberResponse.java | 21 -- .../domain/dto/TokenReissueCommand.java | 18 - .../dto/coupon/DetailMyCouponResponse.java | 16 - .../dto/coupon/IssueMemberCouponCommand.java | 20 -- .../dto/oauth/OAuthWithdrawCommand.java | 9 - .../dto/oauth/apple/AppleWithdrawCommand.java | 26 -- .../oauth/google/GoogleWithdrawCommand.java | 26 -- ...questAcceptedCountMessageListenerImpl.java | 30 -- ...uestCreatedRequestMessageListenerImpl.java | 42 --- ...questRejectedCountMessageListenerImpl.java | 54 --- ...estRejectedRequestMessageListenerImpl.java | 41 --- ...ightAccusedRequestMessageListenerImpl.java | 38 --- ...nsightCreatedCountMessageListenerImpl.java | 33 -- .../handler/auth/JoinCommandHandler.java | 50 --- .../handler/auth/OAuthApiClientHandler.java | 12 - .../handler/auth/ReissueCommandHandler.java | 49 --- .../handler/auth/TokenRequestHandler.java | 40 --- .../handler/coupon/DetailMyCouponHandler.java | 37 -- .../IssueMemberCouponCommandHandler.java | 90 ----- .../handler/coupon/policy/CouponPolicy.java | 11 - .../policy/FirstCheerUpCouponPolicy.java | 45 --- .../coupon/policy/JoinedCouponPolicy.java | 36 -- .../policy/SecondCheerUpCouponPolicy.java | 45 --- .../policy/ThirdCheerUpCouponPolicy.java | 43 --- .../member/DetailMemberCommandHandler.java | 29 -- .../member/DetailMyPageCommandHandler.java | 30 -- .../domain/mapper/MemberCouponDataMapper.java | 31 -- .../domain/mapper/MemberDataMapper.java | 30 -- ...geRequestAcceptedCountMessageListener.java | 8 - ...eRequestCreatedRequestMessageListener.java | 8 - ...geRequestRejectedCountMessageListener.java | 7 - ...RequestRejectedRequestMessageListener.java | 8 - .../InsightAccusedRequestMessageListener.java | 7 - .../InsightCreatedCountMessageListener.java | 8 - .../service/MemberApplicationService.java | 25 -- .../MemberCouponApplicationService.java | 14 - .../domain/ports/output/CouponRepository.java | 12 - .../ports/output/MemberCouponRepository.java | 20 -- .../src/main/resources/application.properties | 1 - .../member-domain-core/build.gradle | 10 +- .../member/domain/MemberDomainService.java | 23 ++ .../domain/MemberDomainServiceImpl.java | 27 +- .../{service => }/domain/entity/Member.java | 51 +-- .../exception/MemberDomainException.java | 4 +- .../exception/MemberNotFoundException.java | 7 +- .../valueobject/AccusePenaltyPolicy.java | 7 + .../domain/MemberCouponDomainService.java | 9 - .../domain/MemberCouponDomainServiceImpl.java | 26 -- .../service/domain/MemberDomainService.java | 25 -- .../member/service/domain/entity/Coupon.java | 20 -- .../service/domain/entity/MemberCoupon.java | 59 ---- .../exception/CouponDomainException.java | 14 - .../exception/CouponNotFoundException.java | 18 - .../MemberCouponDomainException.java | 14 - .../MemberCouponNotFoundException.java | 18 - .../valueobject/AccusePenaltyPolicy.java | 36 -- .../service/domain/valueobject/OAuthType.java | 5 - .../src/main/resources/application.properties | 1 - member-service/member-messaging/build.gradle | 6 + .../member-messaging/listener/build.gradle | 9 + .../InsightAccusedEventMessageListener.java | 25 ++ .../InsightCreatedEventMessageListener.java | 25 ++ .../InsightDeletedEventMessageListener.java | 25 ++ .../listener/ListenerApplicationTests.java | 13 + .../member-messaging/message/build.gradle | 0 .../member-messaging/publisher/build.gradle | 0 .../member-persistence/build.gradle | 20 +- .../adapter/MemberRepositoryImpl.java | 18 +- .../client}/AppleApiClientHandler.java | 15 +- .../client}/AppleLoginResponse.java | 6 +- .../client}/AppleTokenResponse.java | 2 +- .../client}/GoogleApiClientHandler.java | 14 +- .../client}/GoogleLoginResponse.java | 6 +- .../client}/GoogleTokenResponse.java | 2 +- .../client}/KaKaoApiClientHandler.java | 17 +- .../client}/KakaoLoginResponse.java | 6 +- .../client}/KakaoTokenResponse.java | 2 +- .../client}/KakaoWithdrawResponse.java | 4 +- .../client}/MockApiClientHandler.java | 11 +- .../RestTemplateConfiguration.java | 14 + .../persistence/entity/MemberEntity.java | 16 +- .../mapper/MemberPersistenceMapper.java | 14 +- .../provider}/JwtTokenProvider.java | 35 +- .../repository/MemberJpaRepository.java | 6 +- .../adapter/CouponRepositoryImpl.java | 30 -- .../adapter/MemberCouponRepositoryImpl.java | 61 ---- .../persistence/entity/CouponEntity.java | 29 -- .../entity/MemberCouponEntity.java | 49 --- .../mapper/CouponPersistenceMapper.java | 27 -- .../mapper/MemberCouponPersistenceMapper.java | 38 --- .../repository/CouponJpaRepository.java | 12 - .../repository/MemberCouponJpaRepository.java | 13 - .../member-service-client/build.gradle | 0 .../build.gradle | 7 + .../domain/client}/MemberFeignClient.java | 11 +- .../domain/client/MemberInfoResolverImpl.java | 32 ++ .../member-service-client-api/build.gradle | 3 + .../member/domain/client/MemberData.java | 9 +- .../domain/client/MemberDataResolver.java | 12 + .../exception/MemberNotFoundException.java | 19 ++ ...emberServiceClientApiApplicationTests.java | 13 + .../setting-application/build.gradle | 17 +- .../application/dto/AgreeTermsRequest.java | 8 +- .../rest/NotificationController.java | 26 +- .../application/rest/TermsController.java | 32 +- .../handler/GlobalExceptionHandler.java | 64 ---- .../src/main/resources/application.properties | 1 - .../setting-container/build.gradle | 6 - .../setting/service/BeanConfiguration.java | 21 -- .../setting/service/FcmConfiguration.java | 54 --- .../service/SettingServiceApplication.java | 14 - .../rest/NotificationControllerTest.java | 48 --- .../application/rest/TermsControllerTest.java | 68 ---- .../application/rest/TestConfiguration.java | 11 - .../setting-application-service/build.gradle | 20 +- .../NotificationApplicationServiceImpl.java | 16 +- .../domain/TermsApplicationServiceImpl.java | 14 +- .../ObjectMapperConfiguration.java | 4 +- .../domain/dto/AgreeTermsCommand.java | 13 +- .../domain/dto/CreateNotificationCommand.java | 9 +- .../domain/dto/ListNotificationQuery.java | 22 ++ .../dto/NotificationResult.java} | 16 +- .../setting/domain/dto/TermsResult.java | 19 ++ .../handler/AgreeTermsCommandHandler.java | 27 +- .../CheckNewNotificationCommandHandler.java | 6 +- .../CreateNotificationCommandHandler.java | 16 +- .../ListNotificationCommandHandler.java | 21 +- .../handler/ListTermsCommandHandler.java | 12 +- .../UpdateNotificationAsCheckedHandler.java | 12 +- .../domain/mapper/NotificationDataMapper.java | 15 +- .../domain/mapper/TermsDataMapper.java | 18 + .../listener/SendNotificationListener.java | 78 +++++ .../NotificationApplicationService.java | 13 + .../service/TermsApplicationService.java | 12 + .../repository/NotificationRepository.java | 6 +- .../repository/TermsAgreementRepository.java | 7 + .../output/repository/TermsRepository.java | 12 + .../output/sender/NotificationRequest.java | 19 ++ .../output/sender/NotificationSender.java | 5 + .../domain/SendNotificationListener.java | 73 ---- .../service/domain/dto/FcmTokenResponse.java | 14 - .../domain/dto/ListNotificationQuery.java | 23 -- .../domain/dto/NotificationResponse.java | 26 -- .../service/domain/dto/TermsResponse.java | 23 -- .../SettingApplicationServiceException.java | 20 -- .../handler/SendNotificationHandler.java | 77 ----- .../domain/mapper/TermsDataMapper.java | 18 - .../NotificationApplicationService.java | 13 - .../service/TermsApplicationService.java | 12 - .../output/lookup/SettingMemberLookup.java | 10 - .../repository/TermsAgreementRepository.java | 7 - .../output/repository/TermsRepository.java | 11 - .../src/main/resources/application.properties | 1 - .../setting-domain-core/build.gradle | 10 +- .../domain/NotificationDomainService.java | 9 + .../domain/NotificationDomainServiceImpl.java | 6 +- .../setting/domain/TermsDomainService.java | 9 + .../domain/TermsDomainServiceImpl.java | 8 +- .../domain/entity/Notification.java | 12 +- .../{service => }/domain/entity/Terms.java | 8 +- .../domain/entity/TermsAgreement.java | 10 +- .../event/NotificationCreatedEvent.java | 4 +- .../domain/event/NotificationEvent.java | 15 + .../NotificationDomainException.java | 4 +- .../domain/NotificationDomainService.java | 9 - .../service/domain/TermsDomainService.java | 9 - .../domain/event/NotificationEvent.java | 15 - .../domain/valueobject/MemberInfo.java | 10 - .../valueobject/NotificationCategory.java | 36 -- .../service/domain/valueobject/TermsId.java | 9 - .../src/main/resources/application.properties | 1 - .../setting-persistence/build.gradle | 22 +- .../adapter/NotificationRepositoryImpl.java | 14 +- .../adapter/TermsAgreementRepositoryImpl.java | 12 +- .../adapter/TermsRepositoryImpl.java | 17 +- .../configuration/FcmConfiguration.java | 46 +++ .../entity/NotificationEntity.java | 4 +- .../entity/TermsAgreementEntity.java | 2 +- .../persistence/entity/TermsEntity.java | 2 +- .../exception/FirebaseException.java | 5 +- .../fcm/FcmNotificationSender.java | 74 ++++ .../mapper/NotificationPersistenceMapper.java | 10 +- .../TermsAgreementPersistenceMapper.java | 12 +- .../mapper/TermsPersistenceMapper.java | 8 +- .../repository/NotificationJpaRepository.java | 4 +- .../TermsAgreementJpaRepository.java | 4 +- .../repository/TermsJpaRepository.java | 4 +- .../adapter/SettingMemberLookupImpl.java | 39 --- .../src/main/resources/application.properties | 1 - settings.gradle | 17 +- test.puml | 10 + 651 files changed, 6378 insertions(+), 11742 deletions(-) create mode 100644 TEST.md create mode 100644 batch/.gitattributes create mode 100644 batch/.gitignore create mode 100644 batch/build.gradle create mode 100644 batch/gradle/wrapper/gradle-wrapper.jar create mode 100644 batch/gradle/wrapper/gradle-wrapper.properties create mode 100644 batch/gradlew create mode 100644 batch/gradlew.bat create mode 100644 batch/settings.gradle create mode 100644 batch/src/main/java/com/project/imdang/BatchApplication.java create mode 100644 batch/src/main/java/com/project/imdang/batch/DataSourceConfiguration.java create mode 100644 batch/src/main/java/com/project/imdang/batch/LiftPenaltyJobConfiguration.java create mode 100644 batch/src/main/java/com/project/imdang/batch/Member.java create mode 100644 batch/src/main/java/com/project/imdang/scheduler/BatchScheduler.java create mode 100644 batch/src/test/java/com/project/imdang/batch/LiftPenaltyJobConfigurationTest.java create mode 100644 batch/src/test/resources/schema.sql create mode 100644 common/build.gradle delete mode 100644 common/common-application/src/main/java/com/project/imdang/application/handler/ErrorDTO.java create mode 100644 common/common-application/src/main/java/com/project/imdang/common/application/Property.java create mode 100644 common/common-application/src/main/java/com/project/imdang/common/application/dto/PagingRequest.java rename {insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client => common/common-application/src/main/java/com/project/imdang/common/application/exception}/ExternalApiException.java (77%) create mode 100644 common/common-application/src/main/java/com/project/imdang/common/application/response/ErrorResponse.java rename common/common-application/src/main/java/com/project/imdang/{application/security => common/application/response/code}/ErrorCode.java (78%) create mode 100644 common/common-application/src/main/java/com/project/imdang/common/application/response/handler/GlobalExceptionHandler.java delete mode 100644 common/common-application/src/main/resources/application.properties create mode 100644 common/common-domain/build.gradle create mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/dto/PagingQuery.java create mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/DomainEventMessageListener.java create mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/DomainEventMessagePublisher.java rename {infrastructure/event/src/main/java/com/project/imdang/event => common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry}/EventEntry.java (89%) rename {infrastructure/event/src/main/java/com/project/imdang/event => common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry}/EventListener.java (58%) create mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventProcessor.java rename common/common-domain/common-application-service/src/main/java/com/project/imdang/{ => common}/domain/utils/PagingUtils.java (95%) delete mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestAcceptedCountRequestMessage.java delete mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestCreatedRequestMessage.java delete mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestRejectedCountRequestMessage.java delete mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestRejectedRequestMessage.java delete mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/InsightAccusedRequestMessage.java delete mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/InsightCreatedCountRequestMessage.java delete mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberCouponCancelledResponseMessage.java delete mode 100644 common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberCouponUsedResponseMessage.java delete mode 100644 common/common-domain/common-application-service/src/main/resources/application.properties rename common/common-domain/common-domain-core/src/main/java/com/project/imdang/{ => common}/domain/entity/AggregateRoot.java (58%) rename common/common-domain/common-domain-core/src/main/java/com/project/imdang/{ => common}/domain/entity/BaseEntity.java (91%) create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/event/DomainEventMessage.java create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainAlreadyExistException.java create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainErrorCode.java rename common/common-domain/common-domain-core/src/main/java/com/project/imdang/{ => common}/domain/exception/DomainException.java (81%) create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainNotFoundException.java rename {insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/Access.java (52%) rename {insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/Address.java (72%) rename {insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/ApartmentComplex.java (91%) rename common/common-domain/common-domain-core/src/main/java/com/project/imdang/{ => common}/domain/valueobject/BaseId.java (91%) rename {insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/ComplexEnvironment.java (51%) rename {insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/District.java (63%) create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/File.java rename {member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/Gender.java (88%) rename {insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/Infra.java (55%) rename common/common-domain/common-domain-core/src/main/java/com/project/imdang/{ => common}/domain/valueobject/InsightId.java (71%) rename common/common-domain/common-domain-core/src/main/java/com/project/imdang/{ => common}/domain/valueobject/MemberId.java (71%) rename {member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/MemberStatus.java (56%) create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/NotificationCategory.java rename {setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/NotificationId.java (51%) create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/OAuthType.java rename {insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/ObjectiveItem.java (63%) rename {insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/Opinion.java (83%) rename {member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/Penalty.java (57%) rename {member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/PenaltyPeriod.java (84%) rename {setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service => common/common-domain/common-domain-core/src/main/java/com/project/imdang/common}/domain/valueobject/TermsAgreementId.java (52%) create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/TermsId.java create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/VisitMethod.java create mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/VisitTime.java delete mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/event/EmptyEvent.java delete mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/event/publisher/DomainEventPublisher.java delete mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/ApplicationServiceException.java delete mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/ErrorCode.java delete mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/CouponId.java delete mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/ExchangeRequestId.java delete mode 100644 common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/MemberCouponId.java delete mode 100644 common/common-domain/common-domain-core/src/main/resources/application.properties delete mode 100644 demo/src/api-coupon.js delete mode 100644 demo/src/api-exchange.js delete mode 100644 demo/src/api-my-coupon.js delete mode 100644 demo/src/api-my-exchange.js delete mode 100644 demo/src/components/MyExchange.jsx create mode 100644 diagram.md create mode 100644 imdang-container/src/main/java/com/project/imdang/ImdangApplication.java create mode 100644 imdang-container/src/main/java/com/project/imdang/configuration/BeanConfiguration.java rename imdang-container/src/main/java/com/project/imdang/{container => configuration}/DemoConfiguration.java (96%) rename {common/common-application/src/main/java/com/project/imdang/application => imdang-container/src/main/java/com/project/imdang}/configuration/SecurityConfiguration.java (79%) rename {common/common-application/src/main/java/com/project/imdang/application => imdang-container/src/main/java/com/project/imdang}/configuration/SwaggerConfiguration.java (97%) delete mode 100644 imdang-container/src/main/java/com/project/imdang/container/ImdangApplication.java rename {common/common-application/src/main/java/com/project/imdang/application/security => imdang-container/src/main/java/com/project/imdang/jwt}/JwtAuthFilter.java (81%) rename {common/common-application/src/main/java/com/project/imdang/application/security => imdang-container/src/main/java/com/project/imdang/jwt}/JwtAuthenticationEntryPoint.java (80%) delete mode 100644 imdang-container/src/main/resources/default_insert.sql rename {insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest => imdang-container/src/test/java/com/project/imdang/insight}/InsightControllerTest.java (71%) rename {insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest => imdang-container/src/test/java/com/project/imdang/insight}/MyInsightControllerTest.java (70%) create mode 100644 imdang-container/src/test/java/com/project/imdang/insight/TestData.java rename {member-service/member-container/src/test/java/rest => imdang-container/src/test/java/com/project/imdang/member}/MemberControllerTest.java (80%) create mode 100644 imdang-container/src/test/java/com/project/imdang/member/TestData.java delete mode 100644 infrastructure/event/build.gradle delete mode 100644 infrastructure/event/src/main/java/com/project/imdang/event/EventProcessor.java create mode 100644 infrastructure/kafka/consumer/build.gradle create mode 100644 infrastructure/kafka/producer/build.gradle delete mode 100644 infrastructure/saga/src/main/resources/application.properties create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/AccuseInsightRequest.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/AddressDTO.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/ApartmentComplexDTO.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/ComplexEnvironmentDTO.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/CreateInsightRequest.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DeleteInsightRequest.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DistrictDTO.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/InfraDTO.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/RecommendInsightRequest.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/UpdateInsightRequest.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/DistrictController.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java create mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/MyInsightController.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ApartmentComplexApiRestClient.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/exception/handler/GlobalExceptionHandler.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/exception/handler/InsightGlobalExceptionHandler.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/ApartmentComplexController.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/DistrictController.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/ExchangeController.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/InsightController.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/MyExchangeController.java delete mode 100644 insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/MyInsightController.java delete mode 100644 insight-service/insight-application/src/main/resources/application.properties delete mode 100644 insight-service/insight-container/build.gradle delete mode 100644 insight-service/insight-container/src/main/java/com/project/imdang/insight/service/BeanConfiguration.java delete mode 100644 insight-service/insight-container/src/main/java/com/project/imdang/insight/service/InsightServiceApplication.java delete mode 100644 insight-service/insight-container/src/main/java/com/project/imdang/insight/service/RestClientConfiguration.java delete mode 100644 insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/ExchangeControllerTest.java delete mode 100644 insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/MyExchangeControllerTest.java delete mode 100644 insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/TestConfiguration.java delete mode 100644 insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/TestData.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/InsightApplicationServiceImpl.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/accuse/AccuseInsightCommand.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/create/CreateInsightCommand.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/delete/DeleteInsightCommand.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/DetailInsightQuery.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/dto/insight/detail/DetailInsightResponse.java => domain/dto/insight/detail/InsightDetailResult.java} (55%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ApartmentComplexResult.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/DistrictResult.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/dto/insight/list/InsightSimpleResponse.java => domain/dto/insight/list/InsightSimpleResult.java} (56%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByApartmentComplexQuery.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByDateQuery.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByDistrictQuery.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightQuery.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service => }/domain/dto/insight/list/ListMyInsightCreatedByMeQuery.java (72%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListMyInsightQuery.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/dto/insight/list/MemberResponse.java => domain/dto/insight/list/MemberResult.java} (74%) rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/dto/insight/list/ApartmentComplexResponse.java => domain/dto/insight/list/MyApartmentComplexResult.java} (73%) rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/dto/insight/list/DistrictResponse.java => domain/dto/insight/list/MyDistrictResult.java} (82%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/recommend/RecommendInsightCommand.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/AccuseInsightCommandHandler.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/CreateInsightCommandHandler.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DeleteInsightCommandHandler.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DetailInsightQueryHandler.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/handler/insight/ListDistrictCommandHandler.java => domain/handler/insight/ListDistrictQueryHandler.java} (72%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListInsightQueryHandler.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightApartmentComplexByDistrictQueryHandler.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightCreatedByMeQueryHandler.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/handler/insight/ListMyInsightDistrictCommandHandler.java => domain/handler/insight/ListMyInsightDistrictQueryHandler.java} (59%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightQueryHandler.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/handler/insight/ListMyVisitedApartmentComplexCommandHandler.java => domain/handler/insight/ListMyVisitedApartmentComplexQueryHandler.java} (53%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/RecommendInsightCommandHandler.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/handler => domain/helper}/AccuseHelper.java (70%) rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/handler => domain/helper}/InsightHelper.java (68%) rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service/domain/handler => domain/helper}/RecommendHelper.java (70%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java rename common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberAccusedResponseMessage.java => insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/message/response/MemberAccusedResponse.java (74%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/input/service/InsightApplicationService.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/file/FileService.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightAccusedEventMessagePublisher.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightCreatedEventMessagePublisher.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightDeletedEventMessagePublisher.java create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/AccuseRepository.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service => }/domain/ports/output/repository/DistrictRepository.java (69%) rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/{service => }/domain/ports/output/repository/InsightRepository.java (65%) create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/RecommendRepository.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ExchangeApplicationServiceImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/InsightApplicationServiceImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/accept/AcceptExchangeRequestCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/accept/AcceptExchangeRequestResponse.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/list/ListExchangeRequestedByMeQuery.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/list/ListExchangeRequestedByOthersQuery.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/reject/RejectExchangeRequestCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/request/RequestExchangeInsightCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/request/RequestExchangeInsightResponse.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/accuse/AccuseInsightCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/accuse/AccuseInsightResponse.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/create/CreateInsightCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/create/CreateInsightResponse.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/delete/DeleteInsightCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/detail/DetailInsightQuery.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/InsightResponse.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByApartmentComplexQuery.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByDateQuery.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByDistrictQuery.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightQuery.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListMyInsightQuery.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/recommend/RecommendInsightCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/recommend/RecommendInsightResponse.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/request/RequestInsightCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/request/RequestInsightResponse.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/update/UpdateInsightCommand.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/update/UpdateInsightResponse.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/exception/InsightApplicationServiceException.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/AccuseInsightMemberSaga.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestAcceptedCountMessagePublisherImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestCreatedRequestMessagePublisherImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestHelper.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestRejectedCountMessagePublisherImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestRejectedRequestMessagePublisherImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightAccusedRequestMessagePublisherImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightCreatedCountMessagePublisherImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberAccusedResponseMessageListenerImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberCouponCancelledResponseMessageListenerImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberCouponUsedResponseMessageListenerImpl.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberSnapshotHelper.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RejectExchangeRequestMemberCouponSaga.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RequestExchangeMemberCouponSaga.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/SnapshotHelper.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/UploadImageHelper.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/AcceptExchangeRequestCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/ListExchangeRequestedByMeHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/ListExchangeRequestedByOthersHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/RejectExchangeRequestCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/RequestExchangeCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/AccuseInsightCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/CreateInsightCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/DeleteInsightCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/DetailInsightCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByApartmentComplexCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByDateCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByDistrictCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightApartmentComplexByDistrictCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightCreatedByMeCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/RecommendInsightCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/UpdateInsightCommandHandler.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/ExchangeRequestDataMapper.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/InsightDataMapper.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/SnapshotDataMapper.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberAccusedResponseMessageListener.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberCouponCancelledResponseMessageListener.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberCouponUsedResponseMessageListener.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/service/ExchangeApplicationService.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/service/InsightApplicationService.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/file/FileService.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/lookup/InsightMemberLookup.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestAcceptedCountMessagePublisher.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestCreatedRequestMessagePublisher.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestRejectedCountMessagePublisher.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestRejectedRequestMessagePublisher.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/InsightAccusedRequestMessagePublisher.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/InsightCreatedCountMessagePublisher.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/AccuseRepository.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/ExchangeRequestRepository.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/MemberSnapshotRepository.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/RecommendRepository.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/SnapshotRepository.java delete mode 100644 insight-service/insight-domain/insight-application-service/src/main/resources/application.properties create mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/InsightDomainServiceImpl.java (61%) rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/entity/Accuse.java (78%) rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/entity/Insight.java (69%) rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/entity/Recommend.java (79%) rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/event/InsightAccusedEvent.java (63%) create mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightCreatedEvent.java rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/event/InsightDeletedEvent.java (63%) rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/event/InsightEvent.java (65%) rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/event/InsightRecommendedEvent.java (64%) rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/event/InsightUpdatedEvent.java (63%) create mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/AccuseAlreadyExistException.java rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/exception/InsightDomainException.java (67%) rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/exception/InsightNotFoundException.java (57%) create mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/MemberNotFoundException.java create mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/RecommendAlreadyExistException.java create mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/valueobject/AccuseId.java rename insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/{service => }/domain/valueobject/RecommendId.java (50%) delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/ExchangeDomainService.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/ExchangeDomainServiceImpl.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/InsightDomainService.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/ExchangeRequest.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/MemberSnapshot.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Snapshot.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestAcceptedEvent.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestByCouponCreatedEvent.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestCreatedEvent.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestEvent.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestRejectedEvent.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/ExchangeDomainException.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/ExchangeRequestNotFoundException.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/SnapshotDomainException.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/SnapshotNotFoundException.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/AccuseId.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ComplexFacility.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ExchangeRequestStatus.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/FavorableNews.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/MemberInfo.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/MemberSnapshotId.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/SnapshotId.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/VisitMethod.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/VisitTime.java delete mode 100644 insight-service/insight-domain/insight-domain-core/src/main/resources/application.properties create mode 100644 insight-service/insight-messaging/listener/build.gradle create mode 100644 insight-service/insight-messaging/listener/src/test/java/com/project/imdang/insight/messaging/listener/ListenerApplicationTests.java create mode 100644 insight-service/insight-messaging/message/build.gradle create mode 100644 insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightAccusedEventMessage.java create mode 100644 insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightCreatedEventMessage.java create mode 100644 insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightDeletedEventMessage.java create mode 100644 insight-service/insight-messaging/message/src/test/java/com/project/imdang/insight/messaging/message/MessageApplicationTests.java create mode 100644 insight-service/insight-messaging/publisher/build.gradle create mode 100644 insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightAccusedEventMessagePublisherImpl.java create mode 100644 insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightCreatedEventMessagePublisherImpl.java create mode 100644 insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightDeletedEventMessagePublisherImpl.java create mode 100644 insight-service/insight-messaging/publisher/src/test/java/com/project/imdang/insight/messaging/publisher/PublisherApplicationTests.java delete mode 100644 insight-service/insight-messaging/src/main/resources/application.properties rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/adapter/AccuseRepositoryImpl.java (62%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/adapter/DistrictRepositoryImpl.java (80%) create mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/FileServiceImpl.java rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/adapter/InsightRepositoryImpl.java (80%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/adapter/RecommendRepositoryImpl.java (64%) create mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/client/ApartmentComplexApiRestClient.java rename insight-service/{insight-application/src/main/java/com/project/imdang/insight/service/application/client/ApartmentComplexApiResponse.java => insight-persistence/src/main/java/com/project/imdang/insight/persistence/client/ApartmentComplexApiResult.java} (85%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/converter/ComplexEnvironmentConverter.java (60%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/converter/EnumSetConverter.java (94%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/converter/InfraConverter.java (56%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/converter/JsonConverter.java (95%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/converter/VisitMethodSetConverter.java (62%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/converter/VisitTimeSetConverter.java (61%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/entity/AccuseEntity.java (94%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/entity/DistrictEntity.java (91%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/entity/InsightEntity.java (66%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/entity/RecommendEntity.java (94%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/mapper/AccusePersistenceMapper.java (74%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/mapper/InsightPersistenceMapper.java (80%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/mapper/RecommendPersistenceMapper.java (75%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/repository/AccuseJpaRepository.java (69%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/repository/DistrictJpaRepository.java (85%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/repository/InsightJpaRepository.java (82%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/repository/InsightSpecification.java (94%) rename insight-service/insight-persistence/src/main/java/com/project/imdang/insight/{service => }/persistence/repository/RecommendJpaRepository.java (69%) delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/ExchangeRequestRepositoryImpl.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/FileServiceImpl.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/InsightMemberLookupImpl.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/MemberSnapshotRepositoryImpl.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/SnapshotRepositoryImpl.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/ComplexFacilityConverter.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/FavorableNewsConverter.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/ExchangeRequestEntity.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/MemberSnapshotEntity.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/SnapshotEntity.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/exception/ExchangeRequestPersistenceException.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/ExchangeRequestPersistenceMapper.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/MemberSnapshotPersistenceMapper.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/SnapshotPersistenceMapper.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/ExchangeRequestJpaRepository.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/MemberSnapshotJpaRepository.java delete mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/SnapshotJpaRepository.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/AppleLoginRequest.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/GoogleLoginRequest.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/JoinMemberRequest.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/KakaoLoginRequest.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/MockLoginRequest.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/ReissueTokenRequest.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/dto/member/OAuthWithdrawRequest.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/rest/AuthController.java create mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/application/rest/MemberController.java delete mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/CouponGlobalExceptionHandler.java delete mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/GlobalExceptionHandler.java delete mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/MemberCouponGlobalExceptionHandler.java delete mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/MemberGlobalExceptionHandler.java delete mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/AuthController.java delete mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/CouponController.java delete mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/MemberController.java delete mode 100644 member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/MyCouponController.java delete mode 100644 member-service/member-application/src/main/resources/application.properties delete mode 100644 member-service/member-container/build.gradle delete mode 100644 member-service/member-container/src/main/java/com/project/imdang/member/service/BeanConfiguration.java delete mode 100644 member-service/member-container/src/test/java/rest/CouponControllerTest.java delete mode 100644 member-service/member-container/src/test/java/rest/CouponEventTest.java delete mode 100644 member-service/member-container/src/test/java/rest/TestConfiguration.java delete mode 100644 member-service/member-container/src/test/java/rest/TestData.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/AccusePenaltyPolicyImpl.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/AuthApplicationServiceImpl.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/MemberApplicationServiceImpl.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/JoinCommand.java => domain/dto/auth/JoinMemberCommand.java} (53%) create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/LoginResult.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/oauth => domain/dto/auth}/OAuthLoginCommand.java (55%) rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/oauth => domain/dto/auth}/OAuthLoginResponse.java (56%) rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/reject/RejectExchangeRequestResponse.java => member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/ReissueTokenCommand.java (51%) rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/TokenResponse.java => domain/dto/auth/ReissueTokenResult.java} (79%) create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/TokenResult.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/oauth => domain/dto/auth}/apple/AppleLoginCommand.java (77%) rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/oauth => domain/dto/auth}/google/GoogleLoginCommand.java (77%) rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/oauth => domain/dto/auth}/kakao/KakaoLoginCommand.java (77%) rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/handler/auth => domain/dto/auth/mock}/MockLoginCommand.java (76%) create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/MemberResult.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/MyPageInfoResult.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/OAuthWithdrawCommand.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/oauth => domain/dto/member}/OAuthWithdrawCommand_.java (83%) create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/apple/AppleWithdrawCommand.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/google/GoogleWithdrawCommand.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/dto/oauth => domain/dto/member}/kakao/KakaoWithdrawCommand.java (62%) rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service => }/domain/handler/MemberHelper.java (74%) create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/JoinCommandHandler.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/handler/member => domain/handler/auth}/LogoutCommandHandler.java (58%) rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service => }/domain/handler/auth/OAuthLoginCommandHandler.java (60%) create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/ReissueTokenCommandHandler.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/TokenHandler.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/handler/member => domain/handler/auth}/WithdrawCommandHandler.java (66%) create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/AccuseMemberCommandHandler.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/DetailMemberQueryHandler.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/DetailMyPageInfoQueryHandler.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/handler/member/ListMemberCommandHandler.java => domain/handler/member/ListMemberQueryHandler.java} (51%) create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/UpdateInsightCountCommandHandler.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/mapper/MemberDataMapper.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/input/service/AuthApplicationService.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/input/service/MemberApplicationService.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/client/OAuthApiClientHandler.java create mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/provider/TokenProvider.java rename member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/{service/domain/ports/output => domain/ports/output/repository}/MemberRepository.java (64%) delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/MemberApplicationServiceImpl.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/MemberCouponApplicationServiceImpl.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/DetailMyPageQuery.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/DetailMyPageResponse.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/LoginResponse.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/MemberResponse.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/TokenReissueCommand.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/coupon/DetailMyCouponResponse.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/coupon/IssueMemberCouponCommand.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthWithdrawCommand.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleWithdrawCommand.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleWithdrawCommand.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestAcceptedCountMessageListenerImpl.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestCreatedRequestMessageListenerImpl.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestRejectedCountMessageListenerImpl.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestRejectedRequestMessageListenerImpl.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/InsightAccusedRequestMessageListenerImpl.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/InsightCreatedCountMessageListenerImpl.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/JoinCommandHandler.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/OAuthApiClientHandler.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/ReissueCommandHandler.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/TokenRequestHandler.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/DetailMyCouponHandler.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/IssueMemberCouponCommandHandler.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/CouponPolicy.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/FirstCheerUpCouponPolicy.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/JoinedCouponPolicy.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/SecondCheerUpCouponPolicy.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/ThirdCheerUpCouponPolicy.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/DetailMemberCommandHandler.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/DetailMyPageCommandHandler.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/mapper/MemberCouponDataMapper.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/mapper/MemberDataMapper.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestAcceptedCountMessageListener.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestCreatedRequestMessageListener.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestRejectedCountMessageListener.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestRejectedRequestMessageListener.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/InsightAccusedRequestMessageListener.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/InsightCreatedCountMessageListener.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/service/MemberApplicationService.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/service/MemberCouponApplicationService.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/CouponRepository.java delete mode 100644 member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/MemberCouponRepository.java delete mode 100644 member-service/member-domain/member-application-service/src/main/resources/application.properties create mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/MemberDomainService.java rename member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/{service => }/domain/MemberDomainServiceImpl.java (62%) rename member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/{service => }/domain/entity/Member.java (66%) rename member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/{service => }/domain/exception/MemberDomainException.java (67%) rename member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/{service => }/domain/exception/MemberNotFoundException.java (57%) create mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/valueobject/AccusePenaltyPolicy.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberCouponDomainService.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberCouponDomainServiceImpl.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberDomainService.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/Coupon.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/MemberCoupon.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/CouponDomainException.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/CouponNotFoundException.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberCouponDomainException.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberCouponNotFoundException.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/AccusePenaltyPolicy.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/OAuthType.java delete mode 100644 member-service/member-domain/member-domain-core/src/main/resources/application.properties create mode 100644 member-service/member-messaging/build.gradle create mode 100644 member-service/member-messaging/listener/build.gradle create mode 100644 member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightAccusedEventMessageListener.java create mode 100644 member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightCreatedEventMessageListener.java create mode 100644 member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightDeletedEventMessageListener.java create mode 100644 member-service/member-messaging/listener/src/test/java/com/project/imdang/member/messaging/listener/ListenerApplicationTests.java create mode 100644 member-service/member-messaging/message/build.gradle create mode 100644 member-service/member-messaging/publisher/build.gradle rename member-service/member-persistence/src/main/java/com/project/imdang/member/{service => }/persistence/adapter/MemberRepositoryImpl.java (79%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/AppleApiClientHandler.java (88%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/AppleLoginResponse.java (76%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/AppleTokenResponse.java (90%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/GoogleApiClientHandler.java (79%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/GoogleLoginResponse.java (83%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/GoogleTokenResponse.java (91%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/KaKaoApiClientHandler.java (77%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/KakaoLoginResponse.java (85%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/KakaoTokenResponse.java (90%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/KakaoWithdrawResponse.java (69%) rename member-service/{member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth => member-persistence/src/main/java/com/project/imdang/member/persistence/client}/MockApiClientHandler.java (74%) create mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/configuration/RestTemplateConfiguration.java rename member-service/member-persistence/src/main/java/com/project/imdang/member/{service => }/persistence/entity/MemberEntity.java (75%) rename member-service/member-persistence/src/main/java/com/project/imdang/member/{service => }/persistence/mapper/MemberPersistenceMapper.java (74%) rename {common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/jwt => member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/provider}/JwtTokenProvider.java (83%) rename member-service/member-persistence/src/main/java/com/project/imdang/member/{service => }/persistence/repository/MemberJpaRepository.java (68%) delete mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/CouponRepositoryImpl.java delete mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/MemberCouponRepositoryImpl.java delete mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/CouponEntity.java delete mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/MemberCouponEntity.java delete mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/CouponPersistenceMapper.java delete mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/MemberCouponPersistenceMapper.java delete mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/CouponJpaRepository.java delete mode 100644 member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/MemberCouponJpaRepository.java create mode 100644 member-service/member-service-client/build.gradle create mode 100644 member-service/member-service-client/member-service-client-api-impl/build.gradle rename {infrastructure/feign/src/main/java/com/project/imdang/feign => member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client}/MemberFeignClient.java (55%) create mode 100644 member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java create mode 100644 member-service/member-service-client/member-service-client-api/build.gradle rename infrastructure/feign/src/main/java/com/project/imdang/feign/MemberInfoResponse.java => member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/MemberData.java (76%) create mode 100644 member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/MemberDataResolver.java create mode 100644 member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/exception/MemberNotFoundException.java create mode 100644 member-service/member-service-client/member-service-client-api/src/test/java/com/project/imdang/MemberServiceClientApiApplicationTests.java rename insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/delete/DeleteInsightResponse.java => setting-service/setting-application/src/main/java/com/project/imdang/setting/application/dto/AgreeTermsRequest.java (59%) rename setting-service/setting-application/src/main/java/com/project/imdang/setting/{service => }/application/rest/NotificationController.java (62%) rename setting-service/setting-application/src/main/java/com/project/imdang/setting/{service => }/application/rest/TermsController.java (58%) delete mode 100644 setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/exception/handler/GlobalExceptionHandler.java delete mode 100644 setting-service/setting-application/src/main/resources/application.properties delete mode 100644 setting-service/setting-container/build.gradle delete mode 100644 setting-service/setting-container/src/main/java/com/project/imdang/setting/service/BeanConfiguration.java delete mode 100644 setting-service/setting-container/src/main/java/com/project/imdang/setting/service/FcmConfiguration.java delete mode 100644 setting-service/setting-container/src/main/java/com/project/imdang/setting/service/SettingServiceApplication.java delete mode 100644 setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/NotificationControllerTest.java delete mode 100644 setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/TermsControllerTest.java delete mode 100644 setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/TestConfiguration.java rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/NotificationApplicationServiceImpl.java (61%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/TermsApplicationServiceImpl.java (57%) rename {common/common-application/src/main/java/com/project/imdang/application => setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain}/configuration/ObjectMapperConfiguration.java (86%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/dto/AgreeTermsCommand.java (53%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/dto/CreateNotificationCommand.java (61%) create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/ListNotificationQuery.java rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service/domain/dto/PushNotificationRequest.java => domain/dto/NotificationResult.java} (52%) create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/TermsResult.java rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/handler/AgreeTermsCommandHandler.java (62%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/handler/CheckNewNotificationCommandHandler.java (75%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/handler/CreateNotificationCommandHandler.java (69%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/handler/ListNotificationCommandHandler.java (61%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/handler/ListTermsCommandHandler.java (59%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/handler/UpdateNotificationAsCheckedHandler.java (80%) rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/mapper/NotificationDataMapper.java (56%) create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/mapper/TermsDataMapper.java create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/listener/SendNotificationListener.java create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/service/NotificationApplicationService.java create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/service/TermsApplicationService.java rename setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/{service => }/domain/ports/output/repository/NotificationRepository.java (71%) create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/TermsAgreementRepository.java create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/TermsRepository.java create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/sender/NotificationRequest.java create mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/sender/NotificationSender.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/SendNotificationListener.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/FcmTokenResponse.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/ListNotificationQuery.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/NotificationResponse.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/TermsResponse.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/exception/SettingApplicationServiceException.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/SendNotificationHandler.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/mapper/TermsDataMapper.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/input/service/NotificationApplicationService.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/input/service/TermsApplicationService.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/lookup/SettingMemberLookup.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/TermsAgreementRepository.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/TermsRepository.java delete mode 100644 setting-service/setting-domain/setting-application-service/src/main/resources/application.properties create mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/NotificationDomainService.java rename setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/{service => }/domain/NotificationDomainServiceImpl.java (75%) create mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/TermsDomainService.java rename setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/{service => }/domain/TermsDomainServiceImpl.java (64%) rename setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/{service => }/domain/entity/Notification.java (76%) rename setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/{service => }/domain/entity/Terms.java (71%) rename setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/{service => }/domain/entity/TermsAgreement.java (71%) rename setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/{service => }/domain/event/NotificationCreatedEvent.java (65%) create mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/event/NotificationEvent.java rename setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/{service => }/domain/exception/NotificationDomainException.java (69%) delete mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/NotificationDomainService.java delete mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/TermsDomainService.java delete mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/event/NotificationEvent.java delete mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/MemberInfo.java delete mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/NotificationCategory.java delete mode 100644 setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/TermsId.java delete mode 100644 setting-service/setting-domain/setting-domain-core/src/main/resources/application.properties rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/adapter/NotificationRepositoryImpl.java (75%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/adapter/TermsAgreementRepositoryImpl.java (60%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/adapter/TermsRepositoryImpl.java (60%) create mode 100644 setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/configuration/FcmConfiguration.java rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/entity/NotificationEntity.java (88%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/entity/TermsAgreementEntity.java (93%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/entity/TermsEntity.java (91%) rename setting-service/{setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain => setting-persistence/src/main/java/com/project/imdang/setting/persistence}/exception/FirebaseException.java (56%) create mode 100644 setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/fcm/FcmNotificationSender.java rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/mapper/NotificationPersistenceMapper.java (78%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/mapper/TermsAgreementPersistenceMapper.java (71%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/mapper/TermsPersistenceMapper.java (73%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/repository/NotificationJpaRepository.java (81%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/repository/TermsAgreementJpaRepository.java (60%) rename setting-service/setting-persistence/src/main/java/com/project/imdang/setting/{service => }/persistence/repository/TermsJpaRepository.java (59%) delete mode 100644 setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/SettingMemberLookupImpl.java delete mode 100644 setting-service/setting-persistence/src/main/resources/application.properties create mode 100644 test.puml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 80abb87b..02c0df7c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,6 +16,7 @@ env: AWS_CODE_DEPLOY_GROUP_RELEASE: imdang-release-deploy jobs: + # develop 브랜치 deploy-develop: if: github.ref == 'refs/heads/develop' runs-on: ubuntu-latest @@ -57,10 +58,26 @@ jobs: - name: Build and Test run: ./gradlew imdang-container:clean imdang-container:assemble + - name: Build Batch Module + run: ./gradlew batch:clean batch:assemble + # 빌드 파일을 zip 형식으로 압축 - S3에서는 jar 저장이 안되기 때문에 zip으로 생성 +# - name: Make zip file +# run: zip -r ./$GITHUB_SHA.zip . +# shell: bash + + # backend(root)/ + # -- imdang-container/ + # ---- build/libs/imdang-container.jar + # -- batch/ + # ---- build/libs/batch.jar + # -- build.gradle + # -- .github/workflows/main.yml - name: Make zip file - run: zip -r ./$GITHUB_SHA.zip . - shell: bash + run: | + mkdir deploy + cp imdang-container/build/libs/*.jar deploy/ + cp batch/build/libs/*.jar # AWS 권한 - name: AWS credential 설정 @@ -78,6 +95,7 @@ jobs: - name: EC2에 배포 run: aws deploy create-deployment --application-name ${{ env.AWS_CODE_DEPLOY_APPLICATION }} --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name ${{ env.AWS_CODE_DEPLOY_GROUP }} --s3-location bucket=$AWS_S3_BUCKET,key=$GITHUB_SHA.zip,bundleType=zip + # release 브랜치 deploy-release: if: github.ref == 'refs/heads/release' runs-on: ubuntu-latest diff --git a/README.md b/README.md index 6e2e6212..ba3e7607 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,80 @@ -# Backend -- Java, Spring Boot, MySQL, JPA - -### 규칙 -- 커밋 컨벤션 -- 깃 브랜치 전략 -- 코드 컨벤션 -- 서버 아키텍처 - -### 기술 문서 -- CI/CD 파이프라인 구축 -- ERD -- 시스템 아키텍처 - -### 개선 필요 -- 자주 조회되는 인사이트에 대해 캐싱 적용 -- 알림(notification) 조회 시 is_checked를 true로 변경할 때 일괄 바꾸는 것이 성능 측면에서 더 좋을 것이다. 헥사고날 아키텍처에서 어떻게 효과적으로 구현할 수 있을까? +# 아파트임당(Imdang) + +## 1. 프로젝트 개요 (Overview) +- 임장 후기 공유 플랫폼 +[Link] + +### # 주요 기능 +- 인사이트 등록/수정 +- 인사이트 교환(교환 요청/수락/거절) + +## 2. 시스템 아키텍처 (System Architecture) +### # 개요 +- Hexagonal Architecture 기반 설계 (참고: https://github.com/agelenler/food-ordering-system) + - 레이어 모듈화 + ```text + |-- insight-application-service + |-- insight-application-messaging + |-- insight-domain + |- infra + ``` + - Inbound Adapter (외부 → 시스템) + - Application Layer + - API 요청이 들어오는 레이어 + - `@RestController` + - Messaging Layer + - 메시지 브로커나 이벤트 시스템과의 연동 + - `@KafkaListener` + - `@EventListener` + - `@Scheduled` + - Application Service : usecase 수행 + - Domain Application Layer + - Application Service Layer : Use Case 정의, 도메인 로직 호출 + - Domain Core Layer : 도메인 로직을 담당 + - Outbound Adapter (시스템 → 외부) + - Persistence Layer : 외부 데이터베이스 등과 통신 (Output) + - `FeignClient` + - `RestTemplate` + - `KafkaTemplate` + - `JpaRepository` + - dependency : Application/Persistence → Domain Application → Domain Core + - 역참조 방지 +- 주요 기술 스택 + - Backend: Spring Boot, Java 17, JPA, ~~Kafka, Redis,~~ Spring Batch + - Database: MySQL + - CI/CD: Github Actions, ~~Docker~~ + - Frontend: AOS, IOS + - Infrastructure: AWS(EC2, RDS, S3, CodeDeploy) + - ~~Load Test: Locust~~ + - 오픈 소스 부하 테스트 도구 + - 사용자가 Python으로 시나리오를 작성하여 웹 애플리케이션의 성능을 측정 + - ~~Monitoring~~ + +## 3. 모듈 구조 및 도메인 모델링 +### # backend(rootProject) + +### # insight-service +- 인사이트 관련 서비스 +- `Insight` +### # member-service +- `Member` +### # setting-service +- 알림 관련 서비스 +- `Notification` +### ~~# admin-service~~ +### # common +- 각 모듈에서 공통적으로 사용하는 클래스 모음 +### # batch +### # infrastructure + +## 4. 데이터베이스 설계 (Database Design, ERD) + +## 5. 기능 정의 (Feature Specification) + +## 6. CI/CD +- 빌드, 서버 배포 자동화 +- `.github/workflows/main.yml` + - `develop` 혹은 `release` 브랜치에 코드 push + - 프로젝트 빌드 + - AWS S3에 zip으로 업로드 + - AWS CodeDeploy를 통해 EC2에 배포 diff --git a/TEST.md b/TEST.md new file mode 100644 index 00000000..fe33d3f9 --- /dev/null +++ b/TEST.md @@ -0,0 +1,48 @@ +# 성능 테스트 + +### 성능 지표 +#### 1. 처리량(Throughput) +- 시스템 측면의 성능을 평가하는 KPI + +##### # TPS(Transactions per Seconds) +- 단위 시간당 대상 시스템에서 처리되고 있는 요청 건수 +- 초당 발생하는 Business Transaction + +#### 2. 응답시간(Response Time) +- 사용자 측면에서의 성능을 평가하는 KPI +- 사용자가 해당 업무를 요청한 시점부터 서버로부터 그 결과에 대한 응답을 받아서 사용자 화면에 디스플레이할 때까지 소요된 총 시간 + ```text + Response Time = Client Time + Network Time + Server Processing + Sending Time + ``` +### 처리량과 응답시간의 상관 관계 +- 부하가 증가할수록 (사용자의 요청이 증가할수록) 어느 수준까지는 처리량이 선형적으로 증가한다. +- 그러나, 어느 시점에 이르면 처리량이 더 이상 증가하지 않고 일정한 수준을 유지하게 되는데, 이 변곡점을 포화점/임계점이라고 한다. + +```text +spring: + datasource: + hikari: + minimum-idle: 10 + maximum-pool-size: 10 + idle-timeout: 30000 + connection-timeout: 20000 +``` +* minimum-idle + - 최소 유휴 커넥션 수 + - 초기 설정 시 최소한의 커넥션만 유지 + - TPS가 낮을 때 리소스 절약 가능 + +* maximum-pool-size + - 커넥션 풀의 최대 크기 + - TPS가 높아질 때 최대 N개의 커넥션까지 생성해서 요청을 처리 + +* idle-timeout + - 지정된 시간(ms)동안 유휴 상태인 커넥션이 있을 경우 풀에서 제거 + - 트래픽이 낮아질 때 자동으로 풀 크기를 줄이는 데 기여 + +* connection-timeout + - 커넥션을 얻기 위해 대기하는 최대 시간 + - 해당 시간 내에 커넥션을 확보하지 못하면 예외가 발생 + + + - diff --git a/batch/.gitattributes b/batch/.gitattributes new file mode 100644 index 00000000..8af972cd --- /dev/null +++ b/batch/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/batch/.gitignore b/batch/.gitignore new file mode 100644 index 00000000..c2065bc2 --- /dev/null +++ b/batch/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/batch/build.gradle b/batch/build.gradle new file mode 100644 index 00000000..06a9f8f6 --- /dev/null +++ b/batch/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.3.4' + id 'io.spring.dependency-management' version '1.1.6' +} + +bootJar { + enabled = true +} +jar { + enabled = false +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-batch' +// implementation 'org.springframework.boot:spring-boot-starter-quartz' + runtimeOnly 'com.mysql:mysql-connector-j' + +// testRuntimeOnly 'com.h2database:h2:2.1.214' +} + +tasks.named('bootJar') { + mainClass.set('com.project.imdang.BatchApplication') +} diff --git a/batch/gradle/wrapper/gradle-wrapper.jar b/batch/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9bbc975c742b298b441bfb90dbc124400a3751b9 GIT binary patch literal 43705 zcma&Obx`DOvL%eWOXJW;V64viP??$)@wHcsJ68)>bJS6*&iHnskXE8MjvIPVl|FrmV}Npeql07fCw6`pw`0s zGauF(<*@v{3t!qoUU*=j)6;|-(yg@jvDx&fV^trtZt27?4Tkn729qrItVh@PMwG5$ z+oXHSPM??iHZ!cVP~gYact-CwV`}~Q+R}PPNRy+T-geK+>fHrijpllon_F4N{@b-} z1M0=a!VbVmJM8Xk@NRv)m&aRYN}FSJ{LS;}2ArQ5baSjfy40l@T5)1r-^0fAU6f_} zzScst%$Nd-^ElV~H0TetQhMc%S{}Q4lssln=|;LG?Ulo}*mhg8YvBAUY7YFdXs~vv zv~{duzVw%C#GxkBwX=TYp1Dh*Uaum2?RmsvPaLlzO^fIJ`L?&OV?Y&kKj~^kWC`Ly zfL-}J^4a0Ojuz9O{jUbIS;^JatJ5+YNNHe}6nG9Yd6P-lJiK2ms)A^xq^H2fKrTF) zp!6=`Ece~57>^9(RA4OB9;f1FAhV%zVss%#rDq$9ZW3N2cXC7dMz;|UcRFecBm`DA z1pCO!#6zKp#@mx{2>Qcme8y$Qg_gnA%(`Vtg3ccwgb~D(&@y8#Jg8nNYW*-P{_M#E zZ|wCsQoO1(iIKd-2B9xzI}?l#Q@G5d$m1Lfh0q;iS5FDQ&9_2X-H)VDKA*fa{b(sV zL--krNCXibi1+*C2;4qVjb0KWUVGjjRT{A}Q*!cFmj0tRip2ra>WYJ>ZK4C|V~RYs z6;~+*)5F^x^aQqk9tjh)L;DOLlD8j+0<>kHc8MN|68PxQV`tJFbgxSfq-}b(_h`luA0&;Vk<@51i0 z_cu6{_*=vlvYbKjDawLw+t^H?OV00_73Cn3goU5?})UYFuoSX6Xqw;TKcrsc|r# z$sMWYl@cs#SVopO$hpHZ)cdU-+Ui%z&Sa#lMI~zWW@vE%QDh@bTe0&V9nL>4Et9`N zGT8(X{l@A~loDx}BDz`m6@tLv@$mTlVJ;4MGuj!;9Y=%;;_kj#o8n5tX%@M)2I@}u z_{I!^7N1BxW9`g&Z+K#lZ@7_dXdsqp{W9_`)zgZ=sD~%WS5s$`7z#XR!Lfy(4se(m zR@a3twgMs19!-c4jh`PfpJOSU;vShBKD|I0@rmv_x|+ogqslnLLOepJpPMOxhRb*i zGHkwf#?ylQ@k9QJL?!}MY4i7joSzMcEhrDKJH&?2v{-tgCqJe+Y0njl7HYff z{&~M;JUXVR$qM1FPucIEY(IBAuCHC@^~QG6O!dAjzQBxDOR~lJEr4KS9R*idQ^p{D zS#%NQADGbAH~6wAt}(1=Uff-1O#ITe)31zCL$e9~{w)gx)g>?zFE{Bc9nJT6xR!i8 z)l)~9&~zSZTHk{?iQL^MQo$wLi}`B*qnvUy+Y*jEraZMnEhuj`Fu+>b5xD1_Tp z)8|wedv42#3AZUL7x&G@p@&zcUvPkvg=YJS6?1B7ZEXr4b>M+9Gli$gK-Sgh{O@>q7TUg+H zNJj`6q#O@>4HpPJEHvNij`sYW&u%#=215HKNg;C!0#hH1vlO5+dFq9& zS)8{5_%hz?#D#wn&nm@aB?1_|@kpA@{%jYcs{K%$a4W{k@F zPyTav?jb;F(|GaZhm6&M#g|`ckO+|mCtAU)5_(hn&Ogd z9Ku}orOMu@K^Ac>eRh3+0-y^F`j^noa*OkS3p^tLV`TY$F$cPXZJ48!xz1d7%vfA( zUx2+sDPqHfiD-_wJDb38K^LtpN2B0w=$A10z%F9f_P2aDX63w7zDG5CekVQJGy18I zB!tI`6rZr7TK10L(8bpiaQ>S@b7r_u@lh^vakd0e6USWw7W%d_Ob%M!a`K>#I3r-w zo2^+9Y)Sb?P9)x0iA#^ns+Kp{JFF|$09jb6ZS2}_<-=$?^#IUo5;g`4ICZknr!_aJ zd73%QP^e-$%Xjt|28xM}ftD|V@76V_qvNu#?Mt*A-OV{E4_zC4Ymo|(cb+w^`Wv== z>)c%_U0w`d$^`lZQp@midD89ta_qTJW~5lRrIVwjRG_9aRiQGug%f3p@;*%Y@J5uQ|#dJ+P{Omc`d2VR)DXM*=ukjVqIpkb<9gn9{*+&#p)Ek zN=4zwNWHF~=GqcLkd!q0p(S2_K=Q`$whZ}r@ec_cb9hhg9a z6CE=1n8Q;hC?;ujo0numJBSYY6)GTq^=kB~`-qE*h%*V6-ip=c4+Yqs*7C@@b4YAi zuLjsmD!5M7r7d5ZPe>4$;iv|zq=9=;B$lI|xuAJwi~j~^Wuv!Qj2iEPWjh9Z&#+G>lZQpZ@(xfBrhc{rlLwOC;optJZDj4Xfu3$u6rt_=YY0~lxoy~fq=*L_&RmD7dZWBUmY&12S;(Ui^y zBpHR0?Gk|`U&CooNm_(kkO~pK+cC%uVh^cnNn)MZjF@l{_bvn4`Jc}8QwC5_)k$zs zM2qW1Zda%bIgY^3NcfL)9ug`05r5c%8ck)J6{fluBQhVE>h+IA&Kb}~$55m-^c1S3 zJMXGlOk+01qTQUFlh5Jc3xq|7McY$nCs$5=`8Y;|il#Ypb{O9}GJZD8!kYh{TKqs@ z-mQn1K4q$yGeyMcryHQgD6Ra<6^5V(>6_qg`3uxbl|T&cJVA*M_+OC#>w(xL`RoPQ zf1ZCI3G%;o-x>RzO!mc}K!XX{1rih0$~9XeczHgHdPfL}4IPi~5EV#ZcT9 zdgkB3+NPbybS-d;{8%bZW^U+x@Ak+uw;a5JrZH!WbNvl!b~r4*vs#he^bqz`W93PkZna2oYO9dBrKh2QCWt{dGOw)%Su%1bIjtp4dKjZ^ zWfhb$M0MQiDa4)9rkip9DaH0_tv=XxNm>6MKeWv>`KNk@QVkp$Lhq_~>M6S$oliq2 zU6i7bK;TY)m>-}X7hDTie>cc$J|`*}t=MAMfWIALRh2=O{L57{#fA_9LMnrV(HrN6 zG0K_P5^#$eKt{J|#l~U0WN_3)p^LLY(XEqes0OvI?3)GTNY&S13X+9`6PLVFRf8K) z9x@c|2T72+-KOm|kZ@j4EDDec>03FdgQlJ!&FbUQQH+nU^=U3Jyrgu97&#-W4C*;_ z(WacjhBDp@&Yon<9(BWPb;Q?Kc0gR5ZH~aRNkPAWbDY!FiYVSu!~Ss^9067|JCrZk z-{Rn2KEBR|Wti_iy) zXnh2wiU5Yz2L!W{{_#LwNWXeNPHkF=jjXmHC@n*oiz zIoM~Wvo^T@@t!QQW?Ujql-GBOlnB|HjN@x~K8z)c(X}%%5Zcux09vC8=@tvgY>czq z3D(U&FiETaN9aP}FDP3ZSIXIffq>M3{~eTB{uauL07oYiM=~K(XA{SN!rJLyXeC+Y zOdeebgHOc2aCIgC=8>-Q>zfuXV*=a&gp{l#E@K|{qft@YtO>xaF>O7sZz%8);e86? z+jJlFB{0fu6%8ew^_<+v>>%6eB8|t*_v7gb{x=vLLQYJKo;p7^o9!9A1)fZZ8i#ZU z<|E?bZakjkEV8xGi?n+{Xh3EgFKdM^;4D;5fHmc04PI>6oU>>WuLy6jgpPhf8$K4M zjJo*MbN0rZbZ!5DmoC^@hbqXiP^1l7I5;Wtp2i9Jkh+KtDJoXP0O8qmN;Sp(+%upX zAxXs*qlr(ck+-QG_mMx?hQNXVV~LT{$Q$ShX+&x?Q7v z@8t|UDylH6@RZ?WsMVd3B0z5zf50BP6U<&X_}+y3uJ0c5OD}+J&2T8}A%2Hu#Nt_4 zoOoTI$A!hQ<2pk5wfZDv+7Z{yo+Etqry=$!*pvYyS+kA4xnJ~3b~TBmA8Qd){w_bE zqDaLIjnU8m$wG#&T!}{e0qmHHipA{$j`%KN{&#_Kmjd&#X-hQN+ju$5Ms$iHj4r?) z&5m8tI}L$ih&95AjQ9EDfPKSmMj-@j?Q+h~C3<|Lg2zVtfKz=ft{YaQ1i6Om&EMll zzov%MsjSg=u^%EfnO+W}@)O6u0LwoX709h3Cxdc2Rwgjd%LLTChQvHZ+y<1q6kbJXj3_pq1&MBE{8 zd;aFotyW>4WHB{JSD8Z9M@jBitC1RF;!B8;Rf-B4nOiVbGlh9w51(8WjL&e{_iXN( zAvuMDIm_>L?rJPxc>S`bqC|W$njA0MKWa?V$u6mN@PLKYqak!bR!b%c^ze(M`ec(x zv500337YCT4gO3+9>oVIJLv$pkf`01S(DUM+4u!HQob|IFHJHm#>eb#eB1X5;bMc| z>QA4Zv}$S?fWg~31?Lr(C>MKhZg>gplRm`2WZ--iw%&&YlneQYY|PXl;_4*>vkp;I z$VYTZq|B*(3(y17#@ud@o)XUZPYN*rStQg5U1Sm2gM}7hf_G<>*T%6ebK*tF(kbJc zNPH4*xMnJNgw!ff{YXrhL&V$6`ylY={qT_xg9znQWw9>PlG~IbhnpsG_94Kk_(V-o&v7#F znra%uD-}KOX2dkak**hJnZZQyp#ERyyV^lNe!Qrg=VHiyr7*%j#PMvZMuYNE8o;JM zGrnDWmGGy)(UX{rLzJ*QEBd(VwMBXnJ@>*F8eOFy|FK*Vi0tYDw;#E zu#6eS;%Nm2KY+7dHGT3m{TM7sl=z8|V0e!DzEkY-RG8vTWDdSQFE|?+&FYA146@|y zV(JP>LWL;TSL6rao@W5fWqM1-xr$gRci#RQV2DX-x4@`w{uEUgoH4G|`J%H!N?*Qn zy~rjzuf(E7E!A9R2bSF|{{U(zO+;e29K_dGmC^p7MCP!=Bzq@}&AdF5=rtCwka zTT1A?5o}i*sXCsRXBt)`?nOL$zxuP3i*rm3Gmbmr6}9HCLvL*45d|(zP;q&(v%}S5yBmRVdYQQ24zh z6qL2<2>StU$_Ft29IyF!6=!@;tW=o8vNzVy*hh}XhZhUbxa&;9~woye<_YmkUZ)S?PW{7t; zmr%({tBlRLx=ffLd60`e{PQR3NUniWN2W^~7Sy~MPJ>A#!6PLnlw7O0(`=PgA}JLZ ztqhiNcKvobCcBel2 z-N82?4-()eGOisnWcQ9Wp23|ybG?*g!2j#>m3~0__IX1o%dG4b;VF@^B+mRgKx|ij zWr5G4jiRy}5n*(qu!W`y54Y*t8g`$YrjSunUmOsqykYB4-D(*(A~?QpuFWh;)A;5= zPl|=x+-w&H9B7EZGjUMqXT}MkcSfF}bHeRFLttu!vHD{Aq)3HVhvtZY^&-lxYb2%` zDXk7>V#WzPfJs6u{?ZhXpsMdm3kZscOc<^P&e&684Rc1-d=+=VOB)NR;{?0NjTl~D z1MXak$#X4{VNJyD$b;U~Q@;zlGoPc@ny!u7Pe;N2l4;i8Q=8>R3H{>HU(z z%hV2?rSinAg6&wuv1DmXok`5@a3@H0BrqsF~L$pRYHNEXXuRIWom0l zR9hrZpn1LoYc+G@q@VsFyMDNX;>_Vf%4>6$Y@j;KSK#g)TZRmjJxB!_NmUMTY(cAV zmewn7H{z`M3^Z& z2O$pWlDuZHAQJ{xjA}B;fuojAj8WxhO}_9>qd0|p0nBXS6IIRMX|8Qa!YDD{9NYYK z%JZrk2!Ss(Ra@NRW<7U#%8SZdWMFDU@;q<}%F{|6n#Y|?FaBgV$7!@|=NSVoxlJI4G-G(rn}bh|?mKkaBF$-Yr zA;t0r?^5Nz;u6gwxURapQ0$(-su(S+24Ffmx-aP(@8d>GhMtC5x*iEXIKthE*mk$` zOj!Uri|EAb4>03C1xaC#(q_I<;t}U7;1JqISVHz3tO{) zD(Yu@=>I9FDmDtUiWt81;BeaU{_=es^#QI7>uYl@e$$lGeZ~Q(f$?^3>$<<{n`Bn$ zn8bamZlL@6r^RZHV_c5WV7m2(G6X|OI!+04eAnNA5=0v1Z3lxml2#p~Zo57ri;4>;#16sSXXEK#QlH>=b$inEH0`G#<_ zvp;{+iY)BgX$R!`HmB{S&1TrS=V;*5SB$7*&%4rf_2wQS2ed2E%Wtz@y$4ecq4w<) z-?1vz_&u>s?BMrCQG6t9;t&gvYz;@K@$k!Zi=`tgpw*v-#U1Pxy%S9%52`uf$XMv~ zU}7FR5L4F<#9i%$P=t29nX9VBVv)-y7S$ZW;gmMVBvT$BT8d}B#XV^@;wXErJ-W2A zA=JftQRL>vNO(!n4mcd3O27bHYZD!a0kI)6b4hzzL9)l-OqWn)a~{VP;=Uo|D~?AY z#8grAAASNOkFMbRDdlqVUfB;GIS-B-_YXNlT_8~a|LvRMVXf!<^uy;)d$^OR(u)!) zHHH=FqJF-*BXif9uP~`SXlt0pYx|W&7jQnCbjy|8b-i>NWb@!6bx;1L&$v&+!%9BZ z0nN-l`&}xvv|wwxmC-ZmoFT_B#BzgQZxtm|4N+|;+(YW&Jtj^g!)iqPG++Z%x0LmqnF875%Ry&2QcCamx!T@FgE@H zN39P6e#I5y6Yl&K4eUP{^biV`u9{&CiCG#U6xgGRQr)zew;Z%x+ z-gC>y%gvx|dM=OrO`N@P+h2klPtbYvjS!mNnk4yE0+I&YrSRi?F^plh}hIp_+OKd#o7ID;b;%*c0ES z!J))9D&YufGIvNVwT|qsGWiZAwFODugFQ$VsNS%gMi8OJ#i${a4!E3<-4Jj<9SdSY z&xe|D0V1c`dZv+$8>(}RE|zL{E3 z-$5Anhp#7}oO(xm#}tF+W=KE*3(xxKxhBt-uuJP}`_K#0A< zE%rhMg?=b$ot^i@BhE3&)bNBpt1V*O`g?8hhcsV-n#=|9wGCOYt8`^#T&H7{U`yt2 z{l9Xl5CVsE=`)w4A^%PbIR6uG_5Ww9k`=q<@t9Bu662;o{8PTjDBzzbY#tL;$wrpjONqZ{^Ds4oanFm~uyPm#y1Ll3(H57YDWk9TlC zq;kebC!e=`FU&q2ojmz~GeLxaJHfs0#F%c(i+~gg$#$XOHIi@1mA72g2pFEdZSvp}m0zgQb5u2?tSRp#oo!bp`FP}< zaK4iuMpH+Jg{bb7n9N6eR*NZfgL7QiLxI zk6{uKr>xxJ42sR%bJ%m8QgrL|fzo9@?9eQiMW8O`j3teoO_R8cXPe_XiLnlYkE3U4 zN!^F)Z4ZWcA8gekEPLtFqX-Q~)te`LZnJK_pgdKs)Dp50 zdUq)JjlJeELskKg^6KY!sIou-HUnSFRsqG^lsHuRs`Z{f(Ti9eyd3cwu*Kxp?Ws7l z3cN>hGPXTnQK@qBgqz(n*qdJ2wbafELi?b90fK~+#XIkFGU4+HihnWq;{{)1J zv*Txl@GlnIMOjzjA1z%g?GsB2(6Zb-8fooT*8b0KF2CdsIw}~Hir$d3TdVHRx1m3c z4C3#h@1Xi@{t4zge-#B6jo*ChO%s-R%+9%-E|y<*4;L>$766RiygaLR?X%izyqMXA zb|N=Z-0PSFeH;W6aQ3(5VZWVC>5Ibgi&cj*c%_3=o#VyUJv* zM&bjyFOzlaFq;ZW(q?|yyi|_zS%oIuH^T*MZ6NNXBj;&yM3eQ7!CqXY?`7+*+GN47 zNR#%*ZH<^x{(0@hS8l{seisY~IE*)BD+R6^OJX}<2HRzo^fC$n>#yTOAZbk4%=Bei=JEe=o$jm`or0YDw*G?d> z=i$eEL7^}_?UI^9$;1Tn9b>$KOM@NAnvWrcru)r`?LodV%lz55O3y(%FqN;cKgj7t zlJ7BmLTQ*NDX#uelGbCY>k+&H*iSK?x-{w;f5G%%!^e4QT9z<_0vHbXW^MLR} zeC*jezrU|{*_F`I0mi)9=sUj^G03i@MjXx@ePv@(Udt2CCXVOJhRh4yp~fpn>ssHZ z?k(C>2uOMWKW5FVsBo#Nk!oqYbL`?#i~#!{3w^qmCto05uS|hKkT+iPrC-}hU_nbL zO622#mJupB21nChpime}&M1+whF2XM?prT-Vv)|EjWYK(yGYwJLRRMCkx;nMSpu?0 zNwa*{0n+Yg6=SR3-S&;vq=-lRqN`s9~#)OOaIcy3GZ&~l4g@2h| zThAN#=dh{3UN7Xil;nb8@%)wx5t!l z0RSe_yJQ+_y#qEYy$B)m2yDlul^|m9V2Ia$1CKi6Q19~GTbzqk*{y4;ew=_B4V8zw zScDH&QedBl&M*-S+bH}@IZUSkUfleyM45G>CnYY{hx8J9q}ME?Iv%XK`#DJRNmAYt zk2uY?A*uyBA=nlYjkcNPMGi*552=*Q>%l?gDK_XYh*Rya_c)ve{=ps`QYE0n!n!)_$TrGi_}J|>1v}(VE7I~aP-wns#?>Y zu+O7`5kq32zM4mAQpJ50vJsUDT_^s&^k-llQMy9!@wRnxw@~kXV6{;z_wLu3i=F3m z&eVsJmuauY)8(<=pNUM5!!fQ4uA6hBkJoElL1asWNkYE#qaP?a+biwWw~vB48PRS7 zY;DSHvgbIB$)!uJU)xA!yLE*kP0owzYo`v@wfdux#~f!dv#uNc_$SF@Qq9#3q5R zfuQnPPN_(z;#X#nRHTV>TWL_Q%}5N-a=PhkQ^GL+$=QYfoDr2JO-zo#j;mCsZVUQ) zJ96e^OqdLW6b-T@CW@eQg)EgIS9*k`xr$1yDa1NWqQ|gF^2pn#dP}3NjfRYx$pTrb zwGrf8=bQAjXx*8?du*?rlH2x~^pXjiEmj^XwQo{`NMonBN=Q@Y21!H)D( zA~%|VhiTjaRQ%|#Q9d*K4j~JDXOa4wmHb0L)hn*;Eq#*GI}@#ux4}bt+olS(M4$>c z=v8x74V_5~xH$sP+LZCTrMxi)VC%(Dg!2)KvW|Wwj@pwmH6%8zd*x0rUUe$e(Z%AW z@Q{4LL9#(A-9QaY2*+q8Yq2P`pbk3!V3mJkh3uH~uN)+p?67d(r|Vo0CebgR#u}i? zBxa^w%U|7QytN%L9bKaeYhwdg7(z=AoMeP0)M3XZA)NnyqL%D_x-(jXp&tp*`%Qsx z6}=lGr;^m1<{;e=QQZ!FNxvLcvJVGPkJ63at5%*`W?46!6|5FHYV0qhizSMT>Zoe8 zsJ48kb2@=*txGRe;?~KhZgr-ZZ&c0rNV7eK+h$I-UvQ=552@psVrvj#Ys@EU4p8`3 zsNqJu-o=#@9N!Pq`}<=|((u)>^r0k^*%r<{YTMm+mOPL>EoSREuQc-e2~C#ZQ&Xve zZ}OUzmE4{N-7cqhJiUoO_V#(nHX11fdfVZJT>|6CJGX5RQ+Ng$Nq9xs-C86-)~`>p zW--X53J`O~vS{WWjsAuGq{K#8f#2iz` zzSSNIf6;?5sXrHig%X(}0q^Y=eYwvh{TWK-fT>($8Ex>!vo_oGFw#ncr{vmERi^m7lRi%8Imph})ZopLoIWt*eFWSPuBK zu>;Pu2B#+e_W|IZ0_Q9E9(s@0>C*1ft`V{*UWz^K<0Ispxi@4umgGXW!j%7n+NC~* zBDhZ~k6sS44(G}*zg||X#9Weto;u*Ty;fP!+v*7be%cYG|yEOBomch#m8Np!Sw`L)q+T` zmrTMf2^}7j=RPwgpO9@eXfb{Q>GW#{X=+xt`AwTl!=TgYm)aS2x5*`FSUaaP_I{Xi zA#irF%G33Bw>t?^1YqX%czv|JF0+@Pzi%!KJ?z!u$A`Catug*tYPO`_Zho5iip0@! z;`rR0-|Ao!YUO3yaujlSQ+j-@*{m9dHLtve!sY1Xq_T2L3&=8N;n!!Eb8P0Z^p4PL zQDdZ?An2uzbIakOpC|d@=xEA}v-srucnX3Ym{~I#Ghl~JZU(a~Ppo9Gy1oZH&Wh%y zI=KH_s!Lm%lAY&`_KGm*Ht)j*C{-t}Nn71drvS!o|I|g>ZKjE3&Mq0TCs6}W;p>%M zQ(e!h*U~b;rsZ1OPigud>ej=&hRzs@b>>sq6@Yjhnw?M26YLnDH_Wt#*7S$-BtL08 zVyIKBm$}^vp?ILpIJetMkW1VtIc&7P3z0M|{y5gA!Yi5x4}UNz5C0Wdh02!h zNS>923}vrkzl07CX`hi)nj-B?#n?BJ2Vk0zOGsF<~{Fo7OMCN_85daxhk*pO}x_8;-h>}pcw26V6CqR-=x2vRL?GB#y%tYqi;J}kvxaz}*iFO6YO0ha6!fHU9#UI2Nv z_(`F#QU1B+P;E!t#Lb)^KaQYYSewj4L!_w$RH%@IL-M($?DV@lGj%3ZgVdHe^q>n(x zyd5PDpGbvR-&p*eU9$#e5#g3-W_Z@loCSz}f~{94>k6VRG`e5lI=SE0AJ7Z_+=nnE zTuHEW)W|a8{fJS>2TaX zuRoa=LCP~kP)kx4L+OqTjtJOtXiF=y;*eUFgCn^Y@`gtyp?n14PvWF=zhNGGsM{R- z^DsGxtoDtx+g^hZi@E2Y(msb-hm{dWiHdoQvdX88EdM>^DS#f}&kCGpPFDu*KjEpv$FZtLpeT>@)mf|z#ZWEsueeW~hF78Hu zfY9a+Gp?<)s{Poh_qdcSATV2oZJo$OH~K@QzE2kCADZ@xX(; z)0i=kcAi%nvlsYagvUp(z0>3`39iKG9WBDu3z)h38p|hLGdD+Khk394PF3qkX!02H z#rNE`T~P9vwNQ_pNe0toMCRCBHuJUmNUl)KFn6Gu2je+p>{<9^oZ4Gfb!)rLZ3CR3 z-o&b;Bh>51JOt=)$-9+Z!P}c@cKev_4F1ZZGs$I(A{*PoK!6j@ZJrAt zv2LxN#p1z2_0Ox|Q8PVblp9N${kXkpsNVa^tNWhof)8x8&VxywcJz#7&P&d8vvxn` zt75mu>yV=Dl#SuiV!^1BPh5R)`}k@Nr2+s8VGp?%Le>+fa{3&(XYi~{k{ z-u4#CgYIdhp~GxLC+_wT%I*)tm4=w;ErgmAt<5i6c~)7JD2olIaK8by{u-!tZWT#RQddptXRfEZxmfpt|@bs<*uh?Y_< zD>W09Iy4iM@@80&!e^~gj!N`3lZwosC!!ydvJtc0nH==K)v#ta_I}4Tar|;TLb|+) zSF(;=?$Z0?ZFdG6>Qz)6oPM}y1&zx_Mf`A&chb znSERvt9%wdPDBIU(07X+CY74u`J{@SSgesGy~)!Mqr#yV6$=w-dO;C`JDmv=YciTH zvcrN1kVvq|(3O)NNdth>X?ftc`W2X|FGnWV%s})+uV*bw>aoJ#0|$pIqK6K0Lw!@- z3pkPbzd`ljS=H2Bt0NYe)u+%kU%DWwWa>^vKo=lzDZHr>ruL5Ky&#q7davj-_$C6J z>V8D-XJ}0cL$8}Xud{T_{19#W5y}D9HT~$&YY-@=Th219U+#nT{tu=d|B)3K`pL53 zf7`I*|L@^dPEIDJkI3_oA9vsH7n7O}JaR{G~8 zfi$?kmKvu20(l`dV7=0S43VwVKvtF!7njv1Q{Ju#ysj=|dASq&iTE8ZTbd-iiu|2& zmll%Ee1|M?n9pf~?_tdQ<7%JA53!ulo1b^h#s|Su2S4r{TH7BRB3iIOiX5|vc^;5( zKfE1+ah18YA9o1EPT(AhBtve5(%GMbspXV)|1wf5VdvzeYt8GVGt0e*3|ELBhwRaO zE|yMhl;Bm?8Ju3-;DNnxM3Roelg`^!S%e({t)jvYtJCKPqN`LmMg^V&S z$9OIFLF$%Py~{l?#ReyMzpWixvm(n(Y^Am*#>atEZ8#YD&?>NUU=zLxOdSh0m6mL? z_twklB0SjM!3+7U^>-vV=KyQZI-6<(EZiwmNBzGy;Sjc#hQk%D;bay$v#zczt%mFCHL*817X4R;E$~N5(N$1Tv{VZh7d4mhu?HgkE>O+^-C*R@ zR0ima8PsEV*WFvz`NaB+lhX3&LUZcWWJJrG7ZjQrOWD%_jxv=)`cbCk zMgelcftZ%1-p9u!I-Zf_LLz{hcn5NRbxkWby@sj2XmYfAV?iw^0?hM<$&ZDctdC`; zsL|C-7d;w$z2Gt0@hsltNlytoPnK&$>ksr(=>!7}Vk#;)Hp)LuA7(2(Hh(y3LcxRY zim!`~j6`~B+sRBv4 z<#B{@38kH;sLB4eH2+8IPWklhd25r5j2VR}YK$lpZ%7eVF5CBr#~=kUp`i zlb+>Z%i%BJH}5dmfg1>h7U5Q(-F{1d=aHDbMv9TugohX5lq#szPAvPE|HaokMQIi_ zTcTNsO53(oX=hg2w!XA&+qP}nwr$(C)pgG8emS@Mf7m0&*kiA!wPLS`88c=aD$niJ zp?3j%NI^uy|5*MzF`k4hFbsyQZ@wu!*IY+U&&9PwumdmyfL(S0#!2RFfmtzD3m9V7 zsNOw9RQofl-XBfKBF^~~{oUVouka#r3EqRf=SnleD=r1Hm@~`y8U7R)w16fgHvK-6?-TFth)f3WlklbZh+}0 zx*}7oDF4U^1tX4^$qd%987I}g;+o0*$Gsd=J>~Uae~XY6UtbdF)J8TzJXoSrqHVC) zJ@pMgE#;zmuz?N2MIC+{&)tx=7A%$yq-{GAzyz zLzZLf=%2Jqy8wGHD;>^x57VG)sDZxU+EMfe0L{@1DtxrFOp)=zKY1i%HUf~Dro#8} zUw_Mj10K7iDsX}+fThqhb@&GI7PwONx!5z;`yLmB_92z0sBd#HiqTzDvAsTdx+%W{ z2YL#U=9r!@3pNXMp_nvximh+@HV3psUaVa-lOBekVuMf1RUd26~P*|MLouQrb}XM-bEw(UgQxMI6M&l3Nha z{MBcV=tl(b_4}oFdAo}WX$~$Mj-z70FowdoB{TN|h2BdYs?$imcj{IQpEf9q z)rzpttc0?iwopSmEoB&V!1aoZqEWEeO-MKMx(4iK7&Fhc(94c zdy}SOnSCOHX+A8q@i>gB@mQ~Anv|yiUsW!bO9hb&5JqTfDit9X6xDEz*mQEiNu$ay zwqkTV%WLat|Ar+xCOfYs0UQNM`sdsnn*zJr>5T=qOU4#Z(d90!IL76DaHIZeWKyE1 zqwN%9+~lPf2d7)vN2*Q?En?DEPcM+GQwvA<#;X3v=fqsxmjYtLJpc3)A8~*g(KqFx zZEnqqruFDnEagXUM>TC7ngwKMjc2Gx%#Ll#=N4qkOuK|;>4%=0Xl7k`E69@QJ-*Vq zk9p5!+Ek#bjuPa<@Xv7ku4uiWo|_wy)6tIr`aO!)h>m5zaMS-@{HGIXJ0UilA7*I} z?|NZ!Tp8@o-lnyde*H+@8IHME8VTQOGh96&XX3E+}OB zA>VLAGW+urF&J{H{9Gj3&u+Gyn?JAVW84_XBeGs1;mm?2SQm9^!3UE@(_FiMwgkJI zZ*caE={wMm`7>9R?z3Ewg!{PdFDrbzCmz=RF<@(yQJ_A6?PCd_MdUf5vv6G#9Mf)i#G z($OxDT~8RNZ>1R-vw|nN699a}MQN4gJE_9gA-0%>a?Q<9;f3ymgoi$OI!=aE6Elw z2I`l!qe-1J$T$X&x9Zz#;3!P$I);jdOgYY1nqny-k=4|Q4F!mkqACSN`blRji>z1` zc8M57`~1lgL+Ha%@V9_G($HFBXH%k;Swyr>EsQvg%6rNi){Tr&+NAMga2;@85531V z_h+h{jdB&-l+%aY{$oy2hQfx`d{&?#psJ78iXrhrO)McOFt-o80(W^LKM{Zw93O}m z;}G!51qE?hi=Gk2VRUL2kYOBRuAzktql%_KYF4>944&lJKfbr+uo@)hklCHkC=i)E zE*%WbWr@9zoNjumq|kT<9Hm*%&ahcQ)|TCjp@uymEU!&mqqgS;d|v)QlBsE0Jw|+^ zFi9xty2hOk?rlGYT3)Q7i4k65@$RJ-d<38o<`}3KsOR}t8sAShiVWevR8z^Si4>dS z)$&ILfZ9?H#H&lumngpj7`|rKQQ`|tmMmFR+y-9PP`;-425w+#PRKKnx7o-Rw8;}*Ctyw zKh~1oJ5+0hNZ79!1fb(t7IqD8*O1I_hM;o*V~vd_LKqu7c_thyLalEF8Y3oAV=ODv z$F_m(Z>ucO(@?+g_vZ`S9+=~Msu6W-V5I-V6h7->50nQ@+TELlpl{SIfYYNvS6T6D z`9cq=at#zEZUmTfTiM3*vUamr!OB~g$#?9$&QiwDMbSaEmciWf3O2E8?oE0ApScg38hb&iN%K+kvRt#d))-tr^ zD+%!d`i!OOE3in0Q_HzNXE!JcZ<0;cu6P_@;_TIyMZ@Wv!J z)HSXAYKE%-oBk`Ye@W3ShYu-bfCAZ}1|J16hFnLy z?Bmg2_kLhlZ*?`5R8(1%Y?{O?xT)IMv{-)VWa9#1pKH|oVRm4!lLmls=u}Lxs44@g^Zwa0Z_h>Rk<(_mHN47=Id4oba zQ-=qXGz^cNX(b*=NT0<^23+hpS&#OXzzVO@$Z2)D`@oS=#(s+eQ@+FSQcpXD@9npp zlxNC&q-PFU6|!;RiM`?o&Sj&)<4xG3#ozRyQxcW4=EE;E)wcZ&zUG*5elg;{9!j}I z9slay#_bb<)N!IKO16`n3^@w=Y%duKA-{8q``*!w9SW|SRbxcNl50{k&CsV@b`5Xg zWGZ1lX)zs_M65Yt&lO%mG0^IFxzE_CL_6$rDFc&#xX5EXEKbV8E2FOAt>Ka@e0aHQ zMBf>J$FLrCGL@$VgPKSbRkkqo>sOXmU!Yx+Dp7E3SRfT`v~!mjU3qj-*!!YjgI*^) z+*05x78FVnVwSGKr^A|FW*0B|HYgc{c;e3Ld}z4rMI7hVBKaiJRL_e$rxDW^8!nGLdJ<7ex9dFoyj|EkODflJ#Xl`j&bTO%=$v)c+gJsLK_%H3}A_} z6%rfG?a7+k7Bl(HW;wQ7BwY=YFMSR3J43?!;#~E&)-RV_L!|S%XEPYl&#`s!LcF>l zn&K8eemu&CJp2hOHJKaYU#hxEutr+O161ze&=j3w12)UKS%+LAwbjqR8sDoZHnD=m0(p62!zg zxt!Sj65S?6WPmm zL&U9c`6G}T`irf=NcOiZ!V)qhnvMNOPjVkyO2^CGJ+dKTnNAPa?!AxZEpO7yL_LkB zWpolpaDfSaO-&Uv=dj7`03^BT3_HJOAjn~X;wz-}03kNs@D^()_{*BD|0mII!J>5p z1h06PTyM#3BWzAz1FPewjtrQfvecWhkRR=^gKeFDe$rmaYAo!np6iuio3>$w?az$E zwGH|zy@OgvuXok}C)o1_&N6B3P7ZX&-yimXc1hAbXr!K&vclCL%hjVF$yHpK6i_Wa z*CMg1RAH1(EuuA01@lA$sMfe*s@9- z$jNWqM;a%d3?(>Hzp*MiOUM*?8eJ$=(0fYFis!YA;0m8s^Q=M0Hx4ai3eLn%CBm14 zOb8lfI!^UAu_RkuHmKA-8gx8Z;##oCpZV{{NlNSe<i;9!MfIN!&;JI-{|n{(A19|s z9oiGesENcLf@NN^9R0uIrgg(46r%kjR{0SbnjBqPq()wDJ@LC2{kUu_j$VR=l`#RdaRe zxx;b7bu+@IntWaV$si1_nrQpo*IWGLBhhMS13qH zTy4NpK<-3aVc;M)5v(8JeksSAGQJ%6(PXGnQ-g^GQPh|xCop?zVXlFz>42%rbP@jg z)n)% zM9anq5(R=uo4tq~W7wES$g|Ko z1iNIw@-{x@xKxSXAuTx@SEcw(%E49+JJCpT(y=d+n9PO0Gv1SmHkYbcxPgDHF}4iY zkXU4rkqkwVBz<{mcv~A0K|{zpX}aJcty9s(u-$je2&=1u(e#Q~UA{gA!f;0EAaDzdQ=}x7g(9gWrWYe~ zV98=VkHbI!5Rr;+SM;*#tOgYNlfr7;nLU~MD^jSdSpn@gYOa$TQPv+e8DyJ&>aInB zDk>JmjH=}<4H4N4z&QeFx>1VPY8GU&^1c&71T*@2#dINft%ibtY(bAm%<2YwPL?J0Mt{ z7l7BR718o5=v|jB!<7PDBafdL>?cCdVmKC;)MCOobo5edt%RTWiReAMaIU5X9h`@El0sR&Z z7Ed+FiyA+QAyWn zf7=%(8XpcS*C4^-L24TBUu%0;@s!Nzy{e95qjgkzElf0#ou`sYng<}wG1M|L? zKl6ITA1X9mt6o@S(#R3B{uwJI8O$&<3{+A?T~t>Kapx6#QJDol6%?i-{b1aRu?&9B z*W@$T*o&IQ&5Kc*4LK_)MK-f&Ys^OJ9FfE?0SDbAPd(RB)Oju#S(LK)?EVandS1qb#KR;OP|86J?;TqI%E8`vszd&-kS%&~;1Als=NaLzRNnj4q=+ zu5H#z)BDKHo1EJTC?Cd_oq0qEqNAF8PwU7fK!-WwVEp4~4g z3SEmE3-$ddli))xY9KN$lxEIfyLzup@utHn=Q{OCoz9?>u%L^JjClW$M8OB`txg4r6Q-6UlVx3tR%%Z!VMb6#|BKRL`I))#g zij8#9gk|p&Iwv+4s+=XRDW7VQrI(+9>DikEq!_6vIX8$>poDjSYIPcju%=qluSS&j zI-~+ztl1f71O-B+s7Hf>AZ#}DNSf`7C7*)%(Xzf|ps6Dr7IOGSR417xsU=Rxb z1pgk9vv${17h7mZ{)*R{mc%R=!i}8EFV9pl8V=nXCZruBff`$cqN3tpB&RK^$yH!A8RL zJ5KltH$&5%xC7pLZD}6wjD2-uq3&XL8CM$@V9jqalF{mvZ)c4Vn?xXbvkB(q%xbSdjoXJXanVN@I;8I`)XlBX@6BjuQKD28Jrg05} z^ImmK-Ux*QMn_A|1ionE#AurP8Vi?x)7jG?v#YyVe_9^up@6^t_Zy^T1yKW*t* z&Z0+0Eo(==98ig=^`he&G^K$I!F~1l~gq}%o5#pR6?T+ zLmZu&_ekx%^nys<^tC@)s$kD`^r8)1^tUazRkWEYPw0P)=%cqnyeFo3nW zyV$^0DXPKn5^QiOtOi4MIX^#3wBPJjenU#2OIAgCHPKXv$OY=e;yf7+_vI7KcjKq% z?RVzC24ekYp2lEhIE^J$l&wNX0<}1Poir8PjM`m#zwk-AL0w6WvltT}*JN8WFmtP_ z6#rK7$6S!nS!}PSFTG6AF7giGJw5%A%14ECde3x95(%>&W3zUF!8x5%*h-zk8b@Bz zh`7@ixoCVCZ&$$*YUJpur90Yg0X-P82>c~NMzDy7@Ed|6(#`;{)%t7#Yb>*DBiXC3 zUFq(UDFjrgOsc%0KJ_L;WQKF0q!MINpQzSsqwv?#Wg+-NO; z84#4nk$+3C{2f#}TrRhin=Erdfs77TqBSvmxm0P?01Tn@V(}gI_ltHRzQKPyvQ2=M zX#i1-a(>FPaESNx+wZ6J{^m_q3i})1n~JG80c<%-Ky!ZdTs8cn{qWY%x%X^27-Or_ z`KjiUE$OG9K4lWS16+?aak__C*)XA{ z6HmS*8#t_3dl}4;7ZZgn4|Tyy1lOEM1~6Qgl(|BgfQF{Mfjktch zB5kc~4NeehRYO%)3Z!FFHhUVVcV@uEX$eft5Qn&V3g;}hScW_d)K_h5i)vxjKCxcf zL>XlZ^*pQNuX*RJQn)b6;blT3<7@Ap)55)aK3n-H08GIx65W zO9B%gE%`!fyT`)hKjm-&=on)l&!i-QH+mXQ&lbXg0d|F{Ac#U;6b$pqQcpqWSgAPo zmr$gOoE*0r#7J=cu1$5YZE%uylM!i3L{;GW{ae9uy)+EaV>GqW6QJ)*B2)-W`|kLL z)EeeBtpgm;79U_1;Ni5!c^0RbG8yZ0W98JiG~TC8rjFRjGc6Zi8BtoC);q1@8h7UV zFa&LRzYsq%6d!o5-yrqyjXi>jg&c8bu}{Bz9F2D(B%nnuVAz74zmBGv)PAdFXS2(A z=Z?uupM2f-ar0!A)C6l2o8a|+uT*~huH)!h3i!&$ zr>76mt|lwexD(W_+5R{e@2SwR15lGxsnEy|gbS-s5?U}l*kcfQlfnQKo5=LZXizrL zM=0ty+$#f_qGGri-*t@LfGS?%7&LigUIU#JXvwEdJZvIgPCWFBTPT`@Re5z%%tRDO zkMlJCoqf2A=hkU7Ih=IxmPF~fEL90)u76nfFRQwe{m7b&Ww$pnk~$4Lx#s9|($Cvt ze|p{Xozhb^g1MNh-PqS_dLY|Fex4|rhM#lmzq&mhebD$5P>M$eqLoV|z=VQY{)7&sR#tW zl(S1i!!Rrg7kv+V@EL51PGpm511he%MbX2-Jl+DtyYA(0gZyZQjPZP@`SAH{n&25@ zd)emg(p2T3$A!Nmzo|%=z%AhLX)W4hsZNFhmd4<1l6?b3&Fg)G(Zh%J{Cf8Q;?_++ zgO7O<(-)H|Es@QqUgcXNJEfC-BCB~#dhi6ADVZtL!)Mx|u7>ukD052z!QZ5UC-+rd zYXWNRpCmdM{&?M9OMa;OiN{Y#0+F>lBQ=W@M;OXq;-7v3niC$pM8p!agNmq7F04;| z@s-_98JJB&s`Pr6o$KZ=8}qO*7m6SMp7kVmmh$jfnG{r@O(auI7Z^jj!x}NTLS9>k zdo}&Qc2m4Ws3)5qFw#<$h=g%+QUKiYog33bE)e4*H~6tfd42q+|FT5+vmr6Y$6HGC zV!!q>B`1Ho|6E|D<2tYE;4`8WRfm2#AVBBn%_W)mi(~x@g;uyQV3_)~!#A6kmFy0p zY~#!R1%h5E{5;rehP%-#kjMLt*{g((o@0-9*8lKVu+t~CtnOxuaMgo2ssI6@kX09{ zkn~q8Gx<6T)l}7tWYS#q0&~x|-3ho@l}qIr79qOJQcm&Kfr7H54=BQto0)vd1A_*V z)8b2{xa5O^u95~TS=HcJF5b9gMV%&M6uaj<>E zPNM~qGjJ~xbg%QTy#(hPtfc46^nN=Y_GmPYY_hTL{q`W3NedZyRL^kgU@Q$_KMAjEzz*eip`3u6AhPDcWXzR=Io5EtZRPme>#K9 z4lN&87i%YYjoCKN_z9YK+{fJu{yrriba#oGM|2l$ir017UH86Eoig3x+;bz32R*;n zt)Eyg#PhQbbGr^naCv0?H<=@+Poz)Xw*3Gn00qdSL|zGiyYKOA0CP%qk=rBAlt~hr zEvd3Z4nfW%g|c`_sfK$z8fWsXTQm@@eI-FpLGrW<^PIjYw)XC-xFk+M<6>MfG;WJr zuN}7b;p^`uc0j(73^=XJcw;|D4B(`)Flm|qEbB?>qBBv2V?`mWA?Q3yRdLkK7b}y& z+!3!JBI{+&`~;%Pj#n&&y+<;IQzw5SvqlbC+V=kLZLAHOQb zS{{8E&JXy1p|B&$K!T*GKtSV^{|Uk;`oE*F;?@q1dX|>|KWb@|Dy*lbGV0Gx;gpA$ z*N16`v*gQ?6Skw(f^|SL;;^ox6jf2AQ$Zl?gvEV&H|-ep*hIS@0TmGu1X1ZmEPY&f zKCrV{UgRAiNU*=+Uw%gjIQhTAC@67m)6(_D+N>)(^gK74F%M2NUpWpho}aq|Kxh$3 zz#DWOmQV4Lg&}`XTU41Z|P~5;wN2c?2L{a=)Xi~!m#*=22c~&AW zgG#yc!_p##fI&E{xQD9l#^x|9`wSyCMxXe<3^kDIkS0N>=oAz7b`@M>aT?e$IGZR; zS;I{gnr4cS^u$#>D(sjkh^T6_$s=*o%vNLC5+6J=HA$&0v6(Y1lm|RDn&v|^CTV{= zjVrg_S}WZ|k=zzp>DX08AtfT@LhW&}!rv^);ds7|mKc5^zge_Li>FTNFoA8dbk@K$ zuuzmDQRL1leikp%m}2_`A7*7=1p2!HBlj0KjPC|WT?5{_aa%}rQ+9MqcfXI0NtjvXz1U)|H>0{6^JpHspI4MfXjV%1Tc1O!tdvd{!IpO+@ z!nh()i-J3`AXow^MP!oVLVhVW&!CDaQxlD9b|Zsc%IzsZ@d~OfMvTFXoEQg9Nj|_L zI+^=(GK9!FGck+y8!KF!nzw8ZCX>?kQr=p@7EL_^;2Mlu1e7@ixfZQ#pqpyCJ```(m;la2NpJNoLQR};i4E;hd+|QBL@GdQy(Cc zTSgZ)4O~hXj86x<7&ho5ePzDrVD`XL7{7PjjNM1|6d5>*1hFPY!E(XDMA+AS;_%E~ z(dOs)vy29&I`5_yEw0x{8Adg%wvmoW&Q;x?5`HJFB@KtmS+o0ZFkE@f)v>YYh-z&m z#>ze?@JK4oE7kFRFD%MPC@x$^p{aW}*CH9Y_(oJ~St#(2)4e-b34D>VG6giMGFA83 zpZTHM2I*c8HE}5G;?Y7RXMA2k{Y?RxHb2 zZFQv?!*Kr_q;jt3`{?B5Wf}_a7`roT&m1BN9{;5Vqo6JPh*gnN(gj}#=A$-F(SRJj zUih_ce0f%K19VLXi5(VBGOFbc(YF zLvvOJl+W<}>_6_4O?LhD>MRGlrk;~J{S#Q;Q9F^;Cu@>EgZAH=-5fp02(VND(v#7n zK-`CfxEdonk!!65?3Ry(s$=|CvNV}u$5YpUf?9kZl8h@M!AMR7RG<9#=`_@qF@})d ztJDH>=F!5I+h!4#^DN6C$pd6^)_;0Bz7|#^edb9_qFg&eI}x{Roovml5^Yf5;=ehZ zGqz-x{I`J$ejkmGTFipKrUbv-+1S_Yga=)I2ZsO16_ye@!%&Op^6;#*Bm;=I^#F;? z27Sz-pXm4x-ykSW*3`)y4$89wy6dNOP$(@VYuPfb97XPDTY2FE{Z+{6=}LLA23mAc zskjZJ05>b)I7^SfVc)LnKW(&*(kP*jBnj>jtph`ZD@&30362cnQpZW8juUWcDnghc zy|tN1T6m?R7E8iyrL%)53`ymXX~_;#r${G`4Q(&7=m7b#jN%wdLlS0lb~r9RMdSuU zJ{~>>zGA5N`^QmrzaqDJ(=9y*?@HZyE!yLFONJO!8q5Up#2v>fR6CkquE$PEcvw5q zC8FZX!15JgSn{Gqft&>A9r0e#be^C<%)psE*nyW^e>tsc8s4Q}OIm})rOhuc{3o)g1r>Q^w5mas) zDlZQyjQefhl0PmH%cK05*&v{-M1QCiK=rAP%c#pdCq_StgDW}mmw$S&K6ASE=`u4+ z5wcmtrP27nAlQCc4qazffZoFV7*l2=Va}SVJD6CgRY^=5Ul=VYLGqR7H^LHA;H^1g}ekn=4K8SPRCT+pel*@jUXnLz+AIePjz@mUsslCN2 z({jl?BWf&DS+FlE5Xwp%5zXC7{!C=k9oQLP5B;sLQxd`pg+B@qPRqZ6FU(k~QkQu{ zF~5P=kLhs+D}8qqa|CQo2=cv$wkqAzBRmz_HL9(HRBj&73T@+B{(zZahlkkJ>EQmQ zenp59dy+L;sSWYde!z_W+I~-+2Xnm;c;wI_wH=RTgxpMlCW@;Us*0}L74J#E z8XbDWJGpBscw?W$&ZxZNxUq(*DKDwNzW7_}AIw$HF6Ix|;AJ3t6lN=v(c9=?n9;Y0 zK9A0uW4Ib9|Mp-itnzS#5in=Ny+XhGO8#(1_H4%Z6yEBciBiHfn*h;^r9gWb^$UB4 zJtN8^++GfT`1!WfQt#3sXGi-p<~gIVdMM<#ZZ0e_kdPG%Q5s20NNt3Jj^t$(?5cJ$ zGZ#FT(Lt>-0fP4b5V3az4_byF12k%}Spc$WsRydi&H|9H5u1RbfPC#lq=z#a9W(r1 z!*}KST!Yhsem0tO#r!z`znSL-=NnP~f(pw-sE+Z$e7i7t9nBP^5ts1~WFmW+j+<@7 zIh@^zKO{1%Lpx^$w8-S+T_59v;%N;EZtJzcfN%&@(Ux5 z@YzX^MwbbXESD*d(&qT7-eOHD6iaH-^N>p2sVdq&(`C$;?#mgBANIc5$r| z^A$r)@c{Z}N%sbfo?T`tTHz9-YpiMW?6>kr&W9t$Cuk{q^g1<$I~L zo++o2!!$;|U93cI#p4hyc!_Mv2QKXxv419}Ej#w#%N+YIBDdnn8;35!f2QZkUG?8O zpP47Wf9rnoI^^!9!dy~XsZ&!DU4bVTAi3Fc<9$_krGR&3TI=Az9uMgYU5dd~ksx+} zP+bs9y+NgEL>c@l>H1R%@>5SWg2k&@QZL(qNUI4XwDl6(=!Q^U%o984{|0e|mR$p+ z9BcwttR#7?As?@Q{+j?K6H7R71PuiA^Dl$=f47nUKL|koCwutc_P<-m{|Al3C~o7w z=4S=}s5LcJFT1zjS)+10X_r$74`K78pz!nGGH%JV%w75!YSIt#hT7}}K>+@{{a+Im z5p#6%^X*txY?}|T17xWW*sa^?G2QHt#@tlcw0GIcy;|NR2vaCBDvn=`h)1il7E5Rx z%)mA4$`$OZx)NF5vXZnaJ1)*cA6ryx6Ll~t!LzhxvcTedxT;>JS&e=?-&DXUPaQ2~ zH*69ezE`hgV{K-|0z|m~ld}=X^-Ob={wpex&}*+Rz{gx)G}gn!C_VN{UN=>^EV=Xc zr$-HO09cW&p4^M}V3yBjTP_xrVcc8iU_^Y-JD~(bgw*@GXGB1gYKz5DWO+O`>})|N zWrC)MR93yA)3{&27-M)TJB6Ml3~?zZg#mYsF=#OSTaw&K z@hBftpt+2l@)YK@|3DvTjl(8wZtpLp9Ik!6G$CSL_idZ$Ti?R)4toe8bb)l|)lNb}?K;O2K9vyn1QG zd=v#y-Ld49UVkmfRU>Egc+(Y$^-;6vW;3Lcu*6~etz}0|@+b|+!UCal)DEYGLbHWJ zll5Wi^$Y<6@S%^y%hdjRh6&{!z1Py|lZ|q&Wub3l41uN2zEF8E&5H5?PL*&V}?*a}Lp% zCYi{ghjpRNT^^B+_U59No50Ghih5qn(W5`RkrsDWr{~A1dgtv{sRkH4RU2^A{jb&0 zxVRnrm|u<;$iI;M6A>$POP)TWGU-gSjAERk*EGmVT(aw$!XUSe~7Ql-oRA54^4V(JWS6Q1mG?!vZ zx+pE!FEtvqr|Xrcb3oR`%LHFLmU_&{=p%mGy6MRe2Yz_5WJ8p@IgU2 zdVvvhhQtiQkChK%*&PsiPCBL9oDOoJX8!$S(V>R}+1M}wzK*U*A{KJ`r=lM;mPrKU zQDqqN(W*u-5-?$(SIk<6A0E}34y&@-IVC%S!a1F4kz<3bIKjlyD)ooO_7ftl%S_(6w`!vX&1PZ!K`@D@L6JR)6zO@Dl!YF{RY}d3HZ7?Q5E>w=$ ze)H_)48Ds*Ov4?zoGb2fe3}{!5Ooc|KCIni1o)(Gj+CO?`*7jsV`hIv@8J(22o4Q? zu?Bvi)zDG(me?7XKeL|iF9ZRgZdT*}Ffsl62Cu;{Gv9j6dO zPt*H2GqC)-C`V`ceuu=tM{7!2yTEj=*5+T~5DYiZ)Hy)*PARYI6R2lZXoOj;v8M4W z*O-NX(7_~Q&A3>Oaw&1lBH_H%SwmISX-i3)HfHvBOeVwTT{LUM3}ZuZmg<(>)KE;d zbs2!0v6>J;1nQ0UJkUxnkE@Ibi~Q}M=-=Rk;hcOnxO$luOKEVxZc|!XECgex(2`}T z3Y;Q_6rL)e+SrOZhQj5_e}Lv>w7n*Pep$yWZNQl>ubBgb_NIWWDn3kNpn+MPQXV;8 zV|_Ba5jsQ(w&Ey^IM|@|y!AqcJ#3m0#Q6_qvgCG~eoF#mnGmbO(;DP+bW%_aOs1R_ z@9p#7X2UA^--#Nwx_Hvk2l1`eO{P*#j@q2UELtH|Uh6hxR`h_847wIJo0=5CQQ`6it|%a-I$^&a@we1rc&*;QIu5Ck^?) zx*5eSd*mG#=6Hi(5!;5uUi&{HfnT1S8X-)?gE5CZ6KWoqM5|CyrULmuFBKOU8SOp* z{IB1$OCcq`S-k*xs;4fmhKsIGZ;GYAY*%(@875NxhMq|j*m4CNLI(Vho|N|F);!E0cS5y^$H^Izje?z}oTgyr`9x9G&rlJZw&uqIoBMtz zzhU0(9;w02?m#0!)cFi*r+8YvooQ;(s2lLVvyLqAE%Xqe!vtWbIs!l1Bpp(FIht-Z zPn#CN-2C|J*GhA2fuHqYQ2mJiXlGTzD}mkr2;ia8Wp}h^;OS7+N^Mw|en!1${vN6 z-x{8N*4UekA~`IV2&K-GzhAqau|}d*pEQ$1MH$cFi03OG^1NetZ_jW^STaEzr&Xho zB452St%v3ez2#TFm~`gZh$vi=in+y2d!z<{OZ~Kty-5bQ;0O=k_ESi8Nx9{*T`LJy6jqR>&|+>OZ;+=0hA04 zE25t^sE9HG)3^KKR_A5WDkqispweP9!I-@dCO&N!JrD@i{WBHnfQ z95o8;d$`AFnca3;N-0iX-CmbbAp5yQ!GoH;h7Cn?m{ammZJI8igP{U73lFnl2&gCs zqJ4(Vo~^j`{zOAzScL5B_Sm?Mjtek1d(A6X5ObcZi$;aOYy|g$}BY z$GEP3#i60Ju_&3SHzryH!gUFwC9-295u??cf+aYRQ1$+!rc#42YNattd6mZEFI@?C zqFM>6+zxEunIHDZ>{Z15u##>N(28Dw!>G(k*dB{NHvip@aP}f`@=Q;!o;zRMWo{Cx zo?kyzh8n7#f1g0&g>Cd>O-2g?uPwy8sy8hZbHSsXPmU;@l=HL=zm7mN(=@*|D$i+u zs~TllkCTvD$f&-#b9B?}#Lg*-ibK13R_a$RyoN3m5`10tdhAq{+VW)K#Bht-ra1*J z+n$N%V>u0rVtx`aKJDwXXrxaD7nS<>$=c82v7@KVx^S@vT;h=SZE37K>iahpx3;VDzEr9GY=2(%uaqM;^76eSP0QLzo4sI z>p_Eei*T$K;|qK`sq;?Hesp}(@VvX2Q4sAMYAJ}b&d$htDMC{FG-$o4k9ApECi1$a zXdamjiOGKHBh(4M<3(2x6n-CrmZMCknkQxdSS!qlis#I}btfX;J`JU3RlvtLdrymP zG0ZzrsGXVFiq+Wk1=BFay&9ZiCE#(`h~CL+c-Hs@iGTU@YxM%vlg;)`Tf~IknA^02 zXkN#Txo6aR{j$wP5T#|UH#5AP2{rSY8p?jKFv zG3kn3y`FaV!*Jq%m39_TQEhD>M@l*bhEPGe1{ft3q#K5AknT=F2_=T^l#ou5ln@D# z5Tzs(kRG@qNDa~HLNvfv7Z0g=bSlb?`QAx|Gfoni|iHJ%K0cy z;~Nsaa+{8HP_qrb{nj+xzkdYhSI@W4N_1`z(eSGIkbDP)!Ko|M%}Rqp(~KI2hl~eE zvJ!j4m6iwMgKy>fkCLC)`M$z9EV}B+sq1}}kVf$(ig0pWTY?rHz1Sm=4srTGNb^JG z=2$9wz-C@aZZZ2!HY#HNejqZRmE=pN(D$Kui$NpfhU`!y_s{@MIxiJdHb1|{6xb`> zE74_@QtgtG{4=3P1$^vn&m}7Aw8!1DnT$2thO#~44wl(N#ao8S0@t@m+Z!KD2CfK; z)n5DAPKV_etmH1aLDK$?`;sL91iVt$D z*SG}=-LIAg(*+JON!-5ivqOMQ1S!OQUgHglDsKik&Mwg;vva523`JwQH6SRz9eTY# zTIi23145~kc3r1mSWC_RzD%hs$S#!pkI9!BU80jJCJcwo*FZolQG$q`8C1d9pP@ND zG^&-ZraIvhg_FDVSfKGwkcI=avIan%2sK4coUs~Nr8jC*&!G0#?}_^s3r-c}-uAqi zM-Lw>Y}I``T;IS%Y|qH;s{F*ZefM!4{I5awr!K+T@uPd*Vu*iPWI}>(-D{zxsN>LG z=@747a_Rb2>q?y8xYf?dq2HM5tFO8Y5e4N;Y=xy8yAhI zsm>oy%R5;7)7T3V_b2%`aH^tNlsQpFxIFW#iV#8?{6{^cGr{A0@1bA)|K z>MMTuZD(pd2t|7vmHtywGXb%%=)S<`OG~}U+jm#xd%H8 z$v8-C%F?ah3$;hn?{G3(LT!SgvCVi$vwsZssAQvUwT`Q%qSw!LSd!(I!64w1=%Sc1Mck)q1@pZ@)=SY zoX}d+L3-RA|c?G3_BQNm&( z!i$AZ7cI(z7q|e9VM##6T3Xorj1JG(9os$;(I$y%mBy(#8{|3l4|x*oBAQL^XhZ0g zy1FR1teRrpKq{uLAibTLx#n({qwjlkOvR{OdSAeT5ah4-sNN)n4Clg1T9lzF)&yj; zyal1%+s4n1IG;^VPWJ;#olpk8Z42Gj-tjFeQ&PlxB)`oCNoUYKj4U$AeG8rYiD{pK zndDf&2;2;)D|KvOZP+e7fcPU9k4M2sfhr@vC~Ly0?S-4dz)ZGAYpCsAhChgbxLd4g zhTrbIPkO5SEp_kD>Ha0m12h5n3s;mE8kn515&nzSf+^D= zyE{JnJ;43l&BH55CL<=W%CF;6iUI)V5C*6!`**KqvzR2=Fj*3Y4`HYwx}TYD445(K z-QtXwtL?m*(F=LVH*H4oM>dXHBW=38q_dZ-_Vr&qpEPxd9Fs95P5W~@Z|Rt+WZP6l zPSQ}~Dh4V?Pp1g&Hk*Px?lm16C@X6M29Vrk%Rw@E||E-v~$ zb_E~{z<}#8i`Mx9mkqtd#Z1lZ-E_J8I+2oumc#x1)jdvh{W76NKm6x-RYpM~v!P8$ zw3e|YVf|}Hse9~oC@N7^j}Fi$hNpyaYnu1}bdXsD=^oI*%WKvbme|BI}$G3>smu#6y)ls|j? zF7Bhu9Z)j)C;3cZb+I>0stSK^WLOYV^U{pUYkgv>?+Nt^5j*CUB=eGw-CvU&40>y~ zGoHLXxY^7k5Xgv62{iQy|5jJQuq0|LU`}lE@flQ2Z*Zn*VWcQjm4FTb>LSVox^S4q zLn`LfS@mrjKCmg$nb^af?d?0&$aX6#2u(JyzIJvuJ*lwPrh|0~aEnSACCTezSdG%h zmSQg`17j@$Iq)r1&?+eR@1nlX|H`<}_!?BQSF&N+QQnvEAqZe+mIFui!0V49R?|9*$ zv!K1A01{8xq;L()Tv*Qk0-$Oj6+vCT*TUD{HvxO@3JjxBwM!4g3ydy&eaJw4CoQBF zJtULJ!YxgNR7_Ls%LmogyI7uIs=!B&?=MYY^yX+v;j@D_xGeZg>eZk0C;4e|HRNSi z6KlD9>q=3v-$4Zik&^ZDhNm1X)+7LCH1k!s+T3tn zUn@={1U&NJLq@K?~w|(=Y<4W{ucX}FdRr6pLw(l2$iK)At%t3gYBMlJz#(K0Nqm;=KAML!&MMSNz=%k=j*zh77r34Rs37iCY` z=_kva_41bdrj(b=4Wc5MO0~q^z#pIWJ>)vDSgIQF=3JVJe1iDy%h)8oNy{s_r&;m` zL{DYKSB_5xRb9xKNOS{qAY3qv5sSXVrrf%~*q5HO|CQ&lbKMePa$M5D{vlJcoGrCZ zD?fKbZN$6rWwz)w7`9h4DAmh1ij2}EO|bO#A9L0_RW6l*$sPPUJrUbhLC75L9%W5iO$Iw5~Yut-qBeu~hF|xD7-eQ%l z412vpq_;t%^F*pYDk%Q35c-erK|6Ve=FxQbAv~ikZ4c9$Y4;ee#ciOD9{yRqf55Qk zumv}#+JciT|Gj$uFOxBUze)=?l{B}qaC0_7m`t82<$K53!4Xvi9Tr)ADp3Off?O8o zVDG0Yx|tfn@r((m?Nxrh(b0DGjg)$;DfO&$6uY;4&F!4jnxkhP}Y3x zS?WFFt>=HWzqlQhffVfvM$Ta8Sg*r3j!Eo&rUOW7SCL2~lG7<+XZ;+{&8h5g8ElI+P>>yR2U%S93NN!Xhm|C682t6ysH-=o1=Bd*N*VlnG%l+KZFtjG`UkL;%65qn0UYQ`h zh0{9jDQx(`aBe7J0Aj3Z)4}`A|4OMM0a;?{j}qkYwi)~O8$9D}ITiMH2buiU>ixYp zhL${nwj6X($*OwmpVG`y5b6v45tX*J8?og}Qju6eJ9H}`X87iEd%BUo7<`2q(HJx+ zMR}d-J4oAf{V1W^a2~`M-YAdZ81dd4o6NPO{cmZaAS@RS4ir#Sr zfFZO-VIL|VN<%nEXr2` z$0FK2L#8O_f1w~c@G70JrB@N}r(gJ!Vmkk6{r68w!o$qO?HrFcjeU0_3F5;*!E2%( zTx>4?gP8w z1B?3UVZmz^%d_dIps>>0{cB~mp3{9UoPR6uQFecVq&} zY{ebB?AlPAD_}(ll{fK99;Wh1cgRbnw)maD^F>*J!R}eHM*W0VYN1TADWMy9H=$00 z5bHY${oDgwX7(W9LZw?}{!8(_{JB~Xkje6{0x4fgC4kUmpfJ+LT1DYD*TWu4#h{Y7 zFLronmc=hS=W=j1ar3r1JNjQoWo2hMWsqW*e?TF%#&{GpsaLp}iN~$)ar+7Ti}E&X z-nq~+Gkp(`qF0F_4A22>VZn-x>I$?PDZSeG8h_ifoWf^DxIb5%T7UytYo3}F|4#RC zUHpg$=)qVqD~=m(!~?XwocuxU1u}9qhhM7d^eqmJPi_e-!IO`*{u7A zbu*?L$Mbj-X9n3G2>+Kc#l`@d8}Xb9{l*IN{#M*d;s+3Pdr8FO$EBELR=8{ zd?LJbSv9fI`{OqTH)5{b?WulgMb)psp+W|@cSp=jtl-&5C}9lw@*0H+gEW(}mAWNz zf{~U;;N}|wdSaphgqnH{FWUy!{y3^=AC*c?RJ5Eb<^ zCgH_v7^axIUVmHSFL^zlj2R$zow$|y#7>%#U7d#Vp_ezcp3lefMyd5ES=q$>4pWyA zp_Zso^^NP~lu2=S6nD(3Z5u=Uy&B&F1i$J*3;3KhEkD_lgscHGR*;T;U!9vgQa(hI}oh9IzEf_PU_8F+i77t-~gDX z490Sb)LyVZmf18N6w{+37$aO<2!Av0 ztLaPOv^J<2@p{WnMiDudoghX_`luFZt_4eNU}*~cF5i%eEcNLs;D>QVIwr8mH;=dc z09`}JV;aaF;13@&iS(w>Jc=k~|d_1hcpM(l|O zu>!@}me%isTT$xT#hNUvh(ATd0wT4fbv=6htcHNEZIw9%E6wlYmwfu2{j0kh1y=$;Yf!|NldgB9ul zB{dbE&LfRnr8ITm@;-68wo#VV?8lG3ed&9k1}QBS3}WGV9%26?A1rBkkDR9Z3o+g+ z)eQg8BY3y(Dh5&z?VLLNdDV`C=muUvCPpGg!oYxIgOI3^%4>5d7jTh~ni!Fg2;fhx z(*c%H6Je84kmQh;5tC3*l~7khLxK-e|Cz?FLh!yYe7g|*LwqU?2wv^_ZyKT$fYVkGJo@AK0$+ml?}zJeB~deT2WL1vz}dxB z)y??t!}%M@)u$_IyW~)6u1SttJ!awd6N5lx|xBrmyrBh>tb&D*=C+Z3nPfq$1%WgY0bY*?PZ#Hk|=xn zGM#0*w4CaB^y0G(J4q=;5NeM@m-P}#mv7QZNF)M!dK^w{mk_!n0`+Y3PQutu-%NBt zzgPXug?JLEbUL{e_dk;Vd896&yPe(hliVK!lj%5+@BKdcrEZ2Nc_*i@ve*2lB>u~{ zFozd2FM|_0+nAGR4TLNHanQn_Oeb!JrUcvzJ?7p9TTNB}ocO3j$7ij!li8#k6 z@2tSd1>K03K9A#_-MIq)S;T#oE^;>U$)&}okIvDf3lm?kI{d80$>~xKUoS!%q1Pi?WpsUUt(tI ztjNjY*y&Rm9(S(DC2GuPHBJs@5M{RGm`c1z<6nwyN^)rMo-AS{M2$oM9|y%fM|}G~ DHx0+F literal 0 HcmV?d00001 diff --git a/batch/gradle/wrapper/gradle-wrapper.properties b/batch/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..37f853b1 --- /dev/null +++ b/batch/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/batch/gradlew b/batch/gradlew new file mode 100644 index 00000000..faf93008 --- /dev/null +++ b/batch/gradlew @@ -0,0 +1,251 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/batch/gradlew.bat b/batch/gradlew.bat new file mode 100644 index 00000000..9d21a218 --- /dev/null +++ b/batch/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/batch/settings.gradle b/batch/settings.gradle new file mode 100644 index 00000000..dae2d580 --- /dev/null +++ b/batch/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'batch' diff --git a/batch/src/main/java/com/project/imdang/BatchApplication.java b/batch/src/main/java/com/project/imdang/BatchApplication.java new file mode 100644 index 00000000..9a35d910 --- /dev/null +++ b/batch/src/main/java/com/project/imdang/BatchApplication.java @@ -0,0 +1,14 @@ +package com.project.imdang; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableScheduling +@SpringBootApplication +public class BatchApplication { + + public static void main(String[] args) { + SpringApplication.run(BatchApplication.class, args); + } +} diff --git a/batch/src/main/java/com/project/imdang/batch/DataSourceConfiguration.java b/batch/src/main/java/com/project/imdang/batch/DataSourceConfiguration.java new file mode 100644 index 00000000..375626d0 --- /dev/null +++ b/batch/src/main/java/com/project/imdang/batch/DataSourceConfiguration.java @@ -0,0 +1,29 @@ +package com.project.imdang.batch; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfiguration { + + @Value("${spring.datasource.url}") + private String jdbcUrl; + @Value("${spring.datasource.username}") + private String username; + @Value("${spring.datasource.password}") + private String password; + + @Bean + public DataSource dataSource() { + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setJdbcUrl(jdbcUrl); + hikariConfig.setUsername(username); + hikariConfig.setPassword(password); + return new HikariDataSource(hikariConfig); + } +} diff --git a/batch/src/main/java/com/project/imdang/batch/LiftPenaltyJobConfiguration.java b/batch/src/main/java/com/project/imdang/batch/LiftPenaltyJobConfiguration.java new file mode 100644 index 00000000..5fff976b --- /dev/null +++ b/batch/src/main/java/com/project/imdang/batch/LiftPenaltyJobConfiguration.java @@ -0,0 +1,116 @@ +package com.project.imdang.batch; + +import lombok.RequiredArgsConstructor; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.job.builder.JobBuilder; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.step.builder.StepBuilder; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.database.Order; +import org.springframework.batch.item.database.PagingQueryProvider; +import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder; +import org.springframework.batch.item.database.builder.JdbcPagingItemReaderBuilder; +import org.springframework.batch.item.database.support.SqlPagingQueryProviderFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +@EnableBatchProcessing +@Import(DataSourceConfiguration.class) +@RequiredArgsConstructor +@Configuration +public class LiftPenaltyJobConfiguration { + // Member + // TODO : Partitioning 기능을 통한 멀티 스레드 구조로 Chunk 기반 프로세스 구현 + + private final DataSource dataSource; + + private final int CHUNK_SIZE = 10; + + @Bean + public Job liftPenaltyJob(JobRepository jobRepository, PlatformTransactionManager platformTransactionManager) throws Exception { + return new JobBuilder("liftPenaltyJob", jobRepository) + .incrementer(new RunIdIncrementer()) + .start(liftPenaltyStep(jobRepository, platformTransactionManager)) + .build(); + } + + @Bean + public Step liftPenaltyStep(JobRepository jobRepository, PlatformTransactionManager platformTransactionManager) throws Exception { + return new StepBuilder("liftPenaltyStep", jobRepository) + .allowStartIfComplete(true) + .chunk(CHUNK_SIZE, platformTransactionManager) + .reader(memberItemReader()) + .processor(memberItemProcessor()) + .writer(memberItemWriter()) + .build(); + } + + @Bean + public ItemReader memberItemReader() throws Exception { + return new JdbcPagingItemReaderBuilder() + .name("jdbcPagingMemberItemReader") + .dataSource(dataSource) + .queryProvider(createQueryProvider()) + .rowMapper((rs, rowNum) -> new Member( + rs.getString("id"), + rs.getDate("penalty_from").toLocalDate(), + rs.getDate("penalty_to").toLocalDate(), + rs.getString("status"))) + // TODO : pageSize vs fetchSize + .pageSize(10) + .fetchSize(CHUNK_SIZE) + .build(); + } + + private PagingQueryProvider createQueryProvider() throws Exception { + SqlPagingQueryProviderFactoryBean queryProvider = new SqlPagingQueryProviderFactoryBean(); + queryProvider.setDataSource(dataSource); + queryProvider.setSelectClause("SELECT id, penalty_from, penalty_to, status"); + queryProvider.setFromClause("FROM member"); + queryProvider.setWhereClause("WHERE status <> 'ACTIVE' AND penalty_to < CURDATE()"); + + Map sortKeys = new HashMap<>(1); + sortKeys.put("id", Order.ASCENDING); + + queryProvider.setSortKeys(sortKeys); + return queryProvider.getObject(); + } + + @Bean + public ItemProcessor memberItemProcessor() { + return member -> { + member.setStatus("ACTIVE"); + return member; + }; + } + + @Bean + public ItemWriter memberItemWriter() { +// return new ItemWriter() { +// @Override +// public void write(Chunk chunk) throws Exception { +// List members = chunk.getItems(); +// for (Member member : members) { +// System.out.println(member); +// } +// } +// }; + return new JdbcBatchItemWriterBuilder() + .dataSource(dataSource) + .sql("UPDATE member SET status = :status WHERE id = :id") + .beanMapped() + .assertUpdates(true) + .build(); + } +} diff --git a/batch/src/main/java/com/project/imdang/batch/Member.java b/batch/src/main/java/com/project/imdang/batch/Member.java new file mode 100644 index 00000000..380210c3 --- /dev/null +++ b/batch/src/main/java/com/project/imdang/batch/Member.java @@ -0,0 +1,29 @@ +package com.project.imdang.batch; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; + +@Getter +@AllArgsConstructor +public class Member { + private String id; +// private int accusedCount; + private LocalDate penaltyFrom; + private LocalDate penaltyTo; + + @Setter + private String status; + + @Override + public String toString() { + return "Member{" + + "id='" + id + '\'' + + ", penaltyFrom=" + penaltyFrom + + ", penaltyTo=" + penaltyTo + + ", status='" + status + '\'' + + '}'; + } +} diff --git a/batch/src/main/java/com/project/imdang/scheduler/BatchScheduler.java b/batch/src/main/java/com/project/imdang/scheduler/BatchScheduler.java new file mode 100644 index 00000000..a7d33718 --- /dev/null +++ b/batch/src/main/java/com/project/imdang/scheduler/BatchScheduler.java @@ -0,0 +1,47 @@ +package com.project.imdang.scheduler; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.JobParametersBuilder; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class BatchScheduler { + + private final JobLauncher jobLauncher; + private final Job liftPenaltyJob; + + public BatchScheduler( + JobLauncher jobLauncher, + @Qualifier("liftPenaltyJob") Job liftPenaltyJob) { + this.jobLauncher = jobLauncher; + this.liftPenaltyJob = liftPenaltyJob; + } + + @Scheduled(cron = "0 0 2 * * ?") + public void runLiftPenaltyJob() { + runJob(liftPenaltyJob, "liftPenaltyJob"); + } + + private void runJob(Job job, String jobName) { + try { + JobParameters params = new JobParametersBuilder() + .addString("jobName", jobName) + .addLong("runTime", System.currentTimeMillis()) + .toJobParameters(); + + JobExecution execution = jobLauncher.run(job, params); + log.info(">>>>>>>>> success : {}, {}", jobName, execution.getStatus()); + + } catch (Exception e) { + log.error(">>>>>>>>> fail : {}, {}", jobName, e.getMessage()); + e.printStackTrace(); + } + } +} diff --git a/batch/src/test/java/com/project/imdang/batch/LiftPenaltyJobConfigurationTest.java b/batch/src/test/java/com/project/imdang/batch/LiftPenaltyJobConfigurationTest.java new file mode 100644 index 00000000..850d4746 --- /dev/null +++ b/batch/src/test/java/com/project/imdang/batch/LiftPenaltyJobConfigurationTest.java @@ -0,0 +1,90 @@ +package com.project.imdang.batch; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.batch.core.BatchStatus; +import org.springframework.batch.core.ExitStatus; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.JobParametersBuilder; +import org.springframework.batch.core.StepExecution; +import org.springframework.batch.test.JobLauncherTestUtils; +import org.springframework.batch.test.context.SpringBatchTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.context.ActiveProfiles; + +import java.time.LocalDate; +import java.util.Collection; +import java.util.UUID; + +@ActiveProfiles("test2") +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@SpringBatchTest // 배치 관련 테스트 유틸 활성화 +@SpringBootTest +class LiftPenaltyJobConfigurationTest { + + @Autowired + private JobLauncherTestUtils jobLauncherTestUtils; + @Autowired + private JdbcTemplate jdbcTemplate; + + @Qualifier("liftPenaltyJob") + @Autowired + private Job liftPenaltyJob; + + @BeforeEach + void setUp() { + jobLauncherTestUtils.setJob(liftPenaltyJob); + // 데이터 생성 + jdbcTemplate.update("INSERT INTO member " + + "(id, auth_id, auth_type, birth_date, device_token, exchange_count, " + + "gender, insight_count, is_deleted, is_login, nickname, refresh_token, " + + "accused_count, penalty_from, penalty_to, rejected_count, status) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", + UUID.randomUUID().toString(), + "1111222227", + "KAKAO", + null, + null, + 0, + 0, + 0, + 0, + 1, + "nickname_test567", + null, + 10, + LocalDate.now().minusDays(3), + LocalDate.now().minusDays(1), + 0, + "TEMPORARY_BANNED"); + } + + @Test + void liftPenaltyJob() throws Exception { + // Given: 배치 실행을 위한 파라미터 설정 + JobParameters jobParameters = new JobParametersBuilder() + .addLong("time", System.currentTimeMillis()) + .toJobParameters(); + + // When: 배치 실행 + JobExecution jobExecution = jobLauncherTestUtils.launchJob(jobParameters); + + // Then: 배치가 정상적으로 완료되었는지 검증 + Assertions.assertThat(jobExecution.getStatus()).isEqualTo(BatchStatus.COMPLETED); + Assertions.assertThat(jobExecution.getExitStatus()).isEqualTo(ExitStatus.COMPLETED); + + Collection stepExecutions = jobExecution.getStepExecutions(); + for (StepExecution stepExecution : stepExecutions) { + Assertions.assertThat(stepExecution.getReadCount()).isEqualTo(1); + Assertions.assertThat(stepExecution.getCommitCount()).isEqualTo(1); + Assertions.assertThat(stepExecution.getWriteCount()).isEqualTo(1); + } + } +} diff --git a/batch/src/test/resources/schema.sql b/batch/src/test/resources/schema.sql new file mode 100644 index 00000000..f7f85194 --- /dev/null +++ b/batch/src/test/resources/schema.sql @@ -0,0 +1,94 @@ +CREATE TABLE IF NOT EXISTS exchange_request ( + member_coupon_id BIGINT DEFAULT NULL, + request_member_snapshot_id BIGINT DEFAULT NULL, + requested_at TIMESTAMP NOT NULL, + requested_snapshot_id BIGINT NOT NULL, + responded_at TIMESTAMP DEFAULT NULL, + id VARCHAR(36) NOT NULL, + request_member_id VARCHAR(36) NOT NULL, + request_member_insight_id VARCHAR(36) DEFAULT NULL, + requested_insight_id VARCHAR(36) NOT NULL, + requested_member_id VARCHAR(36) NOT NULL, + status VARCHAR(20) NOT NULL, + PRIMARY KEY (id) +); + +-- Autogenerated: do not edit this file + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY , + VERSION BIGINT , + JOB_NAME VARCHAR(100) NOT NULL, + JOB_KEY VARCHAR(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY , + VERSION BIGINT , + JOB_INSTANCE_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP(9) NOT NULL, + START_TIME TIMESTAMP(9) DEFAULT NULL , + END_TIME TIMESTAMP(9) DEFAULT NULL , + STATUS VARCHAR(10) , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED TIMESTAMP(9), + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID BIGINT NOT NULL , + PARAMETER_NAME VARCHAR(100) NOT NULL , + PARAMETER_TYPE VARCHAR(100) NOT NULL , + PARAMETER_VALUE VARCHAR(2500) , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY , + VERSION BIGINT NOT NULL, + STEP_NAME VARCHAR(100) NOT NULL, + JOB_EXECUTION_ID BIGINT NOT NULL, + CREATE_TIME TIMESTAMP(9) NOT NULL, + START_TIME TIMESTAMP(9) DEFAULT NULL , + END_TIME TIMESTAMP(9) DEFAULT NULL , + STATUS VARCHAR(10) , + COMMIT_COUNT BIGINT , + READ_COUNT BIGINT , + FILTER_COUNT BIGINT , + WRITE_COUNT BIGINT , + READ_SKIP_COUNT BIGINT , + WRITE_SKIP_COUNT BIGINT , + PROCESS_SKIP_COUNT BIGINT , + ROLLBACK_COUNT BIGINT , + EXIT_CODE VARCHAR(2500) , + EXIT_MESSAGE VARCHAR(2500) , + LAST_UPDATED TIMESTAMP(9), + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR(2500) NOT NULL, + SERIALIZED_CONTEXT LONGVARCHAR , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; +CREATE SEQUENCE BATCH_JOB_SEQ; + diff --git a/build.gradle b/build.gradle index 012180bd..80bd611a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,28 +1,27 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.3.4' - id 'io.spring.dependency-management' version '1.1.6' + id 'org.springframework.boot' version '3.3.4' apply false + id 'io.spring.dependency-management' version '1.1.6' apply false } repositories { mavenCentral() } -bootJar { - enabled = false -} -jar { - enabled = true -} - subprojects { group = 'com.project.imdang' version = '0.0.1-SNAPSHOT' apply plugin: 'java' - apply plugin: 'org.springframework.boot' + apply plugin: 'java-library' apply plugin: 'io.spring.dependency-management' + dependencyManagement { + imports { + mavenBom "org.springframework.boot:spring-boot-dependencies:3.3.4" + } + } + java { toolchain { languageVersion = JavaLanguageVersion.of(17) @@ -41,11 +40,9 @@ subprojects { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-logging' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' - compileOnly 'org.projectlombok:lombok' -// developmentOnly 'org.springframework.boot:spring-boot-devtools' - annotationProcessor 'org.projectlombok:lombok' + implementation 'org.projectlombok:lombok:1.18.24' + annotationProcessor 'org.projectlombok:lombok:1.18.24' + testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } @@ -54,298 +51,3 @@ subprojects { useJUnitPlatform() } } - -project(':imdang-container') { - dependencies { - implementation project(':insight-service:insight-container') - implementation project(':insight-service:insight-application') - implementation project(':insight-service:insight-persistence') - implementation project(':insight-service:insight-domain:insight-application-service') - implementation project(':insight-service:insight-domain:insight-domain-core') - - implementation project(':member-service:member-container') - implementation project(':member-service:member-application') - implementation project(':member-service:member-persistence') - implementation project(':member-service:member-domain:member-application-service') - implementation project(':member-service:member-domain:member-domain-core') - - implementation project(':setting-service:setting-container') - implementation project(':setting-service:setting-application') - implementation project(':setting-service:setting-persistence') - implementation project(':setting-service:setting-domain:setting-application-service') - implementation project(':setting-service:setting-domain:setting-domain-core') - - implementation project(':common:common-application') - implementation project(':common:common-domain:common-application-service') - implementation project(':common:common-domain:common-domain-core') - - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'com.github.napstr:logback-discord-appender:1.0.0' - } -} - -project(':common:common-application') { - dependencies { - implementation 'io.jsonwebtoken:jjwt:0.12.6' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation project(':common:common-domain:common-application-service') - - implementation 'org.springframework.boot:spring-boot-starter-security' - testImplementation 'org.springframework.security:spring-security-test' - } -} - -project(':common:common-domain:common-application-service') { - dependencies { - //JWT - implementation 'io.jsonwebtoken:jjwt:0.12.6' - implementation 'com.auth0:java-jwt:4.0.0' - implementation 'org.bouncycastle:bcpkix-jdk18on:1.72' - - implementation 'org.springframework.data:spring-data-commons' - } -} - -project(':infrastructure:aws:s3') { - dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' - } -} - -project(':infrastructure:event') { - dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' - - implementation project(':common:common-domain:common-domain-core') - } -} - -project(':infrastructure:saga') { - dependencies { - implementation project(':common:common-domain:common-domain-core') - } -} - -project(':infrastructure:feign') { - dependencies { - implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.1.3' - implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' - } -} - -project(':insight-service:insight-domain:insight-domain-core') { - dependencies { - implementation project(':common:common-domain:common-domain-core') - } -} - -project(':insight-service:insight-domain:insight-application-service') { - dependencies { - implementation project(':insight-service:insight-domain:insight-domain-core') - implementation project(':common:common-domain:common-application-service') - implementation project(':common:common-domain:common-domain-core') - - implementation project(':infrastructure:saga') - implementation project(':infrastructure:event') - - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.data:spring-data-commons' - implementation 'org.springframework:spring-tx' - } -} - -project(':insight-service:insight-application') { - dependencies { - implementation project(':insight-service:insight-domain:insight-application-service') - // TODO - CHECK - implementation project(':insight-service:insight-domain:insight-domain-core') - implementation project(':common:common-application') - implementation project(':common:common-domain:common-domain-core') - - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.data:spring-data-commons' - - implementation 'org.springframework.boot:spring-boot-starter-security' - } -} - -project(':insight-service:insight-persistence') { - dependencies { - implementation project(':insight-service:insight-domain:insight-application-service') - implementation project(':insight-service:insight-domain:insight-domain-core') -// implementation project(':common:common-application') - implementation project(':common:common-domain:common-domain-core') - - implementation project(':infrastructure:aws:s3') - implementation project(':infrastructure:feign') - - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' - runtimeOnly 'com.mysql:mysql-connector-j' - - implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0' - } -} - -project(':insight-service:insight-container') { - dependencies { - implementation project(':insight-service:insight-application') - implementation project(':insight-service:insight-persistence') - implementation project(':insight-service:insight-domain:insight-application-service') - implementation project(':insight-service:insight-domain:insight-domain-core') - - implementation project(':common:common-domain:common-application-service') - implementation project(':common:common-domain:common-domain-core') - - implementation 'org.springframework.boot:spring-boot-starter' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' - implementation 'org.apache.httpcomponents.client5:httpclient5:5.2.1' - } -} - -project(':member-service:member-domain:member-domain-core') { - dependencies { - implementation project(':common:common-domain:common-domain-core') - } -} - -project(':member-service:member-domain:member-application-service') { - dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'io.jsonwebtoken:jjwt:0.12.6' - implementation 'com.auth0:java-jwt:4.0.0' - implementation 'org.bouncycastle:bcpkix-jdk18on:1.72' - - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.data:spring-data-commons' - implementation 'org.springframework:spring-tx' - - implementation project(':member-service:member-domain:member-domain-core') - implementation project(':common:common-domain:common-application-service') - implementation project(':common:common-domain:common-domain-core') - } -} - -project(':member-service:member-application') { - dependencies { - implementation project(':member-service:member-domain:member-application-service') - implementation project(':member-service:member-domain:member-domain-core') - implementation project(':common:common-application') - implementation project(':common:common-domain:common-domain-core') - - implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.data:spring-data-commons' - } -} - -project(':member-service:member-persistence') { - dependencies { - implementation project(':member-service:member-domain:member-application-service') - implementation project(':member-service:member-domain:member-domain-core') - implementation project(':common:common-domain:common-domain-core') - - implementation project(':infrastructure:feign') - - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' - runtimeOnly 'com.mysql:mysql-connector-j' - } -} - -project(':member-service:member-container') { - dependencies { - implementation project(':member-service:member-application') - implementation project(':member-service:member-persistence') - implementation project(':member-service:member-domain:member-application-service') - implementation project(':member-service:member-domain:member-domain-core') - - implementation project(':common:common-domain:common-application-service') - implementation project(':common:common-domain:common-domain-core') - - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - } -} - -project(':setting-service:setting-domain:setting-domain-core') { - dependencies { - implementation project(':common:common-domain:common-domain-core') - } -} - -project(':setting-service:setting-domain:setting-application-service') { - dependencies { - implementation project(':setting-service:setting-domain:setting-domain-core') - implementation project(':common:common-domain:common-application-service') - implementation project(':common:common-domain:common-domain-core') - - implementation project(':infrastructure:event') - - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.data:spring-data-commons' - implementation 'org.springframework:spring-tx' - implementation 'org.springframework.retry:spring-retry' - implementation 'org.springframework:spring-aspects' - - implementation 'com.google.firebase:firebase-admin:9.2.0' - } -} - -project(':setting-service:setting-application') { - dependencies { - implementation project(':setting-service:setting-domain:setting-application-service') - implementation project(':setting-service:setting-domain:setting-domain-core') - implementation project(':common:common-application') - implementation project(':common:common-domain:common-domain-core') - - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.data:spring-data-commons' - - implementation 'org.springframework.boot:spring-boot-starter-security' - } -} - -project(':setting-service:setting-persistence') { - dependencies { - implementation project(':setting-service:setting-domain:setting-application-service') - implementation project(':setting-service:setting-domain:setting-domain-core') -// implementation project(':common:common-application') - implementation project(':common:common-domain:common-domain-core') - - implementation project(':infrastructure:feign') - - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' - runtimeOnly 'com.mysql:mysql-connector-j' - - implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0' - } -} - -project(':setting-service:setting-container') { - dependencies { - implementation project(':setting-service:setting-application') - implementation project(':setting-service:setting-persistence') - implementation project(':setting-service:setting-domain:setting-application-service') - implementation project(':setting-service:setting-domain:setting-domain-core') - - implementation project(':common:common-domain:common-application-service') - implementation project(':common:common-domain:common-domain-core') - - implementation 'org.springframework.boot:spring-boot-starter' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' - - implementation 'com.google.firebase:firebase-admin:9.2.0' - - testImplementation 'org.springframework.security:spring-security-test' - } -} diff --git a/common/build.gradle b/common/build.gradle new file mode 100644 index 00000000..e69de29b diff --git a/common/common-application/build.gradle b/common/common-application/build.gradle index c049d055..e5053dd7 100644 --- a/common/common-application/build.gradle +++ b/common/common-application/build.gradle @@ -1,6 +1,9 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + + testImplementation 'org.springframework.security:spring-security-test' } diff --git a/common/common-application/src/main/java/com/project/imdang/application/handler/ErrorDTO.java b/common/common-application/src/main/java/com/project/imdang/application/handler/ErrorDTO.java deleted file mode 100644 index 3323cf48..00000000 --- a/common/common-application/src/main/java/com/project/imdang/application/handler/ErrorDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.project.imdang.application.handler; - -import com.project.imdang.application.security.ErrorCode; -import lombok.Builder; -import lombok.Getter; -import org.springframework.http.HttpStatus; - -@Getter -public class ErrorDTO { - private final String code; - private final String message; - - @Builder - private ErrorDTO(String code, String message) { - this.code = code; - this.message = message; - } - - public static ErrorDTO of(HttpStatus status, String message) { - return ErrorDTO.builder() - .code(status.getReasonPhrase()) - .message(message) - .build(); - } - - public static ErrorDTO of(ErrorCode errorCode) { - return ErrorDTO.builder() - .code(errorCode.getErrorCode()) - .message(errorCode.getMessage()) - .build(); - } -} diff --git a/common/common-application/src/main/java/com/project/imdang/common/application/Property.java b/common/common-application/src/main/java/com/project/imdang/common/application/Property.java new file mode 100644 index 00000000..fc986fa3 --- /dev/null +++ b/common/common-application/src/main/java/com/project/imdang/common/application/Property.java @@ -0,0 +1,9 @@ +package com.project.imdang.common.application; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class Property { + public static final String DEFAULT_SI_DO = "서울특별시"; +} diff --git a/common/common-application/src/main/java/com/project/imdang/common/application/dto/PagingRequest.java b/common/common-application/src/main/java/com/project/imdang/common/application/dto/PagingRequest.java new file mode 100644 index 00000000..2d348b02 --- /dev/null +++ b/common/common-application/src/main/java/com/project/imdang/common/application/dto/PagingRequest.java @@ -0,0 +1,11 @@ +package com.project.imdang.common.application.dto; + +import lombok.Getter; + +@Getter +public abstract class PagingRequest { + private Integer pageNumber; + private Integer pageSize; + private String direction; + private String[] properties; +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ExternalApiException.java b/common/common-application/src/main/java/com/project/imdang/common/application/exception/ExternalApiException.java similarity index 77% rename from insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ExternalApiException.java rename to common/common-application/src/main/java/com/project/imdang/common/application/exception/ExternalApiException.java index 4e782192..a6e8f2d4 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ExternalApiException.java +++ b/common/common-application/src/main/java/com/project/imdang/common/application/exception/ExternalApiException.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.application.client; +package com.project.imdang.common.application.exception; public class ExternalApiException extends RuntimeException { private final Integer code; diff --git a/common/common-application/src/main/java/com/project/imdang/common/application/response/ErrorResponse.java b/common/common-application/src/main/java/com/project/imdang/common/application/response/ErrorResponse.java new file mode 100644 index 00000000..43b81166 --- /dev/null +++ b/common/common-application/src/main/java/com/project/imdang/common/application/response/ErrorResponse.java @@ -0,0 +1,39 @@ +package com.project.imdang.common.application.response; + +import com.project.imdang.common.application.response.code.ErrorCode; +import lombok.Builder; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public class ErrorResponse { + private final String code; + private final String message; + + @Builder + private ErrorResponse(String code, String message) { + this.code = code; + this.message = message; + } + + public static ErrorResponse of(HttpStatus status, String message) { + return ErrorResponse.builder() + .code(status.getReasonPhrase()) + .message(message) + .build(); + } + + public static ErrorResponse of(ErrorCode errorCode) { + return ErrorResponse.builder() + .code(errorCode.getErrorCode()) + .message(errorCode.getMessage()) + .build(); + } + + public static ErrorResponse of(ErrorCode errorCode, String message) { + return ErrorResponse.builder() + .code(errorCode.getErrorCode()) + .message(message) + .build(); + } +} diff --git a/common/common-application/src/main/java/com/project/imdang/application/security/ErrorCode.java b/common/common-application/src/main/java/com/project/imdang/common/application/response/code/ErrorCode.java similarity index 78% rename from common/common-application/src/main/java/com/project/imdang/application/security/ErrorCode.java rename to common/common-application/src/main/java/com/project/imdang/common/application/response/code/ErrorCode.java index d3b4c0b9..5d4f6905 100644 --- a/common/common-application/src/main/java/com/project/imdang/application/security/ErrorCode.java +++ b/common/common-application/src/main/java/com/project/imdang/common/application/response/code/ErrorCode.java @@ -1,4 +1,4 @@ -package com.project.imdang.application.security; +package com.project.imdang.common.application.response.code; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -7,6 +7,13 @@ @Getter @RequiredArgsConstructor public enum ErrorCode { + + INVALID_REQUEST("", HttpStatus.BAD_REQUEST, "Invalid Request"), + NOT_FOUND("", HttpStatus.NOT_FOUND, "Not Found"), + ALREADY_EXIST("", HttpStatus.CONFLICT, "Already Exist"), + INTERNAL_SERVER_ERROR("", HttpStatus.INTERNAL_SERVER_ERROR, "Internal Server Error"), + + UNKNOWN_ERROR("J001", HttpStatus.INTERNAL_SERVER_ERROR, "예상치 못한 오류가 발생했습니다."), MAL_FORMED_TOKEN("J002", HttpStatus.UNAUTHORIZED, "잘못된 JWT 서명입니다."), EXPIRED_TOKEN("J003", HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."), diff --git a/common/common-application/src/main/java/com/project/imdang/common/application/response/handler/GlobalExceptionHandler.java b/common/common-application/src/main/java/com/project/imdang/common/application/response/handler/GlobalExceptionHandler.java new file mode 100644 index 00000000..66278ec2 --- /dev/null +++ b/common/common-application/src/main/java/com/project/imdang/common/application/response/handler/GlobalExceptionHandler.java @@ -0,0 +1,82 @@ +package com.project.imdang.common.application.response.handler; + +import com.project.imdang.common.application.response.ErrorResponse; +import com.project.imdang.common.application.response.code.ErrorCode; +import com.project.imdang.common.domain.exception.DomainAlreadyExistException; +import com.project.imdang.common.domain.exception.DomainException; +import com.project.imdang.common.domain.exception.DomainNotFoundException; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.ValidationException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.util.stream.Collectors; + +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + + @ExceptionHandler(DomainException.class) + public ResponseEntity handleDomainException(DomainException ex) { + ErrorCode invalidRequest = ErrorCode.INVALID_REQUEST; + ErrorResponse errorResponse = ErrorResponse.of(invalidRequest, ex.getMessage()); + return new ResponseEntity<>(errorResponse, invalidRequest.getHttpStatus()); + } + + @ExceptionHandler(DomainNotFoundException.class) + public ResponseEntity handleDomainNotFoundException(DomainNotFoundException ex) { + ErrorCode notFound = ErrorCode.NOT_FOUND; + ErrorResponse errorResponse = ErrorResponse.of(notFound, ex.getMessage()); + return new ResponseEntity<>(errorResponse, notFound.getHttpStatus()); + } + + @ExceptionHandler(DomainAlreadyExistException.class) + public ResponseEntity handleDomainAlreadyExistException(DomainAlreadyExistException ex) { + ErrorCode alreadyExist = ErrorCode.ALREADY_EXIST; + ErrorResponse errorResponse = ErrorResponse.of(alreadyExist, ex.getMessage()); + return new ResponseEntity<>(errorResponse, alreadyExist.getHttpStatus()); + } + + @ExceptionHandler(ValidationException.class) + public ResponseEntity handleValidationException(ValidationException ex) { + + ErrorCode invalidRequest = ErrorCode.INVALID_REQUEST; + + String message; + if (ex instanceof ConstraintViolationException) { + message = extractViolationsFromException((ConstraintViolationException) ex); + } else { + message = ex.getMessage(); + } + +// log.error(message, ex); + ErrorResponse errorResponse = ErrorResponse.of(invalidRequest, message); + return new ResponseEntity<>(errorResponse, invalidRequest.getHttpStatus()); + } + + private String extractViolationsFromException(ConstraintViolationException validationException) { + return validationException.getConstraintViolations() + .stream() + .map(ConstraintViolation::getMessage) + .collect(Collectors.joining("--")); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) { + ErrorCode invalidRequest = ErrorCode.INVALID_REQUEST; + String message = "Please input " + ex.getParameter().getParameterName(); + ErrorResponse errorResponse = ErrorResponse.of(invalidRequest, message); + return new ResponseEntity<>(errorResponse, invalidRequest.getHttpStatus()); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception ex) { + ErrorCode internalServerError = ErrorCode.INTERNAL_SERVER_ERROR; + ErrorResponse errorResponse = ErrorResponse.of(internalServerError, ex.getMessage()); + return new ResponseEntity<>(errorResponse, internalServerError.getHttpStatus()); + } +} diff --git a/common/common-application/src/main/resources/application.properties b/common/common-application/src/main/resources/application.properties deleted file mode 100644 index 19b68d70..00000000 --- a/common/common-application/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=common-application diff --git a/common/common-domain/build.gradle b/common/common-domain/build.gradle new file mode 100644 index 00000000..e69de29b diff --git a/common/common-domain/common-application-service/build.gradle b/common/common-domain/common-application-service/build.gradle index c049d055..06d10549 100644 --- a/common/common-domain/common-application-service/build.gradle +++ b/common/common-domain/common-application-service/build.gradle @@ -1,6 +1,6 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':common:common-domain:common-domain-core') + implementation 'org.springframework.data:spring-data-commons' + + implementation 'org.springframework.boot:spring-boot-starter' } diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/dto/PagingQuery.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/dto/PagingQuery.java new file mode 100644 index 00000000..89845c18 --- /dev/null +++ b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/dto/PagingQuery.java @@ -0,0 +1,13 @@ +package com.project.imdang.common.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public abstract class PagingQuery { + protected Integer pageNumber; + protected Integer pageSize; + protected String direction; + protected String[] properties; +} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/DomainEventMessageListener.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/DomainEventMessageListener.java new file mode 100644 index 00000000..dcac8f6c --- /dev/null +++ b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/DomainEventMessageListener.java @@ -0,0 +1,22 @@ +package com.project.imdang.common.domain.event; + +import org.springframework.context.event.EventListener; + +public abstract class DomainEventMessageListener { + + public abstract void process(E domainEventMessage); + + @EventListener + public void handle(E domainEventMessage) { + try { + process(domainEventMessage); + } catch (Exception e) { + // TODO - CHECK : 보상 트랜잭션에서 또 에러가 나면? +// log.error(e.getMessage(), e); +// DomainRollbackEventMessage domainRollbackEventMessage = domainEventMessage.getRollbackEventMessage(e.getMessage()); +// rollbackEventPublisher.publishEvent(domainRollbackEventMessage); + + throw new RuntimeException("Error!"); + } + } +} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/DomainEventMessagePublisher.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/DomainEventMessagePublisher.java new file mode 100644 index 00000000..3980ddbf --- /dev/null +++ b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/DomainEventMessagePublisher.java @@ -0,0 +1,5 @@ +package com.project.imdang.common.domain.event; + +public interface DomainEventMessagePublisher { + void publish(E domainEventMessage); +} diff --git a/infrastructure/event/src/main/java/com/project/imdang/event/EventEntry.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventEntry.java similarity index 89% rename from infrastructure/event/src/main/java/com/project/imdang/event/EventEntry.java rename to common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventEntry.java index 308b17f4..b8de8cc0 100644 --- a/infrastructure/event/src/main/java/com/project/imdang/event/EventEntry.java +++ b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventEntry.java @@ -1,4 +1,4 @@ -package com.project.imdang.event; +package com.project.imdang.common.domain.event.entry; import lombok.Builder; import lombok.Getter; @@ -7,7 +7,6 @@ @Getter public class EventEntry { -// private Long id; private final String type; private final String contentType; private final String payload; diff --git a/infrastructure/event/src/main/java/com/project/imdang/event/EventListener.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventListener.java similarity index 58% rename from infrastructure/event/src/main/java/com/project/imdang/event/EventListener.java rename to common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventListener.java index fd498e2d..66665939 100644 --- a/infrastructure/event/src/main/java/com/project/imdang/event/EventListener.java +++ b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventListener.java @@ -1,4 +1,4 @@ -package com.project.imdang.event; +package com.project.imdang.common.domain.event.entry; public interface EventListener { void process(EventEntry eventEntry); diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventProcessor.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventProcessor.java new file mode 100644 index 00000000..23d8c0b0 --- /dev/null +++ b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/event/entry/EventProcessor.java @@ -0,0 +1,7 @@ +package com.project.imdang.common.domain.event.entry; + +import com.project.imdang.domain.event.DomainEvent; + +public interface EventProcessor { + void process(T event); +} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/utils/PagingUtils.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/utils/PagingUtils.java similarity index 95% rename from common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/utils/PagingUtils.java rename to common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/utils/PagingUtils.java index e1b42257..a1c3464d 100644 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/utils/PagingUtils.java +++ b/common/common-domain/common-application-service/src/main/java/com/project/imdang/common/domain/utils/PagingUtils.java @@ -1,4 +1,4 @@ -package com.project.imdang.domain.utils; +package com.project.imdang.common.domain.utils; import lombok.AccessLevel; import lombok.NoArgsConstructor; diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestAcceptedCountRequestMessage.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestAcceptedCountRequestMessage.java deleted file mode 100644 index ab96745c..00000000 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestAcceptedCountRequestMessage.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.domain.message; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class ExchangeRequestAcceptedCountRequestMessage { - private UUID memberId; -} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestCreatedRequestMessage.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestCreatedRequestMessage.java deleted file mode 100644 index 07a4c8e5..00000000 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestCreatedRequestMessage.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.imdang.domain.message; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class ExchangeRequestCreatedRequestMessage { - private Long memberCouponId; -} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestRejectedCountRequestMessage.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestRejectedCountRequestMessage.java deleted file mode 100644 index 2c28744d..00000000 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestRejectedCountRequestMessage.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.domain.message; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class ExchangeRequestRejectedCountRequestMessage { - private UUID memberId; -} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestRejectedRequestMessage.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestRejectedRequestMessage.java deleted file mode 100644 index f1943980..00000000 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/ExchangeRequestRejectedRequestMessage.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.imdang.domain.message; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class ExchangeRequestRejectedRequestMessage { - private Long memberCouponId; -} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/InsightAccusedRequestMessage.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/InsightAccusedRequestMessage.java deleted file mode 100644 index 56c94e32..00000000 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/InsightAccusedRequestMessage.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.domain.message; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class InsightAccusedRequestMessage { - private UUID accusedMemberId; -} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/InsightCreatedCountRequestMessage.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/InsightCreatedCountRequestMessage.java deleted file mode 100644 index 162ba4aa..00000000 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/InsightCreatedCountRequestMessage.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.domain.message; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class InsightCreatedCountRequestMessage { - private UUID memberId; -} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberCouponCancelledResponseMessage.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberCouponCancelledResponseMessage.java deleted file mode 100644 index 7bdbc0e3..00000000 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberCouponCancelledResponseMessage.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.domain.message; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class MemberCouponCancelledResponseMessage { - private boolean isCompleted; - private Long memberCouponId; -} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberCouponUsedResponseMessage.java b/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberCouponUsedResponseMessage.java deleted file mode 100644 index ebfafee0..00000000 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberCouponUsedResponseMessage.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.domain.message; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class MemberCouponUsedResponseMessage { - private boolean isCompleted; - private Long memberCouponId; -} diff --git a/common/common-domain/common-application-service/src/main/resources/application.properties b/common/common-domain/common-application-service/src/main/resources/application.properties deleted file mode 100644 index 1c67771a..00000000 --- a/common/common-domain/common-application-service/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=common-application-service diff --git a/common/common-domain/common-domain-core/build.gradle b/common/common-domain/common-domain-core/build.gradle index c049d055..e69de29b 100644 --- a/common/common-domain/common-domain-core/build.gradle +++ b/common/common-domain/common-domain-core/build.gradle @@ -1,6 +0,0 @@ -bootJar { - enabled = false -} -jar { - enabled = true -} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/entity/AggregateRoot.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/entity/AggregateRoot.java similarity index 58% rename from common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/entity/AggregateRoot.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/entity/AggregateRoot.java index 5d334a53..777558cf 100644 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/entity/AggregateRoot.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/entity/AggregateRoot.java @@ -1,4 +1,4 @@ -package com.project.imdang.domain.entity; +package com.project.imdang.common.domain.entity; public abstract class AggregateRoot extends BaseEntity { } diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/entity/BaseEntity.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/entity/BaseEntity.java similarity index 91% rename from common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/entity/BaseEntity.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/entity/BaseEntity.java index 00e83a31..3a045462 100644 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/entity/BaseEntity.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/entity/BaseEntity.java @@ -1,4 +1,4 @@ -package com.project.imdang.domain.entity; +package com.project.imdang.common.domain.entity; import java.util.Objects; diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/event/DomainEventMessage.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/event/DomainEventMessage.java new file mode 100644 index 00000000..f318fc06 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/event/DomainEventMessage.java @@ -0,0 +1,4 @@ +package com.project.imdang.common.domain.event; + +public interface DomainEventMessage { +} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainAlreadyExistException.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainAlreadyExistException.java new file mode 100644 index 00000000..d1add825 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainAlreadyExistException.java @@ -0,0 +1,12 @@ +package com.project.imdang.common.domain.exception; + +public class DomainAlreadyExistException extends RuntimeException { + + public DomainAlreadyExistException(String message) { + super(message); + } + + public DomainAlreadyExistException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainErrorCode.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainErrorCode.java new file mode 100644 index 00000000..a6bb59f2 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainErrorCode.java @@ -0,0 +1,12 @@ +package com.project.imdang.common.domain.exception; + +public enum DomainErrorCode { + +// MEMBER_NOT_EXIST, + MEMBER_5ACCUSED, + MEMBER_15ACCUSED, +// ALREADY_ACCUSED, +// ALREADY_RECOMMENDED, + + MEMBER_ACCUSE_FAILED, +} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/DomainException.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainException.java similarity index 81% rename from common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/DomainException.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainException.java index 5d6aca36..5270e6c9 100644 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/DomainException.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainException.java @@ -1,4 +1,4 @@ -package com.project.imdang.domain.exception; +package com.project.imdang.common.domain.exception; public class DomainException extends RuntimeException { diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainNotFoundException.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainNotFoundException.java new file mode 100644 index 00000000..d7115b98 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/exception/DomainNotFoundException.java @@ -0,0 +1,12 @@ +package com.project.imdang.common.domain.exception; + +public class DomainNotFoundException extends RuntimeException { + + public DomainNotFoundException(String message) { + super(message); + } + + public DomainNotFoundException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Access.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Access.java similarity index 52% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Access.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Access.java index 5eb8b635..a495cc14 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Access.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Access.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; public enum Access { 제한됨, 허락시_가능, 자유로움 diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Address.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Address.java similarity index 72% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Address.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Address.java index a3d055ed..6b70b5fd 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Address.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Address.java @@ -1,7 +1,5 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -15,20 +13,10 @@ @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) public class Address { - @Schema(description = "시/도", example = "서울특별시") - @NotBlank private String siDo; // 시/도 (예: 서울특별시) - @Schema(description = "시/군/구", example = "종로구") - @NotBlank private String siGunGu; // 시/군/구 (예: 종로구) - @Schema(description = "읍/면/동", example = "효제동") - @NotBlank private String eupMyeonDong; // 읍/면/동 (예: 효제동) - @Schema(description = "도로명") -// @NotBlank private String roadName; // 도로명 - @Schema(description = "번지", example = "191") -// @NotBlank private String buildingNumber; // 번지 (예: 191) private String detail; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ApartmentComplex.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ApartmentComplex.java similarity index 91% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ApartmentComplex.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ApartmentComplex.java index 2c4c8c64..c683aa31 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ApartmentComplex.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ApartmentComplex.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/BaseId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/BaseId.java similarity index 91% rename from common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/BaseId.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/BaseId.java index 97187349..350186b6 100644 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/BaseId.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/BaseId.java @@ -1,4 +1,4 @@ -package com.project.imdang.domain.valueobject; +package com.project.imdang.common.domain.valueobject; import java.util.Objects; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ComplexEnvironment.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ComplexEnvironment.java similarity index 51% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ComplexEnvironment.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ComplexEnvironment.java index 69eaa0e5..2cde09eb 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ComplexEnvironment.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ComplexEnvironment.java @@ -1,7 +1,5 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -14,21 +12,10 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ComplexEnvironment { // 건물 - @Schema(description = "건물") - @NotNull private ObjectiveItem buildingCondition; // 안전 - @Schema(description = "안전") - @NotNull private ObjectiveItem security; // 어린이 시설 - @Schema(description = "어린시 시설") - @NotNull private ObjectiveItem childrenFacility; - // 경로 시설 - @Schema(description = "경로 시설") - @NotNull - private ObjectiveItem seniorFacility; private String text; - } diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/District.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/District.java similarity index 63% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/District.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/District.java index bb82a6ef..64386ace 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/District.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/District.java @@ -1,31 +1,19 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; import java.util.Objects; @Getter @Builder @AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) public class District { - @Schema(description = "시/도", example = "서울특별시") - @NotBlank private String siDo; // 시/도 (예: 서울특별시) - @Schema(description = "시/군/구", example = "종로구") - @NotBlank private String siGunGu; // 시/군/구 (예: 종로구) - @Schema(description = "읍/면/동", example = "효제동") - @NotBlank private String eupMyeonDong; // 읍/면/동 (예: 효제동) - private String code; @Override diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/File.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/File.java new file mode 100644 index 00000000..e7ec00b7 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/File.java @@ -0,0 +1,14 @@ +package com.project.imdang.common.domain.valueobject; + +import lombok.Builder; + +import java.io.InputStream; + +@Builder +public record File( + String originalFilename, + long size, + String contentType, + InputStream inputStream +) { +} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/Gender.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Gender.java similarity index 88% rename from member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/Gender.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Gender.java index f61c6cda..6cf0d287 100644 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/Gender.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Gender.java @@ -1,4 +1,4 @@ -package com.project.imdang.member.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; import lombok.RequiredArgsConstructor; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Infra.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Infra.java similarity index 55% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Infra.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Infra.java index c63af0ff..2713477d 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Infra.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Infra.java @@ -1,7 +1,5 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -17,34 +15,16 @@ public class Infra { // 교통 - @Schema(description = "교통") - @NotNull private Set transportations; // 학군 - @Schema(description = "학군") - @NotNull private Set schoolDistricts; // 생활 편의시설 - @Schema(description = "생활 편의 시설") - @NotNull private Set amenities; // 문화 및 여가시설(단지 외부) - @Schema(description = "문화 및 여가 시설") - @NotNull private Set facilities; // 주변 환경 - @Schema(description = "주변 환경") - @NotNull private Set surroundings; - // 랜드마크 - @Schema(description = "랜드 마크") - @NotNull - private Set landmarks; - // 기피시설 - @Schema(description = "기피 시설") - @NotNull - private Set unpleasantFacilities; - @Schema(description = "인프라 총평") + private String text; public enum Transportation { @@ -66,12 +46,4 @@ public enum Facility { public enum Surroundings { 해당_없음, 강, 바다, 산, 공원, 산책로, 교회, 성당, 식당가, 시장 } - - public enum Landmark { - 해당_없음, 놀이공원, 복합_쇼핑몰, 고궁, 전망대, 국립공원, 한옥마을, 사찰, 미술관, 박물관 - } - - public enum UnpleasantFacility { - 해당_없음, 고속도로, 철도, 유흥거리, 산업단지, 공장, 쓰레기_소각장, 고층_건물, 공사중_건물 - } } diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/InsightId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/InsightId.java similarity index 71% rename from common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/InsightId.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/InsightId.java index 89686426..3b777c96 100644 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/InsightId.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/InsightId.java @@ -1,4 +1,4 @@ -package com.project.imdang.domain.valueobject; +package com.project.imdang.common.domain.valueobject; import java.util.UUID; diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/MemberId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/MemberId.java similarity index 71% rename from common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/MemberId.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/MemberId.java index 78a04ff7..9e8d7e17 100644 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/MemberId.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/MemberId.java @@ -1,4 +1,4 @@ -package com.project.imdang.domain.valueobject; +package com.project.imdang.common.domain.valueobject; import java.util.UUID; diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/MemberStatus.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/MemberStatus.java similarity index 56% rename from member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/MemberStatus.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/MemberStatus.java index 98049e83..122d7898 100644 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/MemberStatus.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/MemberStatus.java @@ -1,8 +1,6 @@ -package com.project.imdang.member.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; public enum MemberStatus { - // 교환 불가 - EXCHANGE_RESTRICTED, // 이용 정지 TEMPORARY_BANNED, // 계정 정지 diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/NotificationCategory.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/NotificationCategory.java new file mode 100644 index 00000000..418b639b --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/NotificationCategory.java @@ -0,0 +1,27 @@ +package com.project.imdang.common.domain.valueobject; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +@Getter +@AllArgsConstructor +public enum NotificationCategory { + RECOMMENDED("추천", + "RecommendedEvent", + "내 인사이트가 추천받았어요\uD83E\uDD13 지금 눌러서 확인하기.", + "%s님이 인사이트를 추천했어요."); + + private final String title; + private final String type; + private final String pushNotificationContent; + private final String notificationContent; + + public static NotificationCategory getType(String type) { + return Arrays.stream(NotificationCategory.values()) + .filter(t -> t.getType().equals(type)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("Not exist NotificationType")); + } +} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/NotificationId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/NotificationId.java similarity index 51% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/NotificationId.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/NotificationId.java index 76069655..a3546d27 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/NotificationId.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/NotificationId.java @@ -1,6 +1,6 @@ -package com.project.imdang.setting.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; -import com.project.imdang.domain.valueobject.BaseId; +import com.project.imdang.common.domain.valueobject.BaseId; public class NotificationId extends BaseId { public NotificationId(Long value) { diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/OAuthType.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/OAuthType.java new file mode 100644 index 00000000..9f2f9273 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/OAuthType.java @@ -0,0 +1,5 @@ +package com.project.imdang.common.domain.valueobject; + +public enum OAuthType { + KAKAO, APPLE, GOOGLE, MOCK +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ObjectiveItem.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ObjectiveItem.java similarity index 63% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ObjectiveItem.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ObjectiveItem.java index d5a3ae60..966fc28c 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ObjectiveItem.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/ObjectiveItem.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; public enum ObjectiveItem { 잘_모르겠어요, 최고예요, 좋아요, 평범해요, 별로에요 diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Opinion.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Opinion.java similarity index 83% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Opinion.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Opinion.java index 53e536ce..a4aab7a7 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/Opinion.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Opinion.java @@ -1,6 +1,5 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; -import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -9,7 +8,6 @@ @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class Opinion { - @NotNull private T choice; private String text; diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/Penalty.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Penalty.java similarity index 57% rename from member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/Penalty.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Penalty.java index 61db4f66..2bb673bf 100644 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/Penalty.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/Penalty.java @@ -1,17 +1,10 @@ -package com.project.imdang.member.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; import lombok.Getter; -import static com.project.imdang.member.service.domain.valueobject.MemberStatus.EXCHANGE_RESTRICTED; - @Getter public enum Penalty { // TODO - CHECK : vs DB / interface - - // 교환 불가 - 3일 - EXCHANGE_RESTRICTED_3DAYS(EXCHANGE_RESTRICTED, 3), - // 교환 불가 - 5일 - EXCHANGE_RESTRICTED_5DAYS(EXCHANGE_RESTRICTED, 5), // 이용 정지 - 7일 TEMPORARY_BANNED(MemberStatus.TEMPORARY_BANNED, 7), // 계정 정지 diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/PenaltyPeriod.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/PenaltyPeriod.java similarity index 84% rename from member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/PenaltyPeriod.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/PenaltyPeriod.java index 8d92fdc7..3d8ecc91 100644 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/PenaltyPeriod.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/PenaltyPeriod.java @@ -1,4 +1,4 @@ -package com.project.imdang.member.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; import java.time.LocalDate; diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/TermsAgreementId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/TermsAgreementId.java similarity index 52% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/TermsAgreementId.java rename to common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/TermsAgreementId.java index 96f13a87..97ab74ce 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/TermsAgreementId.java +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/TermsAgreementId.java @@ -1,6 +1,6 @@ -package com.project.imdang.setting.service.domain.valueobject; +package com.project.imdang.common.domain.valueobject; -import com.project.imdang.domain.valueobject.BaseId; +import com.project.imdang.common.domain.valueobject.BaseId; public class TermsAgreementId extends BaseId { public TermsAgreementId(Long value) { diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/TermsId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/TermsId.java new file mode 100644 index 00000000..de82ecd0 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/TermsId.java @@ -0,0 +1,9 @@ +package com.project.imdang.common.domain.valueobject; + +import com.project.imdang.common.domain.valueobject.BaseId; + +public class TermsId extends BaseId { + public TermsId(Long value) { + super(value); + } +} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/VisitMethod.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/VisitMethod.java new file mode 100644 index 00000000..256c3310 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/VisitMethod.java @@ -0,0 +1,5 @@ +package com.project.imdang.common.domain.valueobject; + +public enum VisitMethod { + 자차, 대중교통, 도보 +} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/VisitTime.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/VisitTime.java new file mode 100644 index 00000000..dfff6db5 --- /dev/null +++ b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/common/domain/valueobject/VisitTime.java @@ -0,0 +1,5 @@ +package com.project.imdang.common.domain.valueobject; + +public enum VisitTime { + 아침, 점심, 저녁, 밤 +} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/event/EmptyEvent.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/event/EmptyEvent.java deleted file mode 100644 index 96133957..00000000 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/event/EmptyEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.project.imdang.domain.event; - -public final class EmptyEvent implements DomainEvent { - - public static final EmptyEvent INSTANCE = new EmptyEvent(); - - private EmptyEvent() {} -} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/event/publisher/DomainEventPublisher.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/event/publisher/DomainEventPublisher.java deleted file mode 100644 index 3b91fc87..00000000 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/event/publisher/DomainEventPublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.domain.event.publisher; - -import com.project.imdang.domain.event.DomainEvent; - -public interface DomainEventPublisher { - void publish(T domainEvent); -} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/ApplicationServiceException.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/ApplicationServiceException.java deleted file mode 100644 index 4899b37b..00000000 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/ApplicationServiceException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.domain.exception; - -public class ApplicationServiceException extends DomainException { - - public ApplicationServiceException(String message) { - super(message); - } - - public ApplicationServiceException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/ErrorCode.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/ErrorCode.java deleted file mode 100644 index d3a1d6c1..00000000 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/exception/ErrorCode.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.project.imdang.domain.exception; - -public enum ErrorCode { - - MEMBER_NOT_EXIST, - MEMBER_5ACCUSED, - MEMBER_15ACCUSED, - ALREADY_ACCUSED, - ALREADY_RECOMMENDED, - EXCHANGE_REQUIRED, - - // 요청 실패 - EXCHANGE_REQUEST_FAILED, - // 요청 수락 실패 - EXCHANGE_REQUEST_ACCEPT_FAILED, - // 요청 거절 실패 - EXCHANGE_REQUEST_REJECT_FAILED, - - MEMBER_ACCUSE_FAILED, - ALREADY_EXCHANGE_REQUESTED -} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/CouponId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/CouponId.java deleted file mode 100644 index c6f46bb9..00000000 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/CouponId.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.domain.valueobject; - -import java.util.UUID; - -public class CouponId extends BaseId { - public CouponId(UUID value) { - super(value); - } -} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/ExchangeRequestId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/ExchangeRequestId.java deleted file mode 100644 index bca75bda..00000000 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/ExchangeRequestId.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.domain.valueobject; - -import java.util.UUID; - -public class ExchangeRequestId extends BaseId { - public ExchangeRequestId(UUID value) { - super(value); - } -} diff --git a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/MemberCouponId.java b/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/MemberCouponId.java deleted file mode 100644 index 377b659e..00000000 --- a/common/common-domain/common-domain-core/src/main/java/com/project/imdang/domain/valueobject/MemberCouponId.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.domain.valueobject; - -public class MemberCouponId extends BaseId { - public MemberCouponId(Long value) { - super(value); - } -} diff --git a/common/common-domain/common-domain-core/src/main/resources/application.properties b/common/common-domain/common-domain-core/src/main/resources/application.properties deleted file mode 100644 index 47d8050e..00000000 --- a/common/common-domain/common-domain-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=common-domain diff --git a/demo/src/App.jsx b/demo/src/App.jsx index 74793330..38b3f21e 100644 --- a/demo/src/App.jsx +++ b/demo/src/App.jsx @@ -6,7 +6,6 @@ import {MemberProvider} from "./context/MemberContext.jsx"; import Login from "./components/Login.jsx" import Layout from "./Layout.jsx"; import Home from "./components/Home.jsx"; -import MyExchange from './components/MyExchange.jsx'; import MyInsight from './components/MyInsight.jsx'; import DetailInsight from './components/DetailInsight.jsx' import CreateInsight from "./components/CreateInsight.jsx"; @@ -20,7 +19,6 @@ export default function App() { } /> } /> - } /> } /> } /> } /> diff --git a/demo/src/Header.jsx b/demo/src/Header.jsx index 406e2d4b..caed4979 100644 --- a/demo/src/Header.jsx +++ b/demo/src/Header.jsx @@ -15,9 +15,7 @@ const Header = () => { {/*birthDate: {member.birthDate}*/} {/*gender: {member.gender}*/} {/*deviceToken: {member.deviceToken}*/} - exchangeCount: {member.exchangeCount} insightCount: {member.insightCount} - requestCount: {member.requestCount} ) : ( ? diff --git a/demo/src/api-coupon.js b/demo/src/api-coupon.js deleted file mode 100644 index 4671036a..00000000 --- a/demo/src/api-coupon.js +++ /dev/null @@ -1,19 +0,0 @@ -import {API_URL, getAuthHeaders} from "./common.js"; - -export async function issueCoupon(name) { - const response = await fetch(`${API_URL}/coupons/issue`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...getAuthHeaders() - }, - body: JSON.stringify({ - name: name - }), - }); - - if (!response.ok) { - throw new Error(); - } - return response.json(); -} diff --git a/demo/src/api-exchange.js b/demo/src/api-exchange.js deleted file mode 100644 index d3e80408..00000000 --- a/demo/src/api-exchange.js +++ /dev/null @@ -1,57 +0,0 @@ -import {API_URL, getAuthHeaders} from "./common.js"; - -export async function requestExchange(requestedInsightId, requestMemberInsightId, memberCouponId) { - const response = await fetch(`${API_URL}/exchanges/request`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...getAuthHeaders() - }, - body: JSON.stringify({ - requestedInsightId: requestedInsightId, - requestMemberInsightId: requestMemberInsightId, - memberCouponId: memberCouponId - }), - }); - - if (!response.ok) { - throw new Error('교환 요청에 실패했습니다.'); - } - return response.json(); -} - -export async function acceptExchangeRequest(exchangeRequestId) { - const response = await fetch(`${API_URL}/exchanges/accept`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...getAuthHeaders() - }, - body: JSON.stringify({ - exchangeRequestId: exchangeRequestId - }), - }); - - if (!response.ok) { - throw new Error('수락에 실패했습니다.'); - } - return response.json(); -} - -export async function rejectExchangeRequest(exchangeRequestId) { - const response = await fetch(`${API_URL}/exchanges/reject`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...getAuthHeaders() - }, - body: JSON.stringify({ - exchangeRequestId: exchangeRequestId - }), - }); - - if (!response.ok) { - throw new Error('거절에 실패했습니다.'); - } - return response.json(); -} diff --git a/demo/src/api-my-coupon.js b/demo/src/api-my-coupon.js deleted file mode 100644 index b9873efb..00000000 --- a/demo/src/api-my-coupon.js +++ /dev/null @@ -1,17 +0,0 @@ -import {API_URL, getAuthHeaders} from "./common.js"; - -export async function fetchMyCoupon() { - const response = await fetch(`${API_URL}/my-coupons/detail`, { - // method: "GET", - headers: { - "Content-Type": "application/json", - ...getAuthHeaders() - }, - credentials: "include", // 인증 정보 포함 - }); - - if (!response.ok) { - throw new Error(); - } - return response.json(); -} diff --git a/demo/src/api-my-exchange.js b/demo/src/api-my-exchange.js deleted file mode 100644 index 710cceb1..00000000 --- a/demo/src/api-my-exchange.js +++ /dev/null @@ -1,33 +0,0 @@ -import {API_URL, getAuthHeaders} from "./common.js"; - -export async function fetchInsightsRequestedByMe(exchangeRequestStatus) { - const response = await fetch(`${API_URL}/my-exchanges/requested-by-me?exchangeRequestStatus=${exchangeRequestStatus}`, { - // method: "GET", - headers: { - "Content-Type": "application/json", - ...getAuthHeaders() - }, - credentials: "include", // 인증 정보 포함 - }); - - if (!response.ok) { - throw new Error("목록을 불러오지 못했습니다."); - } - return response.json(); -} - -export async function fetchInsightsRequestedByOthers(exchangeRequestStatus) { - const response = await fetch(`${API_URL}/my-exchanges/requested-by-others?exchangeRequestStatus=${exchangeRequestStatus}`, { - // method: "GET", - headers: { - "Content-Type": "application/json", - ...getAuthHeaders() - }, - credentials: "include", // 인증 정보 포함 - }); - - if (!response.ok) { - throw new Error("목록을 불러오지 못했습니다."); - } - return response.json(); -} diff --git a/demo/src/components/CreateInsight.jsx b/demo/src/components/CreateInsight.jsx index b2549eac..cb6c3cb7 100644 --- a/demo/src/components/CreateInsight.jsx +++ b/demo/src/components/CreateInsight.jsx @@ -41,32 +41,12 @@ export default function CreateInsight() { amenities: ["소형마트"], facilities: ["헬스장"], surroundings: ["산책로"], - landmarks: ["전망대"], - unpleasantFacilities: ["쓰레기_소각장"], text: "총평" }, complexEnvironment: { buildingCondition: "잘_모르겠어요", security: "잘_모르겠어요", childrenFacility: "잘_모르겠어요", - seniorFacility: "잘_모르겠어요", - text: "총평" - }, - complexFacility: { - familyFacilities: ["해당_없음"], - multipurposeFacilities: ["다목적실"], - leisureFacilities: ["독서실"], - surroundings: ["테이블_및_의자"], - text: "총평" - }, - favorableNews: { - transportations: ["지하철_개통"], - developments: ["재개발"], - educations: ["초등학교_신설_예정"], - environments: ["대형_공원"], - cultures: ["잘_모르겠어요"], - industries: ["잘_모르겠어요"], - policies: ["잘_모르겠어요"], text: "총평" } }); @@ -126,40 +106,18 @@ export default function CreateInsight() { amenities: ["소형마트"], facilities: ["헬스장"], surroundings: ["산책로"], - landmarks: ["전망대"], - unpleasantFacilities: ["쓰레기_소각장"], text: "총평" }, complexEnvironment: { buildingCondition: "잘_모르겠어요", security: "잘_모르겠어요", childrenFacility: "잘_모르겠어요", - seniorFacility: "잘_모르겠어요", - text: "총평" - }, - complexFacility: { - familyFacilities: ["해당_없음"], - multipurposeFacilities: ["다목적실"], - leisureFacilities: ["독서실"], - surroundings: ["테이블_및_의자"], - text: "총평" - }, - favorableNews: { - transportations: ["지하철_개통"], - developments: ["재개발"], - educations: ["초등학교_신설_예정"], - environments: ["대형_공원"], - cultures: ["잘_모르겠어요"], - industries: ["잘_모르겠어요"], - policies: ["잘_모르겠어요"], text: "총평" } // access: formData.access, // address: formData.address, // apartmentComplex: formData.apartmentComplex, // complexEnvironment: formData.complexEnvironment, - // complexFacility: formData.complexFacility, - // favorableNews: formData.favorableNews, // infra: formData.infra, // score: formData.score, // summary: formData.summary, diff --git a/demo/src/components/DetailInsight.jsx b/demo/src/components/DetailInsight.jsx index 9367dd42..c7db37a5 100644 --- a/demo/src/components/DetailInsight.jsx +++ b/demo/src/components/DetailInsight.jsx @@ -1,25 +1,15 @@ import React, {useEffect, useState} from 'react'; import {useParams} from 'react-router-dom'; import {accuseInsight, fetchInsight, recommendInsight} from "../api-insight.js"; -import {fetchInsightsCreatedByMe} from "../api-my-insight.js"; -import {acceptExchangeRequest, rejectExchangeRequest, requestExchange} from "../api-exchange.js"; -import {fetchMyCoupon} from "../api-my-coupon.js"; export default function DetailInsight() { const { id } = useParams(); const [insight, setInsight] = useState(null); const [recommended, setRecommended] = useState(null); const [accused, setAccused] = useState(null); - const [exchangeRequestStatus, setExchangeRequestStatus] = useState(null); - const [exchangeRequestCreatedByMe, setExchangeRequestCreatedByMe] = useState(null); - - const [exchangeRequested, setExchangeRequested] = useState(false); const [myInsights, setMyInsights] = useState([]); const [myInsightId, setMyInsightId] = useState(null); - const [myCoupon, setMyCoupon] = useState(null); - const [myCouponId, setMyCouponId] = useState(null); - useEffect(() => { fetchInsight(id) .then(insight => { @@ -30,95 +20,14 @@ export default function DetailInsight() { setInsight(insight); setRecommended(insight.recommended); setAccused(insight.accused); - setExchangeRequestStatus(insight.exchangeRequestStatus); - setExchangeRequestCreatedByMe(insight.exchangeRequestCreatedByMe); }); - }, [recommended, accused, exchangeRequestStatus]); - - const handleExchangeRequest = () => { - if (!exchangeRequested) { - setExchangeRequested(true); - fetchMyCoupon() - .then(data => { - console.log(data); - return data; - }) - .then(setMyCoupon); - fetchInsightsCreatedByMe() - .then(data => { - // console.log(data); - return data.content; - }) - .then(setMyInsights) - } else { - setExchangeRequested(false); - setMyInsightId(null); - } - } + }, [recommended, accused]); const handleChooseMyInsight = (myInsightId) => { setMyInsightId(myInsightId); - setMyCouponId(null); - } - - const handleChooseMyCoupon = (myCouponId) => { - setMyCouponId(myCouponId); - setMyInsightId(null); - } - - const handleConfirm = () => { - requestExchange(id, myInsightId, myCouponId).then(result => { - handleExchangeRequest(); - // console.log(result); - fetchInsight(id) - .then(insight => { - // console.log(insight); - return insight; - }) - .then(insight => { - setInsight(insight); - setRecommended(insight.recommended); - setAccused(insight.accused); - setExchangeRequestStatus(insight.exchangeRequestStatus); - setExchangeRequestCreatedByMe(insight.exchangeRequestCreatedByMe); - }); - }); - } - - const handleAcceptExchangeRequest = (insight) => { - acceptExchangeRequest(insight.exchangeRequestId).then(result => { - fetchInsight(insight.insightId) - .then(insight => { - // console.log(insight); - return insight; - }) - .then(insight => { - setInsight(insight); - setRecommended(insight.recommended); - setAccused(insight.accused); - setExchangeRequestStatus(insight.exchangeRequestStatus); - setExchangeRequestCreatedByMe(insight.exchangeRequestCreatedByMe); - }); - }); } - const handleRejectExchangeRequest = (insight) => { - rejectExchangeRequest(insight.exchangeRequestId).then(result => { - fetchInsight(insight.insightId) - .then(insight => { - // console.log(insight); - return insight; - }) - .then(insight => { - setInsight(insight); - setRecommended(insight.recommended); - setAccused(insight.accused); - setExchangeRequestStatus(insight.exchangeRequestStatus); - setExchangeRequestCreatedByMe(insight.exchangeRequestCreatedByMe); - }); - }); - }; - + const handleConfirm = () => {}; const handleRecommendInsight = (insight) => { if (recommended) return; recommendInsight(insight.insightId).then(result => { @@ -131,8 +40,6 @@ export default function DetailInsight() { setInsight(insight); setRecommended(insight.recommended); setAccused(insight.accused); - setExchangeRequestStatus(insight.exchangeRequestStatus); - setExchangeRequestCreatedByMe(insight.exchangeRequestCreatedByMe); }); }); } @@ -149,8 +56,6 @@ export default function DetailInsight() { setInsight(insight); setRecommended(insight.recommended); setAccused(insight.accused); - setExchangeRequestStatus(insight.exchangeRequestStatus); - setExchangeRequestCreatedByMe(insight.exchangeRequestCreatedByMe); }); }); } @@ -160,26 +65,6 @@ export default function DetailInsight() { if (insight.createdByMe === true) { content = - } else { - if (exchangeRequestStatus === null || exchangeRequestStatus === 'REJECTED') { - content = - } else if (exchangeRequestStatus === 'ACCEPTED') { - content = - } else { - // PENDING - if (exchangeRequestCreatedByMe) { - content = - } else { - content = <> - - - - } - } - } } @@ -200,78 +85,23 @@ export default function DetailInsight() { <>

{insight.title}

{content} - {exchangeRequested && ( - <> - - - - - - - - - {myCoupon && ( - handleChooseMyCoupon(myCoupon.memberCouponId)} - style={{ - cursor: 'pointer', - backgroundColor: myCouponId === myCoupon.memberCouponId ? '#f0f0f0' : 'white', - }}> - - - - )} - -
MemberCoupon IDCoupon Count
{myCoupon.memberCouponId}{myCoupon.couponCount}
- - - - - - - - - - {myInsights.map((myInsight) => ( - handleChooseMyInsight(myInsight.insightId)} - style={{ - cursor: 'pointer', - backgroundColor: myInsightId === myInsight.insightId ? '#f0f0f0' : 'white', - }}> - - - - - ))} - -
TitleRecommended CountAddress
{myInsight.title}{myInsight.recommendedCount}{myInsight.address.siDo} {myInsight.address.siGunGu} {myInsight.address.eupMyeonDong}
- - - )}

access: {insight.access}

accused: {insight.accused ? 'O' : 'X'}

accusedCount: {insight.accusedCount}

-

address: {insight.address.siDo} {insight.address.siGunGu} {insight.address.eupMyeonDong}

+

address: + {insight.address.siDo} {insight.address.siGunGu} {insight.address.eupMyeonDong} +

apartmentComplex: {insight.apartmentComplex.name}

-

createdAt: {insight.createdAt}

-

exchangeRequestCreatedByMe: {insight.exchangeRequestCreatedByMe ? 'O' : 'X'}

-

exchangeRequestId: {insight.exchangeRequestId}

-

exchangeRequestStatus: {insight.exchangeRequestStatus}

{insight.infra && (

infra:
amenities: {insight.infra.amenities}
facilities: {insight.infra.facilities}
- landmarks: {insight.infra.landmarks}
schoolDistricts: {insight.infra.schoolDistricts}
surroundings: {insight.infra.surroundings}
transportations: {insight.infra.transportations}
- unpleasantFacilities: {insight.infra.unpleasantFacilities}
text: {insight.infra.text}

)} @@ -280,32 +110,9 @@ export default function DetailInsight() { buildingCondition: {insight.complexEnvironment.buildingCondition}
childrenFacility: {insight.complexEnvironment.childrenFacility}
security: {insight.complexEnvironment.security}
- seniorFacility: {insight.complexEnvironment.seniorFacility}
text: {insight.complexEnvironment.text}

)} - {insight.complexFacility && ( -

complexFacility:
- familyFacilities: {insight.complexFacility.familyFacilities}
- leisureFacilities: {insight.complexFacility.leisureFacilities}
- multipurposeFacilities: {insight.complexFacility.multipurposeFacilities}
- surroundings: {insight.complexFacility.surroundings}
- text: {insight.complexFacility.text} -

- )} - {insight.favorableNews && ( -

favorableNews:
- cultures: {insight.favorableNews.cultures}
- developments: {insight.favorableNews.developments}
- educations: {insight.favorableNews.educations}
- environments: {insight.favorableNews.environments}
- industries: {insight.favorableNews.industries}
- policies: {insight.favorableNews.policies}
- transportations: {insight.favorableNews.transportations}
- text: {insight.favorableNews.text} -

- )} -

insightId: {insight.insightId}

mainImage: {insight.mainImage}

memberId: {insight.memberId}

@@ -313,7 +120,6 @@ export default function DetailInsight() {

recommended: {insight.recommended ? 'O' : 'X'}

recommendedCount: {insight.recommendedCount}

score: {insight.score}

-

snapshotId: {insight.snapshotId}

summary: {insight.summary}

title: {insight.title}

viewCount: {insight.viewCount}

diff --git a/demo/src/components/MyExchange.jsx b/demo/src/components/MyExchange.jsx deleted file mode 100644 index d6439c63..00000000 --- a/demo/src/components/MyExchange.jsx +++ /dev/null @@ -1,106 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { fetchInsightsRequestedByMe, fetchInsightsRequestedByOthers } from "../api-my-exchange.js"; -import {Link} from "react-router-dom"; - -export default function MyExchange() { - const [activeTab, setActiveTab] = useState('requestedByMe'); - const [insights, setInsights] = useState([]); - - const handleTabChange = (tab) => { - setActiveTab(tab); - setInsights([]); - }; - - const handleExchangeRequestStatusClick = (exchangeRequestStatus) => { - if (activeTab && activeTab === 'requestedByMe') { - fetchInsightsRequestedByMe(exchangeRequestStatus) - .then(data => { - // console.log(data); - return data.content; - }) - .then(setInsights); - } else { - // requestedByOthers - fetchInsightsRequestedByOthers(exchangeRequestStatus) - .then(data => { - // console.log(data); - return data.content; - }) - .then(setInsights); - } - } - - return ( -
-

교환소

-
- -
-
-

{activeTab === 'requestedByMe' ? '내가 요청한 내역' : '요청 받은 내역'}

-
- - -
-
- - - -
- - - - - - - - - - - - - - - {insights.map((insight) => ( - - - - - - - - - - ))} - -
TitleMember NicknameAddressRecommended CountMain ImageCreated AtDetail
{insight.title}{insight.memberNickname}{insight.address.siDo} {insight.address.siGunGu} {insight.address.eupMyeonDong}{insight.recommendedCount}{insight.mainImage}{insight.createdAt} - - - -
-
-
-
-
- ); -} diff --git a/diagram.md b/diagram.md new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/diagram.md @@ -0,0 +1 @@ + diff --git a/imdang-container/build.gradle b/imdang-container/build.gradle index e69de29b..98ac0806 100644 --- a/imdang-container/build.gradle +++ b/imdang-container/build.gradle @@ -0,0 +1,48 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.3.4' + id 'io.spring.dependency-management' version '1.1.6' +} + +bootJar { + enabled = true +} +jar { + enabled = false +} + +dependencies { + implementation project(':insight-service:insight-application') + implementation project(':insight-service:insight-persistence') + implementation project(':insight-service:insight-domain:insight-application-service') + implementation project(':insight-service:insight-domain:insight-domain-core') + + implementation project(':member-service:member-application') + implementation project(':member-service:member-persistence') + implementation project(':member-service:member-domain:member-application-service') + implementation project(':member-service:member-domain:member-domain-core') + + implementation project(':setting-service:setting-application') + implementation project(':setting-service:setting-persistence') + implementation project(':setting-service:setting-domain:setting-application-service') + implementation project(':setting-service:setting-domain:setting-domain-core') + + implementation project(':common:common-application') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-security' + + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' + implementation 'com.github.napstr:logback-discord-appender:1.0.0' + + //JWT + implementation 'io.jsonwebtoken:jjwt:0.12.6' + implementation 'com.auth0:java-jwt:4.0.0' + implementation 'org.bouncycastle:bcpkix-jdk18on:1.72' +} + +tasks.named('bootJar') { + mainClass.set('com.project.imdang.ImdangApplication') +} diff --git a/imdang-container/src/main/java/com/project/imdang/ImdangApplication.java b/imdang-container/src/main/java/com/project/imdang/ImdangApplication.java new file mode 100644 index 00000000..7f6447ca --- /dev/null +++ b/imdang-container/src/main/java/com/project/imdang/ImdangApplication.java @@ -0,0 +1,13 @@ +package com.project.imdang; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@EnableScheduling +@SpringBootApplication +public class ImdangApplication { + public static void main(String[] args) { + SpringApplication.run(ImdangApplication.class, args); + } +} diff --git a/imdang-container/src/main/java/com/project/imdang/configuration/BeanConfiguration.java b/imdang-container/src/main/java/com/project/imdang/configuration/BeanConfiguration.java new file mode 100644 index 00000000..71021b94 --- /dev/null +++ b/imdang-container/src/main/java/com/project/imdang/configuration/BeanConfiguration.java @@ -0,0 +1,36 @@ +package com.project.imdang.configuration; + +import com.project.imdang.insight.domain.InsightDomainService; +import com.project.imdang.insight.domain.InsightDomainServiceImpl; +import com.project.imdang.member.domain.MemberDomainService; +import com.project.imdang.member.domain.MemberDomainServiceImpl; +import com.project.imdang.setting.domain.NotificationDomainService; +import com.project.imdang.setting.domain.NotificationDomainServiceImpl; +import com.project.imdang.setting.domain.TermsDomainService; +import com.project.imdang.setting.domain.TermsDomainServiceImpl; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class BeanConfiguration { + + @Bean + public InsightDomainService insightDomainService() { + return new InsightDomainServiceImpl(); + } + + @Bean + public MemberDomainService memberDomainService() { + return new MemberDomainServiceImpl(); + } + + @Bean + public NotificationDomainService notificationDomainService() { + return new NotificationDomainServiceImpl(); + } + + @Bean + public TermsDomainService termsDomainService() { + return new TermsDomainServiceImpl(); + } +} diff --git a/imdang-container/src/main/java/com/project/imdang/container/DemoConfiguration.java b/imdang-container/src/main/java/com/project/imdang/configuration/DemoConfiguration.java similarity index 96% rename from imdang-container/src/main/java/com/project/imdang/container/DemoConfiguration.java rename to imdang-container/src/main/java/com/project/imdang/configuration/DemoConfiguration.java index ecfd25e6..1798e229 100644 --- a/imdang-container/src/main/java/com/project/imdang/container/DemoConfiguration.java +++ b/imdang-container/src/main/java/com/project/imdang/configuration/DemoConfiguration.java @@ -1,4 +1,4 @@ -package com.project.imdang.container; +package com.project.imdang.configuration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/common/common-application/src/main/java/com/project/imdang/application/configuration/SecurityConfiguration.java b/imdang-container/src/main/java/com/project/imdang/configuration/SecurityConfiguration.java similarity index 79% rename from common/common-application/src/main/java/com/project/imdang/application/configuration/SecurityConfiguration.java rename to imdang-container/src/main/java/com/project/imdang/configuration/SecurityConfiguration.java index 4a7d1638..36ad40c7 100644 --- a/common/common-application/src/main/java/com/project/imdang/application/configuration/SecurityConfiguration.java +++ b/imdang-container/src/main/java/com/project/imdang/configuration/SecurityConfiguration.java @@ -1,15 +1,13 @@ -package com.project.imdang.application.configuration; +package com.project.imdang.configuration; -import com.project.imdang.application.security.JwtAuthenticationEntryPoint; -import com.project.imdang.application.security.JwtAuthFilter; -import com.project.imdang.domain.jwt.JwtTokenProvider; -import jakarta.servlet.http.HttpServletRequest; +import com.project.imdang.jwt.JwtAuthFilter; +import com.project.imdang.jwt.JwtAuthenticationEntryPoint; +import com.project.imdang.member.persistence.provider.JwtTokenProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.authorization.AuthorizationDecision; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -18,7 +16,6 @@ import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.access.intercept.RequestAuthorizationContext; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; -import org.springframework.security.web.util.matcher.IpAddressMatcher; import java.util.function.Supplier; @@ -30,7 +27,7 @@ public class SecurityConfiguration { @Value("${security.allowed-ip}") private String allowedIp; - private final JwtTokenProvider jwtTokenUtil; + private final JwtTokenProvider jwtTokenProvider; private final JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint; @Bean @@ -46,11 +43,12 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeHttpRequests(auth -> auth - .requestMatchers("/members", "/members/info").access(this::hasIpAddress) + .requestMatchers("/members", "/members/info").permitAll() +// .access(this::hasIpAddress) .requestMatchers("/auth/kakao", "/auth/google", "/auth/apple", "/auth/reissue", "/swagger-resources/**", "/swagger-ui/**","/v3/api-docs/**", "/apartment-complexes").permitAll() .anyRequest().authenticated()) - .addFilterBefore(new JwtAuthFilter(jwtTokenUtil), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(new JwtAuthFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class) .build(); } diff --git a/common/common-application/src/main/java/com/project/imdang/application/configuration/SwaggerConfiguration.java b/imdang-container/src/main/java/com/project/imdang/configuration/SwaggerConfiguration.java similarity index 97% rename from common/common-application/src/main/java/com/project/imdang/application/configuration/SwaggerConfiguration.java rename to imdang-container/src/main/java/com/project/imdang/configuration/SwaggerConfiguration.java index 4c4ed78c..92bfed15 100644 --- a/common/common-application/src/main/java/com/project/imdang/application/configuration/SwaggerConfiguration.java +++ b/imdang-container/src/main/java/com/project/imdang/configuration/SwaggerConfiguration.java @@ -1,4 +1,4 @@ -package com.project.imdang.application.configuration; +package com.project.imdang.configuration; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; diff --git a/imdang-container/src/main/java/com/project/imdang/container/ImdangApplication.java b/imdang-container/src/main/java/com/project/imdang/container/ImdangApplication.java deleted file mode 100644 index fdc094cb..00000000 --- a/imdang-container/src/main/java/com/project/imdang/container/ImdangApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.container; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.scheduling.annotation.EnableScheduling; - -@EnableJpaRepositories(basePackages = { - "com.project.imdang.insight.service.persistence", - "com.project.imdang.member.service.persistence", - "com.project.imdang.setting.service.persistence" -}) -@EntityScan(basePackages = { - "com.project.imdang.insight.service.persistence", - "com.project.imdang.member.service.persistence", - "com.project.imdang.setting.service.persistence" -}) -@EnableScheduling -@SpringBootApplication(scanBasePackages = "com.project.imdang") -public class ImdangApplication { - public static void main(String[] args) { - SpringApplication.run(ImdangApplication.class, args); - } -} diff --git a/common/common-application/src/main/java/com/project/imdang/application/security/JwtAuthFilter.java b/imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthFilter.java similarity index 81% rename from common/common-application/src/main/java/com/project/imdang/application/security/JwtAuthFilter.java rename to imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthFilter.java index 8657ec3d..38a230be 100644 --- a/common/common-application/src/main/java/com/project/imdang/application/security/JwtAuthFilter.java +++ b/imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthFilter.java @@ -1,6 +1,6 @@ -package com.project.imdang.application.security; +package com.project.imdang.jwt; -import com.project.imdang.domain.jwt.JwtTokenProvider; +import com.project.imdang.member.domain.ports.output.provider.TokenProvider; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.MalformedJwtException; import io.jsonwebtoken.UnsupportedJwtException; @@ -21,19 +21,19 @@ import java.util.Collections; import java.util.UUID; -import static com.project.imdang.application.security.ErrorCode.ADDITIONAL_REQUIRED_TOKEN; -import static com.project.imdang.application.security.ErrorCode.EXPIRED_TOKEN; -import static com.project.imdang.application.security.ErrorCode.ILLEGAL_TOKEN; -import static com.project.imdang.application.security.ErrorCode.MAL_FORMED_TOKEN; -import static com.project.imdang.application.security.ErrorCode.UNKNOWN_ERROR; -import static com.project.imdang.application.security.ErrorCode.UNSUPPORTED_TOKEN; +import static com.project.imdang.common.application.response.code.ErrorCode.ADDITIONAL_REQUIRED_TOKEN; +import static com.project.imdang.common.application.response.code.ErrorCode.EXPIRED_TOKEN; +import static com.project.imdang.common.application.response.code.ErrorCode.ILLEGAL_TOKEN; +import static com.project.imdang.common.application.response.code.ErrorCode.MAL_FORMED_TOKEN; +import static com.project.imdang.common.application.response.code.ErrorCode.UNKNOWN_ERROR; +import static com.project.imdang.common.application.response.code.ErrorCode.UNSUPPORTED_TOKEN; @Slf4j @RequiredArgsConstructor public class JwtAuthFilter extends OncePerRequestFilter { public static final String AUTHORIZATION_HEADER = "Authorization"; - private final JwtTokenProvider jwtTokenUtil; + private final TokenProvider tokenProvider; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { @@ -49,9 +49,10 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse // 2. 토큰이 있는 경우, 유효성 검증 try { - if (StringUtils.hasText(token) && jwtTokenUtil.verifyToken(token)) { + if (StringUtils.hasText(token) && tokenProvider.verifyToken(token)) { // 3-1. 토큰 파싱해서 사용자 정보 가져오기 - String memberId = jwtTokenUtil.extractSubject(token); + String memberId = null; +// String memberId = tokenProvider.extractSubject(token); // 3-2. MemberId로 Authentication 정보 생성 Authentication auth = new UsernamePasswordAuthenticationToken(UUID.fromString(memberId), "", Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"))); diff --git a/common/common-application/src/main/java/com/project/imdang/application/security/JwtAuthenticationEntryPoint.java b/imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthenticationEntryPoint.java similarity index 80% rename from common/common-application/src/main/java/com/project/imdang/application/security/JwtAuthenticationEntryPoint.java rename to imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthenticationEntryPoint.java index f1ba1a70..840f4b10 100644 --- a/common/common-application/src/main/java/com/project/imdang/application/security/JwtAuthenticationEntryPoint.java +++ b/imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthenticationEntryPoint.java @@ -1,7 +1,8 @@ -package com.project.imdang.application.security; +package com.project.imdang.jwt; import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.application.handler.ErrorDTO; +import com.project.imdang.common.application.response.ErrorResponse; +import com.project.imdang.common.application.response.code.ErrorCode; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -27,7 +28,7 @@ public void commence(HttpServletRequest request, HttpServletResponse response, A response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); ErrorCode errorCode = ErrorCode.getErrorCode(code); - ErrorDTO errorDTO = ErrorDTO.of(errorCode); - response.getWriter().print(objectMapper.writeValueAsString(errorDTO)); + ErrorResponse errorResponse = ErrorResponse.of(errorCode); + response.getWriter().print(objectMapper.writeValueAsString(errorResponse)); } } diff --git a/imdang-container/src/main/resources/default_insert.sql b/imdang-container/src/main/resources/default_insert.sql deleted file mode 100644 index dcd35411..00000000 --- a/imdang-container/src/main/resources/default_insert.sql +++ /dev/null @@ -1,22 +0,0 @@ -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET NAMES utf8 */; -/*!50503 SET NAMES utf8mb4 */; -/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; -/*!40103 SET TIME_ZONE='+00:00' */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - -INSERT INTO `offset` (`value`) VALUES (0); - -INSERT INTO `coupon` (`id`, `expiration_date`, `name`) VALUES - ('2987634c-7c03-4cf1-a444-7a7116943775', '2999-12-32', 'FirstCheerUp'), - ('5be509b0-bdd6-46b2-816a-3d7d267fb5e1', '2999-12-32', 'ThirdCheerUp'), - ('c8b48739-a4c2-4dbc-90f8-807fad66c523', '2999-12-32', 'SecondCheerUp'), - ('f79a5af2-8726-4f93-b3cb-f3432d252cd1', '2999-12-32', 'Welcome'); - -/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */; -/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; -/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */; diff --git a/imdang-container/src/main/resources/foreign_key.sql b/imdang-container/src/main/resources/foreign_key.sql index 2303eeeb..0da0ab61 100644 --- a/imdang-container/src/main/resources/foreign_key.sql +++ b/imdang-container/src/main/resources/foreign_key.sql @@ -2,32 +2,14 @@ ALTER TABLE accuse ADD CONSTRAINT fk_accuse_member_1 FOREIGN KEY (accuse_member_ ALTER TABLE accuse ADD CONSTRAINT fk_accuse_member_2 FOREIGN KEY (accused_member_id) REFERENCES member(id) on delete restrict; ALTER TABLE accuse ADD CONSTRAINT fk_accuse_insight_1 FOREIGN KEY (accused_insight_id) REFERENCES insight(id) on delete restrict; -ALTER TABLE exchange_request ADD CONSTRAINT fk_exchange_request_member_coupon_1 FOREIGN KEY (member_coupon_id) REFERENCES member_coupon(id) on delete restrict; -ALTER TABLE exchange_request ADD CONSTRAINT fk_exchange_request_snapshot_1 FOREIGN KEY (requested_snapshot_id) REFERENCES snapshot(id) on delete restrict; -ALTER TABLE exchange_request ADD CONSTRAINT fk_exchange_request_snapshot_2 FOREIGN KEY (request_member_snapshot_id) REFERENCES snapshot(id) on delete restrict; -ALTER TABLE exchange_request ADD CONSTRAINT fk_exchange_request_member_1 FOREIGN KEY (request_member_id) REFERENCES member(id) on delete restrict; -ALTER TABLE exchange_request ADD CONSTRAINT fk_exchange_request_member_2 FOREIGN KEY (requested_member_id) REFERENCES member(id) on delete restrict; -ALTER TABLE exchange_request ADD CONSTRAINT fk_exchange_request_insight_1 FOREIGN KEY (request_member_insight_id) REFERENCES insight(id) on delete restrict; -ALTER TABLE exchange_request ADD CONSTRAINT fk_exchange_request_insight_2 FOREIGN KEY (requested_insight_id) REFERENCES insight(id) on delete restrict; - ALTER TABLE insight ADD CONSTRAINT fk_insight_member_1 FOREIGN KEY (member_id) REFERENCES member(id) on delete restrict; -ALTER TABLE member_coupon ADD CONSTRAINT fk_member_coupon_member_1 FOREIGN KEY (member_id) REFERENCES member(id) on delete restrict; -ALTER TABLE member_coupon ADD CONSTRAINT fk_member_coupon_coupon_1 FOREIGN KEY (coupon_id) REFERENCES coupon(id) on delete restrict; - -ALTER TABLE member_snapshot ADD CONSTRAINT fk_member_snapshot_snapshot_1 FOREIGN KEY (snapshot_id) REFERENCES snapshot(id) on delete restrict; -ALTER TABLE member_snapshot ADD CONSTRAINT fk_member_snapshot_insight_1 FOREIGN KEY (insight_id) REFERENCES insight(id) on delete restrict; -ALTER TABLE member_snapshot ADD CONSTRAINT fk_member_snapshot_member_1 FOREIGN KEY (member_id) REFERENCES member(id) on delete restrict; - ALTER TABLE notification ADD CONSTRAINT fk_notification_member_1 FOREIGN KEY (receiver_id) REFERENCES member(id) on delete restrict; ALTER TABLE recommend ADD CONSTRAINT fk_recommend_member_1 FOREIGN KEY (recommend_member_id) REFERENCES member(id) on delete restrict; ALTER TABLE recommend ADD CONSTRAINT fk_recommend_insight FOREIGN KEY (recommended_insight_id) REFERENCES insight(id) on delete restrict; ALTER TABLE recommend ADD CONSTRAINT fk_recommend_member_2 FOREIGN KEY (recommended_member_id) REFERENCES member(id) on delete restrict; -ALTER TABLE snapshot ADD CONSTRAINT fk_snapshot_insight_1 FOREIGN KEY (insight_id) REFERENCES insight(id) on delete restrict; -ALTER TABLE snapshot ADD CONSTRAINT fk_snapshot_member_1 FOREIGN KEY (member_id) REFERENCES member(id) on delete restrict; - ALTER TABLE terms_agreement ADD CONSTRAINT fk_terms_agreement_member_1 FOREIGN KEY (member_id) REFERENCES member(id) on delete restrict; ALTER TABLE terms_agreement ADD CONSTRAINT fk_terms_agreement_terms_1 FOREIGN KEY (terms_id) REFERENCES terms(id) on delete restrict; diff --git a/imdang-container/src/main/resources/imdang.sql b/imdang-container/src/main/resources/imdang.sql index 4597abe2..20cfaa9f 100644 --- a/imdang-container/src/main/resources/imdang.sql +++ b/imdang-container/src/main/resources/imdang.sql @@ -30,18 +30,6 @@ CREATE TABLE IF NOT EXISTS `accuse` ( CONSTRAINT `fk_accuse_member_2` FOREIGN KEY (`accused_member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; --- 내보낼 데이터가 선택되어 있지 않습니다. - --- 테이블 imdang.coupon 구조 내보내기 -CREATE TABLE IF NOT EXISTS `coupon` ( - `id` char(36) COLLATE utf8mb4_general_ci NOT NULL, - `expiration_date` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `name` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- 내보낼 데이터가 선택되어 있지 않습니다. - -- 테이블 imdang.district 구조 내보내기 CREATE TABLE IF NOT EXISTS `district` ( `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, @@ -56,52 +44,6 @@ CREATE TABLE IF NOT EXISTS `district` ( PRIMARY KEY (`code`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- 내보낼 데이터가 선택되어 있지 않습니다. - --- 테이블 imdang.event_entry 구조 내보내기 -CREATE TABLE IF NOT EXISTS `event_entry` ( - `type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `payload` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `content_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `id` int NOT NULL AUTO_INCREMENT, - `timestamp` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- 내보낼 데이터가 선택되어 있지 않습니다. - --- 테이블 imdang.exchange_request 구조 내보내기 -CREATE TABLE IF NOT EXISTS `exchange_request` ( - `member_coupon_id` bigint DEFAULT NULL, - `request_member_snapshot_id` bigint DEFAULT NULL, - `requested_at` datetime(6) NOT NULL, - `requested_snapshot_id` bigint NOT NULL, - `responded_at` datetime(6) DEFAULT NULL, - `id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `request_member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `request_member_insight_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `requested_insight_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `requested_member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `status` enum('ACCEPTED','PENDING','REJECTED') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - PRIMARY KEY (`id`) USING BTREE, - KEY `fk_exchange_request_member_coupon_1` (`member_coupon_id`), - KEY `fk_exchange_request_snapshot_1` (`requested_snapshot_id`), - KEY `fk_exchange_request_snapshot_2` (`request_member_snapshot_id`), - KEY `fk_exchange_request_member_1` (`request_member_id`), - KEY `fk_exchange_request_member_2` (`requested_member_id`), - KEY `fk_exchange_request_insight_1` (`request_member_insight_id`), - KEY `fk_exchange_request_insight_2` (`requested_insight_id`), - CONSTRAINT `fk_exchange_request_insight_1` FOREIGN KEY (`request_member_insight_id`) REFERENCES `insight` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_exchange_request_insight_2` FOREIGN KEY (`requested_insight_id`) REFERENCES `insight` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_exchange_request_member_1` FOREIGN KEY (`request_member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_exchange_request_member_2` FOREIGN KEY (`requested_member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_exchange_request_member_coupon_1` FOREIGN KEY (`member_coupon_id`) REFERENCES `member_coupon` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_exchange_request_snapshot_1` FOREIGN KEY (`requested_snapshot_id`) REFERENCES `snapshot` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_exchange_request_snapshot_2` FOREIGN KEY (`request_member_snapshot_id`) REFERENCES `snapshot` (`id`) ON DELETE RESTRICT -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - --- 내보낼 데이터가 선택되어 있지 않습니다. - -- 테이블 imdang.insight 구조 내보내기 CREATE TABLE IF NOT EXISTS `insight` ( `accused_count` int unsigned NOT NULL, @@ -137,8 +79,6 @@ CREATE TABLE IF NOT EXISTS `insight` ( CONSTRAINT `fk_insight_member_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- 내보낼 데이터가 선택되어 있지 않습니다. - -- 테이블 imdang.member 구조 내보내기 CREATE TABLE IF NOT EXISTS `member` ( `id` char(36) COLLATE utf8mb4_general_ci NOT NULL, @@ -164,46 +104,6 @@ CREATE TABLE IF NOT EXISTS `member` ( CONSTRAINT `member_chk_1` CHECK ((`gender` between 0 and 1)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- 내보낼 데이터가 선택되어 있지 않습니다. - --- 테이블 imdang.member_coupon 구조 내보내기 -CREATE TABLE IF NOT EXISTS `member_coupon` ( - `id` bigint NOT NULL AUTO_INCREMENT, - `coupon_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `created_at` datetime(6) NOT NULL, - `expired_at` datetime(6) DEFAULT NULL, - `member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `remark` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, - `used` bit(1) NOT NULL, - `used_at` datetime(6) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `unique_member_coupon_1` (`coupon_id`,`member_id`), - KEY `fk_member_coupon_member_1` (`member_id`), - CONSTRAINT `fk_member_coupon_coupon_1` FOREIGN KEY (`coupon_id`) REFERENCES `coupon` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_member_coupon_member_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- 내보낼 데이터가 선택되어 있지 않습니다. - --- 테이블 imdang.member_snapshot 구조 내보내기 -CREATE TABLE IF NOT EXISTS `member_snapshot` ( - `created_at` datetime(6) NOT NULL, - `id` bigint NOT NULL AUTO_INCREMENT, - `snapshot_id` bigint NOT NULL, - `insight_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `exchange_request_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `unique_member_snapshot_1` (`insight_id`,`member_id`), - KEY `fk_member_snapshot_snapshot_1` (`snapshot_id`), - KEY `fk_member_snapshot_member_1` (`member_id`), - CONSTRAINT `fk_member_snapshot_insight_1` FOREIGN KEY (`insight_id`) REFERENCES `insight` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_member_snapshot_member_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_member_snapshot_snapshot_1` FOREIGN KEY (`snapshot_id`) REFERENCES `snapshot` (`id`) ON DELETE RESTRICT -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - --- 내보낼 데이터가 선택되어 있지 않습니다. - -- 테이블 imdang.notification 구조 내보내기 CREATE TABLE IF NOT EXISTS `notification` ( `id` bigint NOT NULL AUTO_INCREMENT, @@ -218,15 +118,6 @@ CREATE TABLE IF NOT EXISTS `notification` ( CONSTRAINT `fk_notification_member_1` FOREIGN KEY (`receiver_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- 내보낼 데이터가 선택되어 있지 않습니다. - --- 테이블 imdang.offset 구조 내보내기 -CREATE TABLE IF NOT EXISTS `offset` ( - `value` int unsigned NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; - --- 내보낼 데이터가 선택되어 있지 않습니다. - -- 테이블 imdang.recommend 구조 내보내기 CREATE TABLE IF NOT EXISTS `recommend` ( `id` bigint NOT NULL AUTO_INCREMENT, @@ -243,42 +134,6 @@ CREATE TABLE IF NOT EXISTS `recommend` ( CONSTRAINT `fk_recommend_member_2` FOREIGN KEY (`recommended_member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- 내보낼 데이터가 선택되어 있지 않습니다. - --- 테이블 imdang.snapshot 구조 내보내기 -CREATE TABLE IF NOT EXISTS `snapshot` ( - `visit_at` date NOT NULL, - `id` bigint NOT NULL AUTO_INCREMENT, - `insight_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `address_building_number` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `address_detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `address_eup_myeon_dong` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `address_road_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, - `address_si_do` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `address_si_gun_gu` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `complex_environment` json NOT NULL, - `complex_facility` json NOT NULL, - `complex_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `favorable_news` json NOT NULL, - `infra` json NOT NULL, - `main_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `summary` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `visit_methods` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `visit_times` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `access` enum('자유로움','제한됨','허락시_가능') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, - `address_latitude` double DEFAULT NULL, - `address_longitude` double DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `fk_snapshot_insight_1` (`insight_id`), - KEY `fk_snapshot_member_1` (`member_id`), - CONSTRAINT `fk_snapshot_insight_1` FOREIGN KEY (`insight_id`) REFERENCES `insight` (`id`) ON DELETE RESTRICT, - CONSTRAINT `fk_snapshot_member_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; - --- 내보낼 데이터가 선택되어 있지 않습니다. - -- 테이블 imdang.terms 구조 내보내기 CREATE TABLE IF NOT EXISTS `terms` ( `id` bigint NOT NULL AUTO_INCREMENT, @@ -288,8 +143,6 @@ CREATE TABLE IF NOT EXISTS `terms` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- 내보낼 데이터가 선택되어 있지 않습니다. - -- 테이블 imdang.terms_agreement 구조 내보내기 CREATE TABLE IF NOT EXISTS `terms_agreement` ( `id` bigint NOT NULL AUTO_INCREMENT, @@ -303,8 +156,6 @@ CREATE TABLE IF NOT EXISTS `terms_agreement` ( CONSTRAINT `fk_terms_agreement_terms_1` FOREIGN KEY (`terms_id`) REFERENCES `terms` (`id`) ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; --- 내보낼 데이터가 선택되어 있지 않습니다. - /*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; /*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; diff --git a/imdang-container/src/main/resources/unique_key.sql b/imdang-container/src/main/resources/unique_key.sql index 4614a54b..e1a0a055 100644 --- a/imdang-container/src/main/resources/unique_key.sql +++ b/imdang-container/src/main/resources/unique_key.sql @@ -1,11 +1,6 @@ ALTER TABLE accuse ADD CONSTRAINT unique_accuse_1 UNIQUE (accuse_member_id, accused_insight_id); - -ALTER TABLE member_snapshot ADD CONSTRAINT unique_member_snapshot_1 UNIQUE (insight_id, member_id); - ALTER TABLE recommend ADD CONSTRAINT unique_recommend_1 UNIQUE (recommend_member_id, recommended_insight_id); -ALTER TABLE member_coupon ADD CONSTRAINT unique_member_coupon_1 UNIQUE (coupon_id, member_id); - ALTER TABLE member ADD CONSTRAINT unique_member_1 UNIQUE (nickname); ALTER TABLE member ADD CONSTRAINT unique_member_2 UNIQUE (auth_id, auth_type, is_deleted); diff --git a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/InsightControllerTest.java b/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java similarity index 71% rename from insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/InsightControllerTest.java rename to imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java index a34efa9c..7d1399de 100644 --- a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/InsightControllerTest.java +++ b/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java @@ -1,18 +1,19 @@ -package com.project.imdang.insight.service.application.rest; +package com.project.imdang.insight; import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.domain.jwt.JwtTokenProvider; -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightCommand; +import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; +import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; +import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; +import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; +import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; +import com.project.imdang.member.persistence.provider.JwtTokenProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; @@ -22,8 +23,6 @@ import java.nio.charset.StandardCharsets; import java.util.UUID; -import static com.project.imdang.insight.service.application.rest.TestData.requestMemberId; -import static com.project.imdang.insight.service.application.rest.TestData.requestedMemberId; import static org.hamcrest.core.IsNull.notNullValue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; @@ -45,28 +44,21 @@ class InsightControllerTest { private JwtTokenProvider jwtTokenProvider; - private final String requestMemberToken = "request-member-token"; - private final String requestedMemberToken = "requested-member-token"; - + private final String memberToken = "member-token"; @BeforeEach void init() { // given - Mockito.when(jwtTokenProvider.verifyToken(requestMemberToken)) - .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(requestMemberToken)) - .thenReturn(String.valueOf(requestMemberId)); - - Mockito.when(jwtTokenProvider.verifyToken(requestedMemberToken)) + Mockito.when(jwtTokenProvider.verifyToken(memberToken)) .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(requestedMemberToken)) - .thenReturn(String.valueOf(requestedMemberId)); + Mockito.when(jwtTokenProvider.extractSubject(memberToken)) + .thenReturn(String.valueOf(TestData.memberId)); } @Test void list() throws Exception { mockMvc.perform(get("/insights") - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) // .param("pageNumber", "0") // .param("pageSize", "10") .accept(MediaType.APPLICATION_JSON)) @@ -79,7 +71,7 @@ void list() throws Exception { void listByApartmentComplex() throws Exception { mockMvc.perform(get("/insights/by-apartment-complex") .param("apartmentComplexName", TestData.apartmentComplex.getName()) - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) // .param("pageNumber", "0") // .param("pageSize", "10") .accept(MediaType.APPLICATION_JSON)) @@ -93,7 +85,7 @@ void listByApartmentComplex() throws Exception { void detail() throws Exception { String insightId = "f509ce55-a67a-4c97-8846-0dee0c754c38"; mockMvc.perform(get("/insights/detail") - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) .param("insightId", insightId) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) @@ -114,7 +106,7 @@ void createInsight() throws Exception { mockMvc.perform(MockMvcRequestBuilders.multipart("/insights/create") .file(mainImage) .file(new MockMultipartFile("createInsightCommand", "", "application/json", valueAsString.getBytes(StandardCharsets.UTF_8))) - .header("Authorization", "Bearer " + requestMemberToken)) + .header("Authorization", "Bearer " + memberToken)) .andExpect(status().isOk()) .andExpect(jsonPath("$.insightId", notNullValue())); } @@ -129,15 +121,12 @@ void updateInsight() throws Exception { byte[] bytes = "content".getBytes(); MockMultipartFile mainImage = new MockMultipartFile("mainImage", "", "text/plain", bytes); - // TODO - QUERY CHECK - // Hibernate: update insight set access=?,accused_count=?,dong=?,si_gun_gu=?,name=?,complex_environment=?,complex_facility=?,contents=?,created_at=?,favorable_news=?,infra=?,main_image=?,member_id=?,recommended_count=?,score=?,summary=?,title=?,view_count=?,visit_at=?,visit_method=? where id=? - // Hibernate: update snapshot set access=?,dong=?,si_gun_gu=?,name=?,complex_environment=?,complex_facility=?,contents=?,favorable_news=?,infra=?,main_image=?,member_id=?,summary=?,title=?,visit_at=?,visit_method=? where id=? // when // then mockMvc.perform(multipart("/insights/update") .file(mainImage) .file(new MockMultipartFile("updateInsightCommand", "", "application/json", valueAsString.getBytes(StandardCharsets.UTF_8))) - .header("Authorization", "Bearer " + requestMemberToken)) + .header("Authorization", "Bearer " + memberToken)) .andExpect(status().isOk()) // HTTP 상태 확인 .andExpect(jsonPath("$.insightId", notNullValue())); } @@ -147,7 +136,7 @@ void recommendInsight() throws Exception { UUID insightId = UUID.fromString("f509ce55-a67a-4c97-8846-0dee0c754c38"); RecommendInsightCommand recommendInsightCommand = new TestData(insightId).recommendInsightCommand(); mockMvc.perform(post("/insights/recommend") - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(recommendInsightCommand))) // 요청 본문 직렬화 .andExpect(status().isOk()) // HTTP 상태 확인 @@ -159,7 +148,7 @@ void accuseInsight() throws Exception { UUID insightId = UUID.fromString("b434b945-5e39-4439-b0eb-ff953b777118"); AccuseInsightCommand accuseInsightCommand = new TestData(insightId).accuseInsightCommand(); mockMvc.perform(post("/insights/accuse") - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(accuseInsightCommand))) // 요청 본문 직렬화 .andExpect(status().isOk()) // HTTP 상태 확인 @@ -171,7 +160,7 @@ void deleteInsight() throws Exception { UUID insightId = UUID.fromString("b434b945-5e39-4439-b0eb-ff953b777118"); DeleteInsightCommand deleteInsightCommand = new TestData(insightId).deleteInsightCommand(); mockMvc.perform(post("/insights/delete") - .header("Authorization", "Bearer " + requestedMemberToken) + .header("Authorization", "Bearer " + memberToken) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(deleteInsightCommand))) // 요청 본문 직렬화 .andExpect(status().isOk()) // HTTP 상태 확인 diff --git a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/MyInsightControllerTest.java b/imdang-container/src/test/java/com/project/imdang/insight/MyInsightControllerTest.java similarity index 70% rename from insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/MyInsightControllerTest.java rename to imdang-container/src/test/java/com/project/imdang/insight/MyInsightControllerTest.java index fbf63495..a4ea538f 100644 --- a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/MyInsightControllerTest.java +++ b/imdang-container/src/test/java/com/project/imdang/insight/MyInsightControllerTest.java @@ -1,19 +1,18 @@ -package com.project.imdang.insight.service.application.rest; +package com.project.imdang.insight; import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.domain.jwt.JwtTokenProvider; +import com.project.imdang.member.persistence.provider.JwtTokenProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import static com.project.imdang.insight.service.application.rest.TestData.requestMemberId; -import static com.project.imdang.insight.service.application.rest.TestData.requestedMemberId; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -31,27 +30,21 @@ public class MyInsightControllerTest { @MockBean private JwtTokenProvider jwtTokenProvider; - private final String requestMemberToken = "request-member-token"; - private final String requestedMemberToken = "requested-member-token"; + private final String memberToken = "member-token"; @BeforeEach void init() { // given - Mockito.when(jwtTokenProvider.verifyToken(requestMemberToken)) + Mockito.when(jwtTokenProvider.verifyToken(memberToken)) .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(requestMemberToken)) - .thenReturn(String.valueOf(requestMemberId)); - - Mockito.when(jwtTokenProvider.verifyToken(requestedMemberToken)) - .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(requestedMemberToken)) - .thenReturn(String.valueOf(requestedMemberId)); + Mockito.when(jwtTokenProvider.extractSubject(memberToken)) + .thenReturn(String.valueOf(TestData.memberId)); } @Test void listDistrict() throws Exception { mockMvc.perform(get("/my-insights/districts") - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(print()) @@ -61,7 +54,7 @@ void listDistrict() throws Exception { @Test void listApartmentComplexByDistrict() throws Exception { mockMvc.perform(get("/my-insights/by-district/apartment-complexes") - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) .param("siDo", "서울시") .param("siGunGu", "강남구") .param("eupMyeonDong", "신논현동") @@ -74,7 +67,7 @@ void listApartmentComplexByDistrict() throws Exception { @Test void list() throws Exception { mockMvc.perform(get("/my-insights") - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) // .param("onlyMine", "TRUE") .param("siDo", "서울시") .param("siGunGu", "강남구") @@ -91,7 +84,7 @@ void list() throws Exception { @Test void listCreatedByMe() throws Exception { mockMvc.perform(get("/my-insights/created-by-me") - .header("Authorization", "Bearer " + requestMemberToken) + .header("Authorization", "Bearer " + memberToken) .param("pageNumber", "1") .param("pageSize", "5") .accept(MediaType.APPLICATION_JSON)) diff --git a/imdang-container/src/test/java/com/project/imdang/insight/TestData.java b/imdang-container/src/test/java/com/project/imdang/insight/TestData.java new file mode 100644 index 00000000..d764f5c0 --- /dev/null +++ b/imdang-container/src/test/java/com/project/imdang/insight/TestData.java @@ -0,0 +1,137 @@ +package com.project.imdang.insight; + +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.ObjectiveItem; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; +import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; +import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; +import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; +import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; +import org.springframework.util.Assert; + +import java.time.LocalDate; +import java.util.Set; +import java.util.UUID; + +public class TestData { + + public final static UUID memberId = UUID.fromString("3eff967b-84b8-4ec4-941b-ef3f0a26c0b9"); + private InsightId insightId; + + public TestData() {} + + public TestData(UUID insightId) { + this.insightId = new InsightId(insightId); + } + + CreateInsightCommand createInsightCommand() { +// byte[] bytes = "content".getBytes(); +// MockMultipartFile mainImage = new MockMultipartFile("mainImage-1", bytes); + return CreateInsightCommand.builder() + .memberId(new MemberId(memberId)) + .score(80) +// .mainImage(mainImage) + .title("title-1") + .address(TestData.address) + .apartmentComplex(TestData.apartmentComplex) + .visitAt(LocalDate.now().minusDays(14)) + .visitTimes(Set.of(VisitTime.아침)) + .visitMethods(Set.of(VisitMethod.대중교통)) + .access(Access.허락시_가능) + .summary("지하철역과 도보 10분 거리로 접근성이 좋지만, 근처 공사로 소음 문제가 있을 수 있을 것 같아요. 지하철역과 도보 10분 거리로 접근성이 좋지만, 근처 공사로 소음 문제가 있을 수 있을 것 같아요. 하지만 단지 내 공원이 잘 조성되어 있어 가족 단위 거주자에게 적합할 것 같아요.") + .infra(TestData.infra) + .complexEnvironment(TestData.complexEnvironment) + .build(); + } + + UpdateInsightCommand updateInsightCommand() { + Assert.notNull(insightId, "InsightId must not be null!"); + return UpdateInsightCommand.builder() + .insightId(insightId) + .score(95) +// .mainImage(updatedMainImage) + .title("updated-title-1") + .address(TestData.address) + .apartmentComplex(TestData.apartmentComplex) + .visitAt(LocalDate.now().minusDays(13)) + .visitTimes(Set.of(VisitTime.저녁)) + .visitMethods(Set.of(VisitMethod.자차, VisitMethod.도보)) + .access(Access.허락시_가능) + .summary("updated-summary-1") + .infra(TestData.updatedInfra) + .complexEnvironment(TestData.updatedComplexEnvironment) + .build(); + } + + DeleteInsightCommand deleteInsightCommand() { + Assert.notNull(insightId, "InsightId must not be null!"); + return DeleteInsightCommand.builder() + .insightId(insightId) + .build(); + } + + RecommendInsightCommand recommendInsightCommand() { + Assert.notNull(insightId, "InsightId must not be null!"); + return RecommendInsightCommand.builder() + .insightId(insightId) + .build(); + } + + AccuseInsightCommand accuseInsightCommand() { + Assert.notNull(insightId, "InsightId must not be null!"); + return AccuseInsightCommand.builder() + .insightId(insightId) + .accuseMemberId(new MemberId(UUID.randomUUID())) + .build(); + } + + static Address address = Address.builder() + .siDo("서울시") + .siGunGu("강남구") + .eupMyeonDong("신논현동") + .buildingNumber("1") + .build(); + static ApartmentComplex apartmentComplex = ApartmentComplex.builder() + .name("신논현 더 센트럴 푸르지오") + .build(); + + static Infra infra = Infra.builder() + .transportations(Set.of(Infra.Transportation.버스_정류장_주변, Infra.Transportation.주차_편리)) + .schoolDistricts(Set.of(Infra.SchoolDistrict.고등학교)) + .amenities(Set.of(Infra.Amenity.병원)) + .facilities(Set.of(Infra.Facility.도서관, Infra.Facility.수영장)) + .surroundings(Set.of(Infra.Surroundings.강, Infra.Surroundings.교회)) + .text("infra_text") + .build(); + + static ComplexEnvironment complexEnvironment = ComplexEnvironment.builder() + .buildingCondition(ObjectiveItem.좋아요) + .security(ObjectiveItem.평범해요) + .childrenFacility(ObjectiveItem.최고예요) + .text("complex_environment_text") + .build(); + + static Infra updatedInfra = Infra.builder() + .transportations(Set.of(Infra.Transportation.해당_없음)) + .schoolDistricts(Set.of(Infra.SchoolDistrict.어린이집, Infra.SchoolDistrict.초품아)) + .amenities(Set.of(Infra.Amenity.해당_없음)) + .facilities(Set.of(Infra.Facility.해당_없음)) + .surroundings(Set.of(Infra.Surroundings.해당_없음)) + .text("updated_infra_text") + .build(); + + static ComplexEnvironment updatedComplexEnvironment = ComplexEnvironment.builder() + .buildingCondition(ObjectiveItem.별로에요) + .security(ObjectiveItem.별로에요) + .childrenFacility(ObjectiveItem.별로에요) + .text("updated_complex_environment_text") + .build(); +} diff --git a/member-service/member-container/src/test/java/rest/MemberControllerTest.java b/imdang-container/src/test/java/com/project/imdang/member/MemberControllerTest.java similarity index 80% rename from member-service/member-container/src/test/java/rest/MemberControllerTest.java rename to imdang-container/src/test/java/com/project/imdang/member/MemberControllerTest.java index ba87b785..b4ba9d92 100644 --- a/member-service/member-container/src/test/java/rest/MemberControllerTest.java +++ b/imdang-container/src/test/java/com/project/imdang/member/MemberControllerTest.java @@ -1,24 +1,27 @@ -package rest; +package com.project.imdang.member; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; -import com.project.imdang.domain.jwt.JwtTokenProvider; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.ports.output.repository.MemberRepository; +import com.project.imdang.member.persistence.provider.JwtTokenProvider; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import java.util.Optional; +import static com.project.imdang.member.TestData.accessToken; +import static com.project.imdang.member.TestData.member; +import static com.project.imdang.member.TestData.memberId; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static rest.TestData.*; @AutoConfigureMockMvc @SpringBootTest(classes = TestConfiguration.class) diff --git a/imdang-container/src/test/java/com/project/imdang/member/TestData.java b/imdang-container/src/test/java/com/project/imdang/member/TestData.java new file mode 100644 index 00000000..3e2e569e --- /dev/null +++ b/imdang-container/src/test/java/com/project/imdang/member/TestData.java @@ -0,0 +1,23 @@ +package com.project.imdang.member; + +import com.project.imdang.common.domain.valueobject.Gender; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.entity.Member; + +import java.util.UUID; + +public final class TestData { + + static UUID memberId = UUID.fromString("8a1e1c3d-74ef-42c8-9239-a33455b02eda"); + static String fcmToken = "fcm-token"; + static String accessToken = "access-token"; + + static Member member = Member.builder() + .id(new MemberId(memberId)) + .nickname("imdang") + .birthDate("2024-12-31") + .gender(Gender.MALE) + .deviceToken(fcmToken) + .insightCount(1) + .build(); +} diff --git a/infrastructure/aws/s3/build.gradle b/infrastructure/aws/s3/build.gradle index c049d055..0c7b7aa0 100644 --- a/infrastructure/aws/s3/build.gradle +++ b/infrastructure/aws/s3/build.gradle @@ -1,6 +1,3 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' } diff --git a/infrastructure/aws/s3/src/main/java/com/project/imdang/aws/s3/S3Service.java b/infrastructure/aws/s3/src/main/java/com/project/imdang/aws/s3/S3Service.java index 4f2f4931..57874063 100644 --- a/infrastructure/aws/s3/src/main/java/com/project/imdang/aws/s3/S3Service.java +++ b/infrastructure/aws/s3/src/main/java/com/project/imdang/aws/s3/S3Service.java @@ -6,47 +6,30 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.Arrays; -import java.util.List; import java.util.UUID; @RequiredArgsConstructor @Component public class S3Service { + private static final String DIRECTORY = "image"; + @Value("${cloud.aws.s3.bucket}") private String bucket; private final AmazonS3 amazonS3; - public String uploadFile(String directory, MultipartFile file) throws IOException { - - if (file.isEmpty()) { - // TODO - 예외 처리 - throw new RuntimeException("No file detected."); - } - - String originalFilename = file.getOriginalFilename(); - if (originalFilename == null) { - // TODO - 예외 처리 - throw new RuntimeException("No filename."); - } - validateFileExtension(originalFilename); - return upload(directory, file); - } + public String upload(long size, String contentType, InputStream inputStream) throws IOException { + String filename = DIRECTORY + "/" + UUID.randomUUID(); - private String upload(String directory, MultipartFile file) throws IOException { - String filename = directory + "/" + UUID.randomUUID(); ObjectMetadata metadata = new ObjectMetadata(); - metadata.setContentLength(file.getSize()); - metadata.setContentType(file.getContentType()); + metadata.setContentLength(size); + metadata.setContentType(contentType); - InputStream inputStream = file.getInputStream(); byte[] bytes = IOUtils.toByteArray(inputStream); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); @@ -60,20 +43,4 @@ private String upload(String directory, MultipartFile file) throws IOException { } return amazonS3.getUrl(bucket, filename).toString(); } - - private void validateFileExtension(String originalFilename) { - int lastIndex = originalFilename.lastIndexOf("."); - if (lastIndex == -1) { - // TODO - 예외 처리 - throw new RuntimeException("The file has no extension."); - } - - String extension = originalFilename.substring(lastIndex + 1).toLowerCase(); - List allowedExtensions = Arrays.asList("jpg", "jpeg", "png"); - - if (!allowedExtensions.contains(extension)) { - // TODO - 예외 처리 - throw new RuntimeException("Invalid file type."); - } - } } diff --git a/infrastructure/event/build.gradle b/infrastructure/event/build.gradle deleted file mode 100644 index c049d055..00000000 --- a/infrastructure/event/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -bootJar { - enabled = false -} -jar { - enabled = true -} diff --git a/infrastructure/event/src/main/java/com/project/imdang/event/EventProcessor.java b/infrastructure/event/src/main/java/com/project/imdang/event/EventProcessor.java deleted file mode 100644 index e37672c5..00000000 --- a/infrastructure/event/src/main/java/com/project/imdang/event/EventProcessor.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.project.imdang.event; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.domain.event.DomainEvent; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; - -@Slf4j -@RequiredArgsConstructor -@Component -public class EventProcessor { - - private final EventListener eventListener; - private final ObjectMapper objectMapper; - - public void process(T event) { - EventEntry eventEntry = EventEntry.builder() - .type(event.getClass().getSimpleName()) - .contentType(MediaType.APPLICATION_JSON_VALUE) - .payload(toJson(event)) - .build(); - eventListener.process(eventEntry); - } - - private String toJson(T event) { - try { - return objectMapper.writeValueAsString(event); - } catch (JsonProcessingException e) { - // TODO - 예외 처리 - throw new RuntimeException(e); - } - } -} diff --git a/infrastructure/feign/build.gradle b/infrastructure/feign/build.gradle index c049d055..fb5ca09a 100644 --- a/infrastructure/feign/build.gradle +++ b/infrastructure/feign/build.gradle @@ -1,6 +1,4 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.1.3' + implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' } diff --git a/infrastructure/kafka/consumer/build.gradle b/infrastructure/kafka/consumer/build.gradle new file mode 100644 index 00000000..e69de29b diff --git a/infrastructure/kafka/producer/build.gradle b/infrastructure/kafka/producer/build.gradle new file mode 100644 index 00000000..e69de29b diff --git a/infrastructure/saga/build.gradle b/infrastructure/saga/build.gradle index c049d055..107c7086 100644 --- a/infrastructure/saga/build.gradle +++ b/infrastructure/saga/build.gradle @@ -1,6 +1,3 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':common:common-domain:common-domain-core') } diff --git a/infrastructure/saga/src/main/resources/application.properties b/infrastructure/saga/src/main/resources/application.properties deleted file mode 100644 index 19f1f640..00000000 --- a/infrastructure/saga/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=saga diff --git a/insight-service/insight-application/build.gradle b/insight-service/insight-application/build.gradle index c049d055..6856a02d 100644 --- a/insight-service/insight-application/build.gradle +++ b/insight-service/insight-application/build.gradle @@ -1,6 +1,15 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':insight-service:insight-domain:insight-application-service') + implementation project(':common:common-application') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation project(':infrastructure:feign') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.data:spring-data-commons' + implementation 'org.springframework.boot:spring-boot-starter-security' + + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' } diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/AccuseInsightRequest.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/AccuseInsightRequest.java new file mode 100644 index 00000000..2e4e23cc --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/AccuseInsightRequest.java @@ -0,0 +1,21 @@ +package com.project.imdang.insight.application.dto.insight; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AccuseInsightRequest { + // insightId - accuseMemberId UNIQUE + @NotNull + @Schema(description = "인사이트 ID") + private UUID insightId; + + @Schema(description = "신고한 사용자 ID") + private UUID accuseMemberId; // accusedBy : 신고한 memberId +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/AddressDTO.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/AddressDTO.java new file mode 100644 index 00000000..127bb473 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/AddressDTO.java @@ -0,0 +1,29 @@ +package com.project.imdang.insight.application.dto.insight; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +public record AddressDTO( + @Schema(description = "시/도", example = "서울특별시") + @NotBlank + String siDo, // 시/도 (예: 서울특별시) + + @Schema(description = "시/군/구", example = "종로구") + @NotBlank + String siGunGu, // 시/군/구 (예: 종로구) + + @Schema(description = "읍/면/동", example = "효제동") + @NotBlank + String eupMyeonDong, // 읍/면/동 (예: 효제동) + + @Schema(description = "도로명") + String roadName, // 도로명 + + @Schema(description = "번지", example = "191") + String buildingNumber, // 번지 (예: 191) + String detail, + + Double latitude, + Double longitude +) { +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/ApartmentComplexDTO.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/ApartmentComplexDTO.java new file mode 100644 index 00000000..ac4aff9d --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/ApartmentComplexDTO.java @@ -0,0 +1,6 @@ +package com.project.imdang.insight.application.dto.insight; + +public record ApartmentComplexDTO( + String name +) { +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/ComplexEnvironmentDTO.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/ComplexEnvironmentDTO.java new file mode 100644 index 00000000..2a82218e --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/ComplexEnvironmentDTO.java @@ -0,0 +1,25 @@ +package com.project.imdang.insight.application.dto.insight; + +import com.project.imdang.common.domain.valueobject.ObjectiveItem; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +public record ComplexEnvironmentDTO( + // 건물 + @Schema(description = "건물") + @NotNull + ObjectiveItem buildingCondition, + + // 안전 + @Schema(description = "안전") + @NotNull + ObjectiveItem security, + + // 어린이 시설 + @Schema(description = "어린시 시설") + @NotNull + ObjectiveItem childrenFacility, + + String text +) { +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/CreateInsightRequest.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/CreateInsightRequest.java new file mode 100644 index 00000000..ee139b05 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/CreateInsightRequest.java @@ -0,0 +1,66 @@ +package com.project.imdang.insight.application.dto.insight; + +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PositiveOrZero; +import jakarta.validation.constraints.Size; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.Set; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CreateInsightRequest { + + @Schema(description = "인사이트 작성 점수") + @NotNull + @PositiveOrZero + private int score; + +// @Schema(description = "메인 이미지") +// private MultipartFile mainImage; + + @Schema(description = "제목") + @NotBlank + @Size(min = 1, max = 20) + private String title; + + @Schema(description = "주소") + @NotNull + private AddressDTO address; + + @Schema(description = "아파트 단지") + private ApartmentComplexDTO apartmentComplex; + + @Schema(description = "다녀온 날짜", example = "2024-12-31") + @NotNull + private LocalDate visitAt; + + @Schema(description = "다녀온 시간") + private Set visitTimes; + + @Schema(description = "교통 수단") + @NotNull + private Set visitMethods; + + @Schema(description = "요약") + @NotBlank + @Size(min = 30, max = 200) + private String summary; + + @Schema(description = "출입 제한") + @NotNull + private Access access; + + // 인프라 + private InfraDTO infra; + // 단지 환경 + private ComplexEnvironmentDTO complexEnvironment; +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DeleteInsightRequest.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DeleteInsightRequest.java new file mode 100644 index 00000000..6c3f72f3 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DeleteInsightRequest.java @@ -0,0 +1,20 @@ +package com.project.imdang.insight.application.dto.insight; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DeleteInsightRequest { + @NotNull + @Schema(description = "인사이트 ID") + private UUID insightId; + + @Schema(description = "사용자 ID") + private UUID memberId; +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DistrictDTO.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DistrictDTO.java new file mode 100644 index 00000000..29988232 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DistrictDTO.java @@ -0,0 +1,21 @@ +package com.project.imdang.insight.application.dto.insight; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; + +public record DistrictDTO( + @Schema(description = "시/도", example = "서울특별시") + @NotBlank + String siDo, // 시/도 (예: 서울특별시) + + @Schema(description = "시/군/구", example = "종로구") + @NotBlank + String siGunGu, // 시/군/구 (예: 종로구) + + @Schema(description = "읍/면/동", example = "효제동") + @NotBlank + String eupMyeonDong, // 읍/면/동 (예: 효제동) + + String code +) { +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/InfraDTO.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/InfraDTO.java new file mode 100644 index 00000000..58cf2493 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/InfraDTO.java @@ -0,0 +1,38 @@ +package com.project.imdang.insight.application.dto.insight; + +import com.project.imdang.common.domain.valueobject.Infra; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.util.Set; + +public record InfraDTO( + // 교통 + @Schema(description = "교통") + @NotNull + Set transportations, + + // 학군 + @Schema(description = "학군") + @NotNull + Set schoolDistricts, + + // 생활 편의시설 + @Schema(description = "생활 편의 시설") + @NotNull + Set amenities, + + // 문화 및 여가시설(단지 외부) + @Schema(description = "문화 및 여가 시설") + @NotNull + Set facilities, + + // 주변 환경 + @Schema(description = "주변 환경") + @NotNull + Set surroundings, + + @Schema(description = "인프라 총평") + String text +) { +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/RecommendInsightRequest.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/RecommendInsightRequest.java new file mode 100644 index 00000000..3a00b98c --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/RecommendInsightRequest.java @@ -0,0 +1,20 @@ +package com.project.imdang.insight.application.dto.insight; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.UUID; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class RecommendInsightRequest { + @NotNull + @Schema(description = "인사이트 ID") + private UUID insightId; + + @Schema(description = "추천한 사용자 ID") + private UUID recommendMemberId; // recommendedBy +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/UpdateInsightRequest.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/UpdateInsightRequest.java new file mode 100644 index 00000000..601381a9 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/UpdateInsightRequest.java @@ -0,0 +1,66 @@ +package com.project.imdang.insight.application.dto.insight; + +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.PositiveOrZero; +import jakarta.validation.constraints.Size; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.Set; +import java.util.UUID; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class UpdateInsightRequest { + @NotNull + private UUID insightId; + + private AddressDTO address; + private ApartmentComplexDTO apartmentComplex; + + @Schema(description = "인사이트 작성 점수") + @NotNull + @PositiveOrZero + private int score; + + @Schema(description = "제목") + @NotBlank + @Size(min = 1, max = 20) + private String title; + +// @Schema(description = "메인 이미지") +// private MultipartFile mainImage; + + @Schema(description = "요약") + @NotBlank + @Size(min = 30, max = 200) + private String summary; + + @Schema(description = "방문 날짜", example = "2024-12-31") + @NotNull + private LocalDate visitAt; + + @Schema(description = "방문 시간") + @NotNull + private Set visitTimes; + + @Schema(description = "교통 수단") + @NotNull + private Set visitMethods; + + @Schema(description = "출입 제한") + @NotNull + private Access access; + + // 인프라 + private InfraDTO infra; + // 단지 환경 + private ComplexEnvironmentDTO complexEnvironment; +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java new file mode 100644 index 00000000..96d357ab --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java @@ -0,0 +1,104 @@ +package com.project.imdang.insight.application.mapper; + +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.File; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.application.dto.insight.AddressDTO; +import com.project.imdang.insight.application.dto.insight.ApartmentComplexDTO; +import com.project.imdang.insight.application.dto.insight.ComplexEnvironmentDTO; +import com.project.imdang.insight.application.dto.insight.CreateInsightRequest; +import com.project.imdang.insight.application.dto.insight.InfraDTO; +import com.project.imdang.insight.application.dto.insight.UpdateInsightRequest; +import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; +import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.UUID; + +@RequiredArgsConstructor +@Component +public class InsightRequestResolver { + + public CreateInsightCommand toCreateInsightCommand(UUID memberId, + File mainImage, + CreateInsightRequest createInsightRequest) { + return CreateInsightCommand.builder() + .memberId(new MemberId(memberId)) + .score(createInsightRequest.getScore()) + .mainImage(mainImage) + .title(createInsightRequest.getTitle()) + .address(toAddress(createInsightRequest.getAddress())) + .apartmentComplex(toApartmentComplex(createInsightRequest.getApartmentComplex())) + .visitAt(createInsightRequest.getVisitAt()) + .visitTimes(createInsightRequest.getVisitTimes()) + .visitMethods(createInsightRequest.getVisitMethods()) + .summary(createInsightRequest.getSummary()) + .access(createInsightRequest.getAccess()) + .infra(toInfra(createInsightRequest.getInfra())) + .complexEnvironment(toComplexEnvironment(createInsightRequest.getComplexEnvironment())) + .build(); + } + + public UpdateInsightCommand toUpdateInsightCommand(UUID memberId, + File mainImage, + UpdateInsightRequest updateInsightRequest) { + return UpdateInsightCommand.builder() + .memberId(new MemberId(memberId)) + .score(updateInsightRequest.getScore()) + .mainImage(mainImage) + .title(updateInsightRequest.getTitle()) + .address(toAddress(updateInsightRequest.getAddress())) + .apartmentComplex(toApartmentComplex(updateInsightRequest.getApartmentComplex())) + .visitAt(updateInsightRequest.getVisitAt()) + .visitTimes(updateInsightRequest.getVisitTimes()) + .visitMethods(updateInsightRequest.getVisitMethods()) + .summary(updateInsightRequest.getSummary()) + .access(updateInsightRequest.getAccess()) + .infra(toInfra(updateInsightRequest.getInfra())) + .complexEnvironment(toComplexEnvironment(updateInsightRequest.getComplexEnvironment())) + .build(); + } + + private static Address toAddress(AddressDTO address) { + return Address.builder() + .siDo(address.siDo()) + .siGunGu(address.siGunGu()) + .eupMyeonDong(address.eupMyeonDong()) + .roadName(address.roadName()) + .buildingNumber(address.buildingNumber()) + .detail(address.detail()) + .latitude(address.latitude()) + .longitude(address.longitude()) + .build(); + } + + private static ApartmentComplex toApartmentComplex(ApartmentComplexDTO apartmentComplex) { + return ApartmentComplex.builder() + .name(apartmentComplex.name()) + .build(); + } + + private static Infra toInfra(InfraDTO infra) { + return Infra.builder() + .transportations(infra.transportations()) + .schoolDistricts(infra.schoolDistricts()) + .amenities(infra.amenities()) + .facilities(infra.facilities()) + .surroundings(infra.surroundings()) + .text(infra.text()) + .build(); + } + + private static ComplexEnvironment toComplexEnvironment(ComplexEnvironmentDTO complexEnvironment) { + return ComplexEnvironment.builder() + .buildingCondition(complexEnvironment.buildingCondition()) + .security(complexEnvironment.security()) + .childrenFacility(complexEnvironment.childrenFacility()) + .text(complexEnvironment.text()) + .build(); + } +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/DistrictController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/DistrictController.java new file mode 100644 index 00000000..60927092 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/DistrictController.java @@ -0,0 +1,52 @@ +package com.project.imdang.insight.application.rest; + +import com.project.imdang.insight.domain.dto.insight.list.DistrictResult; +import com.project.imdang.insight.domain.ports.input.service.InsightApplicationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import static com.project.imdang.common.application.Property.DEFAULT_SI_DO; + +@Slf4j +@RequestMapping("/districts") +@RequiredArgsConstructor +@RestController +public class DistrictController { + // TODO - 캐싱 + private final InsightApplicationService insightApplicationService; + + @GetMapping("/si-gun-gu") + public ResponseEntity> listSiGunGu( + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page districts = insightApplicationService.listDistrict(DEFAULT_SI_DO, null, pageNumber, pageSize) + .map(district -> DistrictResult.builder() + .siDo(district.getSiDo()) + .siGunGu(district.getSiGunGu()) + .eupMyeonDong(district.getEupMyeonDong()) + .code(district.getCode()) + .build()); + return ResponseEntity.ok(districts); + } + + @GetMapping("/eup-myeon-dong") + public ResponseEntity> listEupMyeonDong( + @RequestParam(name = "siGunGu") String siGunGu, + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page districts = insightApplicationService.listDistrict(DEFAULT_SI_DO, siGunGu, pageNumber, pageSize) + .map(district -> DistrictResult.builder() + .siDo(district.getSiDo()) + .siGunGu(district.getSiGunGu()) + .eupMyeonDong(district.getEupMyeonDong()) + .code(district.getCode()) + .build()); + return ResponseEntity.ok(districts); + } +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java new file mode 100644 index 00000000..596ce528 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java @@ -0,0 +1,267 @@ +package com.project.imdang.insight.application.rest; + +import com.project.imdang.common.domain.valueobject.File; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.application.dto.insight.AccuseInsightRequest; +import com.project.imdang.insight.domain.dto.insight.list.ApartmentComplexResult; +import com.project.imdang.insight.application.dto.insight.CreateInsightRequest; +import com.project.imdang.insight.application.dto.insight.DeleteInsightRequest; +import com.project.imdang.insight.application.dto.insight.RecommendInsightRequest; +import com.project.imdang.insight.application.dto.insight.UpdateInsightRequest; +import com.project.imdang.insight.application.mapper.InsightRequestResolver; +import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; +import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; +import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; +import com.project.imdang.insight.domain.dto.insight.detail.DetailInsightQuery; +import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; +import com.project.imdang.insight.domain.dto.insight.list.InsightResult; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByApartmentComplexQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDateQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDistrictQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightQuery; +import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; +import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; +import com.project.imdang.insight.domain.ports.input.service.InsightApplicationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.time.LocalDate; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import static com.project.imdang.common.application.Property.DEFAULT_SI_DO; + +@Slf4j +@RequestMapping("/insights") +@RequiredArgsConstructor +@RestController +@Tag(name = "InsightController", description = "인사이트 API") +public class InsightController { + // TODO - 캐싱 + private final InsightApplicationService insightApplicationService; + private final InsightRequestResolver resolver; + + // 내가 다녀온 apartmentComplexName 리스트 API + @Operation(description = "내가 다녀온 아파트 단지 이름 목록 API") + @ApiResponse(responseCode = "200", description = "내가 다녀온 아파트 단지 이름 목록 조회 성공") + @GetMapping("/created-by-me/apartment-complexes") + public ResponseEntity> listByMyVisitedApartmentComplex(@AuthenticationPrincipal UUID memberId) { + List apartmentComplexes = insightApplicationService.listMyVisitedApartmentComplex(new MemberId(memberId)).stream() + .map(apartmentComplex -> new ApartmentComplexResult(apartmentComplex.getName())) + .toList(); + return ResponseEntity.ok(apartmentComplexes); + } + + @Operation(description = "오늘 새롭게 올라온 인사이트 목록 조회 API") + @ApiResponse(responseCode = "200", description = "인사이트 목록이 조회되었습니다.") + @GetMapping("/by-date") + public ResponseEntity> listByDate(@RequestParam(name = "date", required = false) LocalDate date, + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + ListInsightByDateQuery listInsightByDateQuery = ListInsightByDateQuery.builder() + .date(date == null ? LocalDate.now() : date) + .pageNumber(pageNumber) + .pageSize(pageSize) + .direction("DESC") + .properties(new String[]{"createdAt"}) + .build(); + Page insightResults = insightApplicationService.listInsightByDate(listInsightByDateQuery); + return ResponseEntity.ok(insightResults); + } + + // 최신순, 인기순(추천수 순) + // /insights?page=1&size=20&sort=createdAt,desc + @Operation(description = "추천수 TOP 10 인사이트 목록 조회 API") + @ApiResponse(responseCode = "200", description = "인사이트 목록이 조회되었습니다.") + @GetMapping + public ResponseEntity> list(@RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + ListInsightQuery listInsightQuery = ListInsightQuery.builder() + .pageNumber(pageNumber) + .pageSize(pageSize) + .direction("DESC") + .properties(new String[]{"recommendedCount"}) + .build(); + Page insightResults = insightApplicationService.listInsight(listInsightQuery); + return ResponseEntity.ok(insightResults); + } + + @GetMapping("/by-district") + public ResponseEntity> listByDistrict(@RequestParam(name = "siGunGu") String siGunGu, + @RequestParam(name = "eupMyeonDong") String eupMyeonDong, + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + + ListInsightByDistrictQuery listInsightByDistrictQuery = ListInsightByDistrictQuery.builder() + .siDo(DEFAULT_SI_DO) + .siGunGu(siGunGu) + .eupMyeonDong(eupMyeonDong) + .pageNumber(pageNumber) + .pageSize(pageSize) + .direction("DESC") + .properties(new String[]{"createdAt"}) + .build(); + Page insightResults = insightApplicationService.listInsightByDistrict(listInsightByDistrictQuery); + return ResponseEntity.ok(insightResults); + } + + @Operation(description = "아파트 단지별 인사이트 목록 조회 API") + @ApiResponse(responseCode = "200", description = "아파트 단지별 인사이트 목록이 조회되었습니다.") + @GetMapping("/by-apartment-complex") + public ResponseEntity> listByApartmentComplex(@RequestParam(name = "apartmentComplexName") String apartmentComplexName, + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + + ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery = ListInsightByApartmentComplexQuery.builder() + .apartmentComplexName(apartmentComplexName) + .pageNumber(pageNumber) + .pageSize(pageSize) + .direction("DESC") + .properties(new String[]{"createdAt"}) + .build(); + Page insightResults = insightApplicationService.listInsightByApartmentComplex(listInsightByApartmentComplexQuery); + return ResponseEntity.ok(insightResults); + } + + // 상세, 프리뷰 + @Operation(description = "인사이트 상세 조회 API") + @ApiResponse(responseCode = "200", description = "인사이트가 조회 되었습니다.") + @GetMapping("/detail") + public ResponseEntity detail(@AuthenticationPrincipal UUID memberId, + @RequestParam(name = "insightId") UUID insightId) { + DetailInsightQuery detailInsightQuery = new DetailInsightQuery(new InsightId(insightId), new MemberId(memberId)); + InsightDetailResult insightDetailResult = insightApplicationService.detailInsight(detailInsightQuery); + log.info("Returning detail of insight[id: {}].", insightDetailResult.getInsightId()); + return ResponseEntity.ok(insightDetailResult); + } + + @Operation(description = "인사이트 작성 API") + @ApiResponse(responseCode = "200", description = "인사이트가 작성 완료") + @PostMapping("/create") + public ResponseEntity createInsight(@AuthenticationPrincipal UUID memberId, + @RequestPart("createInsightCommand") @Valid CreateInsightRequest createInsightRequest, + @RequestPart("mainImage") MultipartFile mainImage) { + File file = validateFile(mainImage); + CreateInsightCommand createInsightCommand = resolver.toCreateInsightCommand(memberId, file, createInsightRequest); + InsightId insightId = insightApplicationService.createInsight(createInsightCommand); + log.info("Insight[id: {}] is created.", insightId); + return ResponseEntity.ok().build(); + } + + @Operation(description = "인사이트 수정 API") + @ApiResponse(responseCode = "200", description = "인사이트가 수정되었습니다.") + @PostMapping("/update") + public ResponseEntity updateInsight(@AuthenticationPrincipal UUID memberId, + // TODO - CHANGE + @RequestPart("updateInsightCommand") @Valid UpdateInsightRequest updateInsightRequest, + @RequestPart(value = "mainImage", required = false) MultipartFile mainImage) { + File file = validateFile(mainImage); + UpdateInsightCommand updateInsightCommand = resolver.toUpdateInsightCommand(memberId, file, updateInsightRequest); + InsightId insightId = insightApplicationService.updateInsight(updateInsightCommand); + log.info("Insight[id: {}] is updated.", insightId); + return ResponseEntity.ok().build(); + } + + @Operation(description = "인사이트 삭제 API") + @ApiResponse(responseCode = "200", description = "인사이트가 삭제되었습니다.") + @PostMapping("/delete") + public ResponseEntity deleteInsight(@AuthenticationPrincipal UUID memberId, + @RequestBody @Valid DeleteInsightRequest deleteInsightRequest) { + DeleteInsightCommand deleteInsightCommand = DeleteInsightCommand.builder() + .memberId(new MemberId(memberId)) + .insightId(new InsightId(deleteInsightRequest.getInsightId())) + .build(); + InsightId insightId = insightApplicationService.deleteInsight(deleteInsightCommand); + log.info("Insight[id: {}] is deleted.", insightId); + return ResponseEntity.ok().build(); + } + + @Operation(description = "인사이트 추천 API") + @ApiResponse(responseCode = "200", description = "인사이트가 추천되었습니다.") + @PostMapping("/recommend") + public ResponseEntity recommendInsight(@AuthenticationPrincipal UUID memberId, + @RequestBody @Valid RecommendInsightRequest recommendInsightRequest) { + + RecommendInsightCommand recommendInsightCommand = RecommendInsightCommand.builder() + .recommendMemberId(new MemberId(memberId)) + .insightId(new InsightId(recommendInsightRequest.getInsightId())) + .build(); + InsightId insightId = insightApplicationService.recommendInsight(recommendInsightCommand); + log.info("Insight[id: {}] is recommended.", insightId); + return ResponseEntity.ok().build(); + } + + @Operation(description = "인사이트 신고 API") + @ApiResponse(responseCode = "200", description = "인사이트가 신고되었습니다.") + @PostMapping("/accuse") + public ResponseEntity accuseInsight(@AuthenticationPrincipal UUID memberId, + @RequestBody @Valid AccuseInsightRequest accuseInsightRequest) { + AccuseInsightCommand accuseInsightCommand = AccuseInsightCommand.builder() + .accuseMemberId(new MemberId(memberId)) + .insightId(new InsightId(accuseInsightRequest.getInsightId())) + .build(); + InsightId insightId = insightApplicationService.accuseInsight(accuseInsightCommand); + log.info("Insight[id: {}] is accused.", insightId); + return ResponseEntity.ok().build(); + } + + private File validateFile(MultipartFile file) { + + if (file.isEmpty()) { + // TODO - 예외 처리 + throw new RuntimeException("No file detected."); + } + + String originalFilename = file.getOriginalFilename(); + if (originalFilename == null) { + // TODO - 예외 처리 + throw new RuntimeException("No filename."); + } + validateFileExtension(originalFilename); + try { + return File.builder() + .originalFilename(originalFilename) + .size(file.getSize()) + .contentType(file.getContentType()) + .inputStream(file.getInputStream()) + .build(); + } catch (IOException e) { + // TODO - 예외 처리 + throw new RuntimeException(e); + } + } + + private void validateFileExtension(String originalFilename) { + int lastIndex = originalFilename.lastIndexOf("."); + if (lastIndex == -1) { + // TODO - 예외 처리 + throw new RuntimeException("The file has no extension."); + } + + String extension = originalFilename.substring(lastIndex + 1).toLowerCase(); + List allowedExtensions = Arrays.asList("jpg", "jpeg", "png"); + + if (!allowedExtensions.contains(extension)) { + // TODO - 예외 처리 + throw new RuntimeException("Invalid file type."); + } + } +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/MyInsightController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/MyInsightController.java new file mode 100644 index 00000000..cf89d261 --- /dev/null +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/MyInsightController.java @@ -0,0 +1,104 @@ +package com.project.imdang.insight.application.rest; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.application.dto.insight.DistrictDTO; +import com.project.imdang.insight.domain.dto.insight.list.MyApartmentComplexResult; +import com.project.imdang.insight.domain.dto.insight.list.MyDistrictResult; +import com.project.imdang.insight.domain.dto.insight.list.InsightResult; +import com.project.imdang.insight.domain.dto.insight.list.InsightSimpleResult; +import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightQuery; +import com.project.imdang.insight.domain.ports.input.service.InsightApplicationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.UUID; + +@Slf4j +@RequestMapping("/my-insights") +@RequiredArgsConstructor +@RestController +public class MyInsightController { +// 보관함 + private final InsightApplicationService insightApplicationService; + + // 보관중인 인사이트 자치구 목록 API + @GetMapping("/districts") + public ResponseEntity> listDistrict(@AuthenticationPrincipal UUID memberId) { + List myDistrictResults = insightApplicationService.listMyInsightDistrict(new MemberId(memberId)); + return ResponseEntity.ok(myDistrictResults); + } + + // '단지별 보기' 클릭 시, 자치구별 단지-인사이트 개수 목록 API + /* + { + "apartmentComplexName": "신뇬현 더 센트럴 푸르지오", + "insightCount": 12 + } + */ + @GetMapping("/by-district/apartment-complexes") + public ResponseEntity> listApartmentComplexByDistrict(@AuthenticationPrincipal UUID memberId, + @ModelAttribute DistrictDTO district) { + List myApartmentComplexResults + = insightApplicationService.listMyInsightApartmentComplexByDistrict(new MemberId(memberId), district.siDo(), district.siGunGu(), district.eupMyeonDong()); + return ResponseEntity.ok(myApartmentComplexResults); + } + + // 전체 (내 인사이트 + 교환한 인사이트) + // + 내 인사이트만 보기 + // + 단지별 보기 + @GetMapping + public ResponseEntity> list(@AuthenticationPrincipal UUID memberId, + @ModelAttribute DistrictDTO district, + @RequestParam(name = "apartmentComplexName", required = false) String apartmentComplexName, + @RequestParam(name = "onlyMine", defaultValue = "FALSE") Boolean onlyMine, + // TODO - PagingQuery + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + @RequestParam(name = "direction", defaultValue = "DESC") String direction, + @RequestParam(name = "properties", defaultValue = "created_at") String[] properties) { + + ListMyInsightQuery listMyInsightQuery = ListMyInsightQuery.builder() + .memberId(new MemberId(memberId)) + .siDo(district.siDo()) + .siGunGu(district.siGunGu()) + .eupMyeonDong(district.eupMyeonDong()) + .apartmentComplexName(apartmentComplexName) + .onlyMine(onlyMine) + .pageNumber(pageNumber) + .pageSize(pageSize) + .direction(direction) + .properties(properties) + .build(); + Page insights = insightApplicationService.listMyInsight(listMyInsightQuery); + return ResponseEntity.ok(insights); + } + + @GetMapping("/created-by-me") + public ResponseEntity> listCreatedByMe(@AuthenticationPrincipal UUID memberId, + // TODO - PagingQuery + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + @RequestParam(name = "direction", defaultValue = "DESC") String direction, + @RequestParam(name = "properties", defaultValue = "created_at") String[] properties) { + + ListMyInsightCreatedByMeQuery listMyInsightCreatedByMeQuery = ListMyInsightCreatedByMeQuery.builder() + .memberId(new MemberId(memberId)) + .pageNumber(pageNumber) + .pageSize(pageSize) + .direction(direction) + .properties(properties) + .build(); + Page insights = insightApplicationService.listMyInsightCreatedByMe(listMyInsightCreatedByMeQuery); + return ResponseEntity.ok(insights); + } +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ApartmentComplexApiRestClient.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ApartmentComplexApiRestClient.java deleted file mode 100644 index 7238b27b..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ApartmentComplexApiRestClient.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.project.imdang.insight.service.application.client; - -import org.springframework.stereotype.Component; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.service.annotation.GetExchange; -import org.springframework.web.service.annotation.HttpExchange; - -@HttpExchange -@Component -public interface ApartmentComplexApiRestClient { - - @GetExchange("/AptIdInfoSvc/v1/getAptInfo") - ApartmentComplexApiResponse getApartmentInfoList(@RequestParam(name = "page", defaultValue = "0") Integer page, - @RequestParam(name = "perPage", defaultValue = "10") Integer perPage, - @RequestParam(name = "serviceKey") String serviceKey, - @RequestParam(name = "cond[ADRES::LIKE]") String address); -} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/exception/handler/GlobalExceptionHandler.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/exception/handler/GlobalExceptionHandler.java deleted file mode 100644 index 559ad051..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/exception/handler/GlobalExceptionHandler.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.project.imdang.insight.service.application.exception.handler; - -import com.project.imdang.application.handler.ErrorDTO; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; -import jakarta.validation.ValidationException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import java.util.stream.Collectors; - -@Slf4j -@ControllerAdvice -public class GlobalExceptionHandler { - - @ResponseBody - @ExceptionHandler(value = {Exception.class}) - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public ErrorDTO handleException(Exception exception) { - log.error(exception.getMessage(), exception); - return ErrorDTO.of(HttpStatus.INTERNAL_SERVER_ERROR, exception.getMessage()); - } - - @ResponseBody - @ExceptionHandler(value = {ValidationException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(ValidationException validationException) { - ErrorDTO errorDTO; - if (validationException instanceof ConstraintViolationException) { - String violations = extractViolationsFromException((ConstraintViolationException) validationException); - log.error(violations, validationException); - errorDTO = ErrorDTO.of(HttpStatus.BAD_REQUEST, violations); - } else { - String exceptionMessage = validationException.getMessage(); - log.error(exceptionMessage, validationException); - errorDTO = ErrorDTO.of(HttpStatus.BAD_REQUEST, exceptionMessage); - } - return errorDTO; - } - - private String extractViolationsFromException(ConstraintViolationException validationException) { - return validationException.getConstraintViolations() - .stream() - .map(ConstraintViolation::getMessage) - .collect(Collectors.joining("--")); - } - - @ResponseBody - @ExceptionHandler(value = {MethodArgumentNotValidException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(MethodArgumentNotValidException methodArgumentNotValidException) { - log.error(methodArgumentNotValidException.getMessage(), methodArgumentNotValidException); - return ErrorDTO.of(HttpStatus.BAD_REQUEST, "Please input " + methodArgumentNotValidException.getParameter().getParameterName()); - } -} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/exception/handler/InsightGlobalExceptionHandler.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/exception/handler/InsightGlobalExceptionHandler.java deleted file mode 100644 index 9509981b..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/exception/handler/InsightGlobalExceptionHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.project.imdang.insight.service.application.exception.handler; - -import com.project.imdang.application.handler.ErrorDTO; -import com.project.imdang.insight.service.domain.exception.InsightDomainException; -import com.project.imdang.insight.service.domain.exception.InsightNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Slf4j -@ControllerAdvice -public class InsightGlobalExceptionHandler extends GlobalExceptionHandler { - - @ResponseBody - @ExceptionHandler(value = {InsightDomainException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(InsightDomainException insightDomainException) { - String message = insightDomainException.getMessage(); - log.error(message, insightDomainException); - return ErrorDTO.of(HttpStatus.BAD_REQUEST, message); - } - - @ResponseBody - @ExceptionHandler(value = {InsightNotFoundException.class}) - @ResponseStatus(HttpStatus.NOT_FOUND) - public ErrorDTO handleException(InsightNotFoundException insightNotFoundException) { - String message = insightNotFoundException.getMessage(); - log.error(message, insightNotFoundException); - return ErrorDTO.of(HttpStatus.NOT_FOUND, message); - } -} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/ApartmentComplexController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/ApartmentComplexController.java deleted file mode 100644 index ec5151e8..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/ApartmentComplexController.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.project.imdang.insight.service.application.client.ApartmentComplexApiResponse; -import com.project.imdang.insight.service.application.client.ApartmentComplexApiRestClient; -import io.swagger.v3.oas.annotations.Operation; -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 jakarta.validation.constraints.NotBlank; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@Slf4j -@Tag(name = "ApartmentComplexController", description = "아파트 단지 이름 목록 조회 API ") -@RequestMapping("/apartment-complexes") -@RequiredArgsConstructor -@RestController -@Validated -public class ApartmentComplexController { - - // TODO - private final String API_KEY = "api-key"; - private final ApartmentComplexApiRestClient apartmentComplexApiRestClient; - - // 주소에 해당하는 apartmentComplexName 리스트 API - @Operation(description = "주소에 해당하는 아파트 단지 이름 목록 API") - @ApiResponse(responseCode = "200", description = "주소에 해당하는 아파트 단지 이름 목록 조회 성공", - content = @Content(schema = @Schema(implementation = ApartmentComplexApiResponse.class))) - @GetMapping - public ResponseEntity listByAddress( - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, - @RequestParam(name = "address") @NotBlank String address) { - ApartmentComplexApiResponse response = apartmentComplexApiRestClient.getApartmentInfoList(pageNumber, pageSize, API_KEY, address); - return ResponseEntity.ok(response); - } -} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/DistrictController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/DistrictController.java deleted file mode 100644 index 42cf0eda..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/DistrictController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.project.imdang.insight.service.domain.ports.input.service.InsightApplicationService; -import com.project.imdang.insight.service.domain.valueobject.District; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -@Slf4j -@RequestMapping("/districts") -@RequiredArgsConstructor -@RestController -public class DistrictController { - // TODO - 캐싱 - public static final String DEFAULT_SI_DO = "서울특별시"; - private final InsightApplicationService insightApplicationService; - - @GetMapping("/si-gun-gu") - public ResponseEntity> listSiGunGu( - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - Page districts = insightApplicationService.listDistrict(DEFAULT_SI_DO, null, pageNumber, pageSize); - return ResponseEntity.ok(districts); - } - - @GetMapping("/eup-myeon-dong") - public ResponseEntity> listEupMyeonDong( - @RequestParam(name = "siGunGu") String siGunGu, - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - Page districts = insightApplicationService.listDistrict(DEFAULT_SI_DO, siGunGu, pageNumber, pageSize); - return ResponseEntity.ok(districts); - } -} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/ExchangeController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/ExchangeController.java deleted file mode 100644 index 038cd953..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/ExchangeController.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestResponse; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestResponse; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightCommand; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightResponse; -import com.project.imdang.insight.service.domain.ports.input.service.ExchangeApplicationService; -import io.swagger.v3.oas.annotations.Operation; -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 jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -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 java.util.UUID; - -@Slf4j -@RequestMapping("/exchanges") -@RequiredArgsConstructor -@RestController -@Tag(name = "ExchangeController", description = "인사이트 교환 API ") -public class ExchangeController { - - private final ExchangeApplicationService exchangeApplicationService; - - /** - * 인사이트 교환 요청 - */ - @Operation(description = "인사이트 교환 요청 API") - @ApiResponse(responseCode = "200", description = "인사이트 교환 요청 성공", - content = @Content(schema = @Schema(implementation = RequestExchangeInsightResponse.class))) - @PostMapping("/request") - public ResponseEntity request(@AuthenticationPrincipal UUID memberId, - @RequestBody @Valid RequestExchangeInsightCommand requestExchangeInsightCommand) { - - requestExchangeInsightCommand.setRequestMemberId(memberId); - if (requestExchangeInsightCommand.getRequestMemberInsightId() != null) { - log.info("Insight[id: {}] is requested to exchange with insight[id: {}].", - requestExchangeInsightCommand.getRequestedInsightId(), requestExchangeInsightCommand.getRequestMemberInsightId()); - } else { - // 쿠폰 - log.info("Insight[id: {}] is requested with memberCoupon[id: {}].", - requestExchangeInsightCommand.getRequestedInsightId(), requestExchangeInsightCommand.getMemberCouponId()); - } - - RequestExchangeInsightResponse requestExchangeInsightResponse - = exchangeApplicationService.requestExchangeInsight(requestExchangeInsightCommand); - log.info("ExchangeRequest[id : {}] is created.", requestExchangeInsightResponse.getExchangeRequestId()); - return ResponseEntity.ok(requestExchangeInsightResponse); - } - - /** - * 인사이트 요청 수락 - */ - @Operation(description = "인사이트 교환 수락 API") - @ApiResponse(responseCode = "200", description = "인사이트 교환 수락 성공", - content = @Content(schema = @Schema(implementation = AcceptExchangeRequestResponse.class))) - @PostMapping("/accept") - public ResponseEntity accept(@AuthenticationPrincipal UUID memberId, @RequestBody @Valid AcceptExchangeRequestCommand acceptExchangeRequestCommand) { - acceptExchangeRequestCommand.setRequestedMemberId(memberId); - AcceptExchangeRequestResponse acceptExchangeRequestResponse = exchangeApplicationService.acceptExchangeRequest(acceptExchangeRequestCommand); - log.info("ExchangeRequest[id: {}] is accepted.", acceptExchangeRequestCommand.getExchangeRequestId()); - return ResponseEntity.ok(acceptExchangeRequestResponse); - } - - /** - * 인사이트 요청 거절 - */ - @Operation(description = "인사이트 교환 거절 API") - @ApiResponse(responseCode = "200", description = "인사이트 교환 거절 성공", - content = @Content(schema = @Schema(implementation = RejectExchangeRequestResponse.class))) - @PostMapping("/reject") - public ResponseEntity reject(@AuthenticationPrincipal UUID memberId, @RequestBody @Valid RejectExchangeRequestCommand rejectExchangeRequestCommand) { - rejectExchangeRequestCommand.setRequestedMemberId(memberId); - RejectExchangeRequestResponse rejectExchangeRequestResponse = exchangeApplicationService.rejectExchangeRequest(rejectExchangeRequestCommand); - log.info("ExchangeRequest[id: {}] is rejected.", rejectExchangeRequestCommand.getExchangeRequestId()); - return ResponseEntity.ok(rejectExchangeRequestResponse); - } -} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/InsightController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/InsightController.java deleted file mode 100644 index 6207fba1..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/InsightController.java +++ /dev/null @@ -1,211 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByApartmentComplexQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByDateQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByDistrictQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightResponse; -import com.project.imdang.insight.service.domain.ports.input.service.InsightApplicationService; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import io.swagger.v3.oas.annotations.Operation; -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 jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; - -import java.time.LocalDate; -import java.util.List; -import java.util.UUID; - -@Slf4j -@RequestMapping("/insights") -@RequiredArgsConstructor -@RestController -@Tag(name = "InsightController", description = "인사이트 API") -public class InsightController { - // TODO - 캐싱 - private final InsightApplicationService insightApplicationService; - - // 내가 다녀온 apartmentComplexName 리스트 API - @Operation(description = "내가 다녀온 아파트 단지 이름 목록 API") - @ApiResponse(responseCode = "200", description = "내가 다녀온 아파트 단지 이름 목록 조회 성공") - @GetMapping("/created-by-me/apartment-complexes") - public ResponseEntity> listByMyVisitedApartmentComplex(@AuthenticationPrincipal UUID memberId) { - List apartmentComplexes = insightApplicationService.listMyVisitedApartmentComplex(memberId); - return ResponseEntity.ok(apartmentComplexes); - } - - @Operation(description = "오늘 새롭게 올라온 인사이트 목록 조회 API") - @ApiResponse(responseCode = "200", description = "인사이트 목록이 조회되었습니다.") - @GetMapping("/by-date") - public ResponseEntity> listByDate(@RequestParam(name = "date", required = false) LocalDate date, - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - ListInsightByDateQuery listInsightByDateQuery = ListInsightByDateQuery.builder() - .date(date == null ? LocalDate.now() : date) - .pageNumber(pageNumber) - .pageSize(pageSize) - .direction("DESC") - .properties(new String[]{"createdAt"}) - .build(); - Page insightResponses = insightApplicationService.listInsightByDate(listInsightByDateQuery); - return ResponseEntity.ok(insightResponses); - } - - // 최신순, 인기순(추천수 순) - // /insights?page=1&size=20&sort=createdAt,desc - @Operation(description = "추천수 TOP 10 인사이트 목록 조회 API") - @ApiResponse(responseCode = "200", description = "인사이트 목록이 조회되었습니다.") - @GetMapping - public ResponseEntity> list(@RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - ListInsightQuery listInsightQuery = ListInsightQuery.builder() - .pageNumber(pageNumber) - .pageSize(pageSize) - .direction("DESC") - .properties(new String[]{"recommendedCount"}) - .build(); - Page insightResponses = insightApplicationService.listInsight(listInsightQuery); - return ResponseEntity.ok(insightResponses); - } - - @GetMapping("/by-district") - public ResponseEntity> listByDistrict(@RequestParam(name = "siGunGu") String siGunGu, - @RequestParam(name = "eupMyeonDong") String eupMyeonDong, - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - - // TODO - 리팩토링 - ListInsightByDistrictQuery listInsightByDistrictQuery = ListInsightByDistrictQuery.builder() - .siDo("서울특별시") -// .siDo(DEFAULT_SI_DO) - .siGunGu(siGunGu) - .eupMyeonDong(eupMyeonDong) - .pageNumber(pageNumber) - .pageSize(pageSize) - .direction("DESC") - .properties(new String[]{"createdAt"}) - .build(); - Page insightResponses = insightApplicationService.listInsightByDistrict(listInsightByDistrictQuery); - return ResponseEntity.ok(insightResponses); - } - - @Operation(description = "아파트 단지별 인사이트 목록 조회 API") - @ApiResponse(responseCode = "200", description = "아파트 단지별 인사이트 목록이 조회되었습니다.") - @GetMapping("/by-apartment-complex") - public ResponseEntity> listByApartmentComplex(@RequestParam(name = "apartmentComplexName") String apartmentComplexName, - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - - ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery = ListInsightByApartmentComplexQuery.builder() - .apartmentComplexName(apartmentComplexName) - .pageNumber(pageNumber) - .pageSize(pageSize) - .direction("DESC") - .properties(new String[]{"createdAt"}) - .build(); - Page insightResponses = insightApplicationService.listInsightByApartmentComplex(listInsightByApartmentComplexQuery); - return ResponseEntity.ok(insightResponses); - } - - // 상세, 프리뷰 - @Operation(description = "인사이트 상세 조회 API") - @ApiResponse(responseCode = "200", description = "인사이트가 조회 되었습니다.", content = @Content(schema = @Schema(implementation = DeleteInsightResponse.class))) - @GetMapping("/detail") - public ResponseEntity detail(@AuthenticationPrincipal UUID memberId, - @RequestParam(name = "insightId") UUID insightId) { - DetailInsightQuery detailInsightQuery = new DetailInsightQuery(insightId, memberId); - DetailInsightResponse detailInsightResponse = insightApplicationService.detailInsight(detailInsightQuery); - log.info("Returning detail of insight[id: {}].", detailInsightResponse.getInsightId()); - return ResponseEntity.ok(detailInsightResponse); - } - - @Operation(description = "인사이트 작성 API") - @ApiResponse(responseCode = "200", description = "인사이트가 작성 완료", - content = @Content(schema = @Schema(implementation = CreateInsightResponse.class))) - @PostMapping("/create") - public ResponseEntity createInsight(@AuthenticationPrincipal UUID memberId, - @RequestPart("createInsightCommand") @Valid CreateInsightCommand createInsightCommand, - @RequestPart("mainImage") MultipartFile mainImage) { - createInsightCommand.setMemberId(memberId); - createInsightCommand.setMainImage(mainImage); - CreateInsightResponse createInsightResponse = insightApplicationService.createInsight(createInsightCommand); - log.info("Insight[id: {}] is created.", createInsightResponse.getInsightId()); - return ResponseEntity.ok(createInsightResponse); - } - - @Operation(description = "인사이트 수정 API") - @ApiResponse(responseCode = "200", description = "인사이트가 수정되었습니다.", - content = @Content(schema = @Schema(implementation = UpdateInsightResponse.class))) - @PostMapping("/update") - public ResponseEntity updateInsight(@AuthenticationPrincipal UUID memberId, - @RequestPart("updateInsightCommand") @Valid UpdateInsightCommand updateInsightCommand, - @RequestPart(value = "mainImage", required = false) MultipartFile mainImage) { - updateInsightCommand.setMemberId(memberId); - updateInsightCommand.setMainImage(mainImage); - UpdateInsightResponse updateInsightResponse = insightApplicationService.updateInsight(updateInsightCommand); - log.info("Insight[id: {}] is updated.", updateInsightResponse.getInsightId()); - return ResponseEntity.ok(updateInsightResponse); - } - - - @Operation(description = "인사이트 삭제 API") - @ApiResponse(responseCode = "200", description = "인사이트가 삭제되었습니다.", - content = @Content(schema = @Schema(implementation = DeleteInsightResponse.class))) - @PostMapping("/delete") - public ResponseEntity deleteInsight(@AuthenticationPrincipal UUID memberId, @RequestBody DeleteInsightCommand deleteInsightCommand) { - deleteInsightCommand.setMemberId(memberId); - DeleteInsightResponse deleteInsightResponse = insightApplicationService.deleteInsight(deleteInsightCommand); - log.info("Insight[id: {}] is deleted.", deleteInsightResponse.getInsightId()); - return ResponseEntity.ok(deleteInsightResponse); - } - - @Operation(description = "인사이트 추천 API") - @ApiResponse(responseCode = "200", description = "인사이트가 추천되었습니다.", - content = @Content(schema = @Schema(implementation = RecommendInsightResponse.class))) - @PostMapping("/recommend") - public ResponseEntity recommendInsight(@AuthenticationPrincipal UUID memberId, @RequestBody RecommendInsightCommand recommendInsightCommand) { - recommendInsightCommand.setRecommendMemberId(memberId); - RecommendInsightResponse recommendInsightResponse = insightApplicationService.recommendInsight(recommendInsightCommand); - log.info("Insight[id: {}] is recommended.", recommendInsightResponse.getInsightId()); - return ResponseEntity.ok(recommendInsightResponse); - } - - @Operation(description = "인사이트 신고 API") - @ApiResponse(responseCode = "200", description = "인사이트가 신고되었습니다.", - content = @Content(schema = @Schema(implementation = AccuseInsightResponse.class))) - @PostMapping("/accuse") - - public ResponseEntity accuseInsight(@AuthenticationPrincipal UUID memberId, @RequestBody AccuseInsightCommand accuseInsightCommand) { - accuseInsightCommand.setAccuseMemberId(memberId); - AccuseInsightResponse accuseInsightResponse = insightApplicationService.accuseInsight(accuseInsightCommand); - log.info("Insight[id: {}] is accused.", accuseInsightResponse.getInsightId()); - return ResponseEntity.ok(accuseInsightResponse); - } -} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/MyExchangeController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/MyExchangeController.java deleted file mode 100644 index 68e246a8..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/MyExchangeController.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.project.imdang.insight.service.domain.dto.exchange.list.ListExchangeRequestedByMeQuery; -import com.project.imdang.insight.service.domain.dto.exchange.list.ListExchangeRequestedByOthersQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.ports.input.service.ExchangeApplicationService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.UUID; - -@Slf4j -@RequestMapping("/my-exchanges") -@RequiredArgsConstructor -@RestController -@Tag(name = "MyExchangeController", description = "인사이트 교환소 API ") -public class MyExchangeController { - - private final ExchangeApplicationService exchangeApplicationService; - - // 내가 요청한 내역 (대기, 거절, 완료) - @Operation(description = "내가 요청한 인사이트 교환 목록 API") - @ApiResponse(responseCode = "200", description = "내가 요청한 인사이트 교환 목록 조회 성공") - @GetMapping("/requested-by-me") - public ResponseEntity> listRequestedByMe(@AuthenticationPrincipal UUID memberId, - @ModelAttribute @Valid ListExchangeRequestedByMeQuery listExchangeRequestedByMeQuery) { - listExchangeRequestedByMeQuery.setRequestMemberId(memberId); - Page paged = exchangeApplicationService.listExchangeRequestedByMe(listExchangeRequestedByMeQuery); - log.info("List my[id : {}] exchanges requested by me.", memberId); - return ResponseEntity.ok(paged); - } - - // 요청 받은 내역 (대기, 거절, 완료) - @Operation(description = "다른 사람이 요청한 인사이트 교환 목록 API") - @ApiResponse(responseCode = "200", description = "다른 사람이 요청한 인사이트 교환 목록 조회 성공") - @GetMapping("/requested-by-others") - public ResponseEntity> listRequestedByOthers(@AuthenticationPrincipal UUID memberId, - @ModelAttribute @Valid ListExchangeRequestedByOthersQuery listExchangeRequestedByOthersQuery) { - listExchangeRequestedByOthersQuery.setRequestedMemberId(memberId); - Page paged = exchangeApplicationService.listExchangeRequestedByOthers(listExchangeRequestedByOthersQuery); - log.info("List my[id : {}] exchanges requested by others.", memberId); - return ResponseEntity.ok(paged); - } -} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/MyInsightController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/MyInsightController.java deleted file mode 100644 index 24793acc..00000000 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/rest/MyInsightController.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.project.imdang.insight.service.domain.dto.insight.list.ApartmentComplexResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.DistrictResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightSimpleResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListMyInsightQuery; -import com.project.imdang.insight.service.domain.ports.input.service.InsightApplicationService; -import com.project.imdang.insight.service.domain.valueobject.District; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.UUID; - -@Slf4j -@RequestMapping("/my-insights") -@RequiredArgsConstructor -@RestController -public class MyInsightController { -// 보관함 - private final InsightApplicationService insightApplicationService; - - // 보관중인 인사이트 자치구 목록 API - @GetMapping("/districts") - public ResponseEntity> listDistrict(@AuthenticationPrincipal UUID memberId) { - List districtResponses = insightApplicationService.listMyInsightDistrict(memberId); - return ResponseEntity.ok(districtResponses); - } - - // '단지별 보기' 클릭 시, 자치구별 단지-인사이트 개수 목록 API - /* - { - "apartmentComplexName": "신뇬현 더 센트럴 푸르지오", - "insightCount": 12 - } - */ - @GetMapping("/by-district/apartment-complexes") - public ResponseEntity> listApartmentComplexByDistrict(@AuthenticationPrincipal UUID memberId, - @ModelAttribute District district) { - List apartmentComplexResponses = insightApplicationService.listMyInsightApartmentComplexByDistrict(memberId, district); - return ResponseEntity.ok(apartmentComplexResponses); - } - - // 전체 (내 인사이트 + 교환한 인사이트) - // + 내 인사이트만 보기 - // + 단지별 보기 - @GetMapping - public ResponseEntity> list(@AuthenticationPrincipal UUID memberId, - @ModelAttribute District district, - @RequestParam(name = "apartmentComplexName", required = false) String apartmentComplexName, - @RequestParam(name = "onlyMine", defaultValue = "FALSE") Boolean onlyMine, - // TODO - PagingQuery - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, - @RequestParam(name = "direction", defaultValue = "DESC") String direction, - @RequestParam(name = "properties", defaultValue = "created_at") String[] properties) { - - ListMyInsightQuery listMyInsightQuery = ListMyInsightQuery.builder() - .memberId(memberId) - .district(district) - .apartmentComplexName(apartmentComplexName) - .onlyMine(onlyMine) - .pageNumber(pageNumber) - .pageSize(pageSize) - .direction(direction) - .properties(properties) - .build(); - Page insights = insightApplicationService.listMyInsight(listMyInsightQuery); - return ResponseEntity.ok(insights); - } - - @GetMapping("/created-by-me") - public ResponseEntity> listCreatedByMe(@AuthenticationPrincipal UUID memberId, - // TODO - PagingQuery - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, - @RequestParam(name = "direction", defaultValue = "DESC") String direction, - @RequestParam(name = "properties", defaultValue = "created_at") String[] properties) { - - ListMyInsightCreatedByMeQuery listMyInsightCreatedByMeQuery = ListMyInsightCreatedByMeQuery.builder() - .memberId(memberId) - .pageNumber(pageNumber) - .pageSize(pageSize) - .direction(direction) - .properties(properties) - .build(); - Page insights = insightApplicationService.listMyInsightCreatedByMe(listMyInsightCreatedByMeQuery); - return ResponseEntity.ok(insights); - } -} diff --git a/insight-service/insight-application/src/main/resources/application.properties b/insight-service/insight-application/src/main/resources/application.properties deleted file mode 100644 index 88d2954c..00000000 --- a/insight-service/insight-application/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=insight-application diff --git a/insight-service/insight-container/build.gradle b/insight-service/insight-container/build.gradle deleted file mode 100644 index efc77647..00000000 --- a/insight-service/insight-container/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -bootJar { - enabled = false -} -jar { - enabled = true -} \ No newline at end of file diff --git a/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/BeanConfiguration.java b/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/BeanConfiguration.java deleted file mode 100644 index 3d55de71..00000000 --- a/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/BeanConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.project.imdang.insight.service; - -import com.project.imdang.insight.service.domain.ExchangeDomainService; -import com.project.imdang.insight.service.domain.ExchangeDomainServiceImpl; -import com.project.imdang.insight.service.domain.InsightDomainService; -import com.project.imdang.insight.service.domain.InsightDomainServiceImpl; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration("insightBeanConfiguration") -public class BeanConfiguration { - - @Bean - public InsightDomainService insightDomainService() { - return new InsightDomainServiceImpl(); - } - @Bean - public ExchangeDomainService exchangeDomainService() { - return new ExchangeDomainServiceImpl(); - } -} diff --git a/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/InsightServiceApplication.java b/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/InsightServiceApplication.java deleted file mode 100644 index 96093310..00000000 --- a/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/InsightServiceApplication.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.insight.service; - -import org.springframework.boot.SpringApplication; - -//@EnableScheduling -//@EnableJpaRepositories(basePackages = "com.project.imdang.insight.service.persistence") -//@EntityScan(basePackages = "com.project.imdang.insight.service.persistence") -//@SpringBootApplication(scanBasePackages = "com.project.imdang") -public class InsightServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(InsightServiceApplication.class, args); - } - -} diff --git a/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/RestClientConfiguration.java b/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/RestClientConfiguration.java deleted file mode 100644 index 0847fd9f..00000000 --- a/insight-service/insight-container/src/main/java/com/project/imdang/insight/service/RestClientConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.project.imdang.insight.service; - -import com.project.imdang.insight.service.application.client.ApartmentComplexApiRestClient; -import com.project.imdang.insight.service.application.client.ExternalApiException; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpStatusCode; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.web.client.RestClient; -import org.springframework.web.client.support.RestClientAdapter; -import org.springframework.web.service.invoker.HttpServiceProxyFactory; - -import java.nio.charset.StandardCharsets; -import java.time.Duration; - -@Configuration -public class RestClientConfiguration { - - private final String API_KEY = "api-key"; - - // TODO - 주소 API - - // TODO - CHECK : VS 국토교통부 - // 한국부동산원 - @Bean - public ApartmentComplexApiRestClient apartmentComplexApiRestClient() { - - String baseUrl = "https://api.odcloud.kr/api"; - - HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); - requestFactory.setConnectionRequestTimeout(Duration.ofSeconds(5L)); - requestFactory.setConnectTimeout(Duration.ofSeconds(10L)); - -// DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl); -// uriBuilderFactory.setDefaultUriVariables(Map.of("serviceKey", API_KEY)); - RestClient restClient = RestClient.builder() - .requestFactory(requestFactory) - .defaultHeader("Authorization", API_KEY) -// .uriBuilderFactory(uriBuilderFactory) - .baseUrl(baseUrl) - .defaultStatusHandler(HttpStatusCode::is4xxClientError, getDefaultErrorHandler()) - .defaultStatusHandler(HttpStatusCode::is5xxServerError, getDefaultErrorHandler()) - .build(); - return HttpServiceProxyFactory.builderFor(RestClientAdapter.create(restClient)).build() - .createClient(ApartmentComplexApiRestClient.class); - } - - private RestClient.ResponseSpec.ErrorHandler getDefaultErrorHandler() { - return (request, response) -> { - String responseMessage = new String(response.getBody().readAllBytes(), StandardCharsets.UTF_8); - System.out.println(">>>>>>>>>>>>>>>>>>>>> " + responseMessage); - throw new ExternalApiException(responseMessage, response.getStatusCode().value()); - }; - } -} diff --git a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/ExchangeControllerTest.java b/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/ExchangeControllerTest.java deleted file mode 100644 index fde9c048..00000000 --- a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/ExchangeControllerTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.domain.jwt.JwtTokenProvider; -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightCommand; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.UUID; - -import static com.project.imdang.insight.service.application.rest.TestData.requestMemberId; -import static com.project.imdang.insight.service.application.rest.TestData.requestedMemberId; -import static org.hamcrest.core.IsNull.notNullValue; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@AutoConfigureMockMvc -@SpringBootTest(classes = TestConfiguration.class) -public class ExchangeControllerTest { - - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - - @MockBean - private JwtTokenProvider jwtTokenProvider; - - private final String requestMemberToken = "request-member-token"; - private final String requestedMemberToken = "requested-member-token"; - - - @BeforeEach - void init() { - // given - Mockito.when(jwtTokenProvider.verifyToken(requestMemberToken)) - .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(requestMemberToken)) - .thenReturn(String.valueOf(requestMemberId)); - - Mockito.when(jwtTokenProvider.verifyToken(requestedMemberToken)) - .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(requestedMemberToken)) - .thenReturn(String.valueOf(requestedMemberId)); - } - -// @Test - public void request() throws Exception { - UUID insightId = UUID.fromString("111512ab-a7b6-43f9-bd61-16ee2cded7d9"); - UUID requestMemberInsightId = UUID.fromString("fc16cf45-2e8d-4cf2-b260-f7cac33820da"); - RequestExchangeInsightCommand requestExchangeInsightCommand - = new TestData(insightId).requestExchangeInsightCommand(requestMemberInsightId, null) ; - - mockMvc.perform(post("/exchanges/request") - .header("Authorization", "Bearer " + requestMemberToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestExchangeInsightCommand))) // 요청 본문 직렬화 - .andExpect(status().isOk()) // HTTP 상태 확인 - .andExpect(jsonPath("$.exchangeRequestId", notNullValue())); - } - - @Test - public void request_with_coupon() throws Exception { - UUID insightId = UUID.fromString("f509ce55-a67a-4c97-8846-0dee0c754c38"); - RequestExchangeInsightCommand requestExchangeInsightCommand - = new TestData(insightId).requestExchangeInsightCommand(null, 1L) ; - - mockMvc.perform(post("/exchanges/request") - .header("Authorization", "Bearer " + requestMemberToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(requestExchangeInsightCommand))) // 요청 본문 직렬화 - .andExpect(status().isOk()) // HTTP 상태 확인 - .andExpect(jsonPath("$.exchangeRequestId", notNullValue())); - } - - @Test - public void accept() throws Exception { - AcceptExchangeRequestCommand acceptExchangeRequestCommand = AcceptExchangeRequestCommand.builder() - .exchangeRequestId(UUID.fromString("61ec70ab-2baf-47b1-80a6-c5d551bfccc9")) - .requestedMemberId(requestedMemberId) - .build(); - mockMvc.perform(post("/exchanges/accept") - .header("Authorization", "Bearer " + requestedMemberToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(acceptExchangeRequestCommand))) // 요청 본문 직렬화 - .andExpect(status().isOk()) // HTTP 상태 확인 - .andExpect(jsonPath("$.exchangeRequestId", notNullValue())); - } - -// @Test - public void reject() throws Exception { - RejectExchangeRequestCommand rejectExchangeRequestCommand = RejectExchangeRequestCommand.builder() - .exchangeRequestId(UUID.fromString("a4c9a9e8-2577-4a4d-9bf1-3f76687336dd")) - .requestedMemberId(requestedMemberId) - .build(); - mockMvc.perform(post("/exchanges/reject") - .header("Authorization", "Bearer " + requestedMemberToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(rejectExchangeRequestCommand))) // 요청 본문 직렬화 - .andExpect(status().isOk()) // HTTP 상태 확인 - .andExpect(jsonPath("$.exchangeRequestId", notNullValue())); - } -} diff --git a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/MyExchangeControllerTest.java b/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/MyExchangeControllerTest.java deleted file mode 100644 index 457eed4f..00000000 --- a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/MyExchangeControllerTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.domain.jwt.JwtTokenProvider; -import org.junit.jupiter.api.BeforeEach; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; - -import static com.project.imdang.insight.service.application.rest.TestData.requestMemberId; -import static com.project.imdang.insight.service.application.rest.TestData.requestedMemberId; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@AutoConfigureMockMvc -@SpringBootTest(classes = TestConfiguration.class) -public class MyExchangeControllerTest { - - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - - @MockBean - private JwtTokenProvider jwtTokenProvider; - - private final String requestMemberToken = "request-member-token"; - private final String requestedMemberToken = "requested-member-token"; - - @BeforeEach - void init() { - // given - Mockito.when(jwtTokenProvider.verifyToken(requestMemberToken)) - .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(requestMemberToken)) - .thenReturn(String.valueOf(requestMemberId)); - - Mockito.when(jwtTokenProvider.verifyToken(requestedMemberToken)) - .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(requestedMemberToken)) - .thenReturn(String.valueOf(requestedMemberId)); - } - - // 내가 요청한 내역 -// @Test - void listRequestedByMe() throws Exception { - mockMvc.perform(get("/my-exchanges/requested-by-me") - .header("Authorization", "Bearer " + requestMemberToken) - .param("exchangeRequestStatus", "PENDING") -// .param("pageNumber", "0") -// .param("pageSize", "10") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) -// .andExpect(jsonPath("$.content.length()").value(1)) - .andDo(print()) - .andReturn(); - } - - // 다른 사람이 요청한 내역 -// @Test - void listRequestedByOthers() throws Exception { - mockMvc.perform(get("/my-exchanges/requested-by-others") - .header("Authorization", "Bearer " + requestedMemberToken) - .param("exchangeRequestStatus", "PENDING") -// .param("pageNumber", "0") -// .param("pageSize", "10") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) -// .andExpect(jsonPath("$.content.length()").value(1)) - .andDo(print()) - .andReturn(); - } -} diff --git a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/TestConfiguration.java b/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/TestConfiguration.java deleted file mode 100644 index ddd75627..00000000 --- a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/TestConfiguration.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -@EnableJpaRepositories(basePackages = "com.project.imdang.insight.service.persistence") -@EntityScan(basePackages = "com.project.imdang.insight.service.persistence") -@SpringBootApplication(scanBasePackages = "com.project.imdang") -public class TestConfiguration { -} diff --git a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/TestData.java b/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/TestData.java deleted file mode 100644 index 8a27ecb0..00000000 --- a/insight-service/insight-container/src/test/java/com/project/imdang/insight/service/application/rest/TestData.java +++ /dev/null @@ -1,278 +0,0 @@ -package com.project.imdang.insight.service.application.rest; - -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightCommand; -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.ObjectiveItem; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; -import org.springframework.util.Assert; - -import java.time.LocalDate; -import java.util.Set; -import java.util.UUID; - -public class TestData { - - public TestData() { } - public TestData(UUID requestedInsightId) { - this.requestedInsightId = requestedInsightId; - } - - private UUID requestedInsightId; -// static UUID requestedInsightId = UUID.fromString("12e15731-8009-4870-a17f-cd7c29faea1b"); -// static Long requestedSnapshotId = 1L; - public final static UUID requestedMemberId = UUID.fromString("3eff967b-84b8-4ec4-941b-ef3f0a26c0b9"); - -// static UUID requestMemberInsightId = UUID.fromString("dac34673-4ef8-4192-ba48-b721ae8bef5b"); -// static Long requestMemberSnapshotId = 2L; -// public final static Long memberCouponId = 1L; - public final static UUID requestMemberId = UUID.fromString("d53b9232-b69a-4d46-8ff0-0dabdeb87cab"); - - CreateInsightCommand createInsightCommand() { -// byte[] bytes = "content".getBytes(); -// MockMultipartFile mainImage = new MockMultipartFile("mainImage-1", bytes); - return CreateInsightCommand.builder() - .memberId(requestedMemberId) - .score(80) -// .mainImage(mainImage) - .title("title-1") - .address(TestData.address) - .apartmentComplex(TestData.apartmentComplex) - .visitAt(LocalDate.now().minusDays(14)) - .visitTimes(Set.of(VisitTime.아침)) - .visitMethods(Set.of(VisitMethod.대중교통)) - .access(Access.허락시_가능) - .summary("지하철역과 도보 10분 거리로 접근성이 좋지만, 근처 공사로 소음 문제가 있을 수 있을 것 같아요. 지하철역과 도보 10분 거리로 접근성이 좋지만, 근처 공사로 소음 문제가 있을 수 있을 것 같아요. 하지만 단지 내 공원이 잘 조성되어 있어 가족 단위 거주자에게 적합할 것 같아요.") - .infra(TestData.infra) - .complexEnvironment(TestData.complexEnvironment) - .complexFacility(TestData.complexFacility) - .favorableNews(TestData.favorableNews) - .build(); - } - - UpdateInsightCommand updateInsightCommand() { - Assert.notNull(requestedInsightId, "InsightId must not be null!"); - return UpdateInsightCommand.builder() - .insightId(requestedInsightId) - .score(95) -// .mainImage(updatedMainImage) - .title("updated-title-1") - .address(TestData.address) - .apartmentComplex(TestData.apartmentComplex) - .visitAt(LocalDate.now().minusDays(13)) - .visitTimes(Set.of(VisitTime.저녁)) - .visitMethods(Set.of(VisitMethod.자차, VisitMethod.도보)) - .access(Access.허락시_가능) - .summary("updated-summary-1") - .infra(TestData.updatedInfra) - .complexEnvironment(TestData.updatedComplexEnvironment) - .complexFacility(TestData.updatedComplexFacility) - .favorableNews(TestData.updatedFavorableNews) - .build(); - } - - DeleteInsightCommand deleteInsightCommand() { - Assert.notNull(requestedInsightId, "InsightId must not be null!"); - return DeleteInsightCommand.builder() - .insightId(requestedInsightId) - .build(); - } - - RecommendInsightCommand recommendInsightCommand() { - Assert.notNull(requestedInsightId, "InsightId must not be null!"); - return RecommendInsightCommand.builder() - .insightId(requestedInsightId) - .build(); - } - - AccuseInsightCommand accuseInsightCommand() { - Assert.notNull(requestedInsightId, "InsightId must not be null!"); - return AccuseInsightCommand.builder() - .insightId(requestedInsightId) - .accuseMemberId(UUID.randomUUID()) - .build(); - } - - RequestExchangeInsightCommand requestExchangeInsightCommand(UUID requestMemberInsightId, Long memberCouponId) { - Assert.notNull(requestedInsightId, "InsightId must not be null!"); - return RequestExchangeInsightCommand.builder() - .requestedInsightId(requestedInsightId) - .requestMemberId(requestMemberId) - .requestMemberInsightId(requestMemberInsightId) - .memberCouponId(memberCouponId) - .build(); - } -/* - Insight requestedInsight = Insight.builder() - .id(new InsightId(requestedInsightId)) - .memberId(new MemberId(requestedMemberId)) - .score(80) - .address(TestData.address) - .apartmentComplex(TestData.apartmentComplex) - .title("title-1") - .contents("contents-1") - .mainImage("mainImage-1") - .summary("summary-1") - .visitAt(ZonedDateTime.now().minusDays(14)) - .visitMethod(VisitMethod.대중교통) - .access(Access.허락_필요) - .infra(TestData.infra) - .complexEnvironment(TestData.complexEnvironment) - .complexFacility(TestData.complexFacility) - .favorableNews(TestData.favorableNews) - .build(); - - Snapshot requestedSnapshot = Snapshot.builder() - .id(new SnapshotId(requestedSnapshotId)) - .insightId(requestedInsight.getId()) - .memberId(requestedInsight.getMemberId()) - .address(requestedInsight.getAddress()) - .apartmentComplex(requestedInsight.getApartmentComplex()) - .title(requestedInsight.getTitle()) - .contents(requestedInsight.getContents()) - .mainImage(requestedInsight.getMainImage()) - .summary(requestedInsight.getSummary()) - .visitAt(requestedInsight.getVisitAt()) - .visitMethod(requestedInsight.getVisitMethod()) - .access(requestedInsight.getAccess()) - .infra(requestedInsight.getInfra()) - .complexEnvironment(requestedInsight.getComplexEnvironment()) - .complexFacility(requestedInsight.getComplexFacility()) - .favorableNews(requestedInsight.getFavorableNews()) - .build(); - - Insight requestMemberInsight = Insight.builder() - .id(new InsightId(requestMemberInsightId)) - .memberId(new MemberId(requestMemberId)) - .score(70) - .address(TestData.address) - .apartmentComplex(TestData.apartmentComplex) - .title("title-2") - .contents("contents-2") - .mainImage("mainImage-2") - .summary("summary-2") - .visitAt(ZonedDateTime.now().minusDays(10)) - .visitMethod(VisitMethod.도보) - .access(Access.자유로움) - .infra(TestData.infra) - .complexEnvironment(TestData.complexEnvironment) - .complexFacility(TestData.complexFacility) - .favorableNews(TestData.favorableNews) - .build(); - - Snapshot requestMemberSnapshot = Snapshot.builder() - .id(new SnapshotId(requestMemberSnapshotId)) - .insightId(requestMemberInsight.getId()) - .memberId(requestMemberInsight.getMemberId()) - .address(requestMemberInsight.getAddress()) - .apartmentComplex(requestMemberInsight.getApartmentComplex()) - .title(requestMemberInsight.getTitle()) - .contents(requestMemberInsight.getContents()) - .mainImage(requestMemberInsight.getMainImage()) - .summary(requestMemberInsight.getSummary()) - .visitAt(requestMemberInsight.getVisitAt()) - .visitMethod(requestMemberInsight.getVisitMethod()) - .access(requestMemberInsight.getAccess()) - .infra(requestMemberInsight.getInfra()) - .complexEnvironment(requestMemberInsight.getComplexEnvironment()) - .complexFacility(requestMemberInsight.getComplexFacility()) - .favorableNews(requestMemberInsight.getFavorableNews()) - .build();*/ - - static Address address = Address.builder() - .siDo("서울시") - .siGunGu("강남구") - .eupMyeonDong("신논현동") - .buildingNumber("1") - .build(); - static ApartmentComplex apartmentComplex = ApartmentComplex.builder() - .name("신논현 더 센트럴 푸르지오") - .build(); - - static Infra infra = Infra.builder() - .transportations(Set.of(Infra.Transportation.버스_정류장_주변, Infra.Transportation.주차_편리)) - .schoolDistricts(Set.of(Infra.SchoolDistrict.고등학교)) - .amenities(Set.of(Infra.Amenity.병원)) - .facilities(Set.of(Infra.Facility.도서관, Infra.Facility.수영장)) - .surroundings(Set.of(Infra.Surroundings.강, Infra.Surroundings.교회)) - .landmarks(Set.of(Infra.Landmark.고궁, Infra.Landmark.사찰)) - .unpleasantFacilities(Set.of(Infra.UnpleasantFacility.고속도로, Infra.UnpleasantFacility.철도)) - .text("infra_text") - .build(); - - static ComplexEnvironment complexEnvironment = ComplexEnvironment.builder() - .buildingCondition(ObjectiveItem.좋아요) - .security(ObjectiveItem.평범해요) - .childrenFacility(ObjectiveItem.최고예요) - .seniorFacility(ObjectiveItem.잘_모르겠어요) - .text("complex_environment_text") - .build(); - - static ComplexFacility complexFacility = ComplexFacility.builder() - .familyFacilities(Set.of(ComplexFacility.FamilyFacility.경로당)) - .multipurposeFacilities(Set.of(ComplexFacility.MultipurposeFacility.다목적실)) - .leisureFacilities(Set.of(ComplexFacility.LeisureFacility.독서실, ComplexFacility.LeisureFacility.조식)) - .surroundings(Set.of(ComplexFacility.Surroundings.분수, ComplexFacility.Surroundings.벤치)) - .text("complex_facility_text") - .build(); - - static FavorableNews favorableNews = FavorableNews.builder() - .transportations(Set.of(FavorableNews.Transportation.고속철도역_신설, FavorableNews.Transportation.지하철_개통)) - .developments(Set.of(FavorableNews.Development.재개발, FavorableNews.Development.재건축)) - .educations(Set.of(FavorableNews.Education.초등학교_신설_예정, FavorableNews.Education.고등학교_신설_예정)) - .environments(Set.of(FavorableNews.Environment.하천_복원, FavorableNews.Environment.대형_공원)) - .cultures(Set.of(FavorableNews.Culture.대형_병원, FavorableNews.Culture.문화센터)) - .industries(Set.of(FavorableNews.Industry.산업_단지, FavorableNews.Industry.기업_이전)) - .policies(Set.of(FavorableNews.Policy.잘_모르겠어요)) - .text("favorable_news_text") - .build(); - - static Infra updatedInfra = Infra.builder() - .transportations(Set.of(Infra.Transportation.해당_없음)) - .schoolDistricts(Set.of(Infra.SchoolDistrict.어린이집, Infra.SchoolDistrict.초품아)) - .amenities(Set.of(Infra.Amenity.해당_없음)) - .facilities(Set.of(Infra.Facility.해당_없음)) - .surroundings(Set.of(Infra.Surroundings.해당_없음)) - .landmarks(Set.of(Infra.Landmark.해당_없음)) - .unpleasantFacilities(Set.of(Infra.UnpleasantFacility.고속도로, Infra.UnpleasantFacility.철도)) - .text("updated_infra_text") - .build(); - - static ComplexEnvironment updatedComplexEnvironment = ComplexEnvironment.builder() - .buildingCondition(ObjectiveItem.별로에요) - .security(ObjectiveItem.별로에요) - .childrenFacility(ObjectiveItem.별로에요) - .seniorFacility(ObjectiveItem.별로에요) - .text("updated_complex_environment_text") - .build(); - - static ComplexFacility updatedComplexFacility = ComplexFacility.builder() - .familyFacilities(Set.of(ComplexFacility.FamilyFacility.해당_없음)) - .multipurposeFacilities(Set.of(ComplexFacility.MultipurposeFacility.해당_없음)) - .leisureFacilities(Set.of(ComplexFacility.LeisureFacility.해당_없음)) - .surroundings(Set.of(ComplexFacility.Surroundings.해당_없음)) - .text("updated_complex_facility_text") - .build(); - - static FavorableNews updatedFavorableNews = FavorableNews.builder() - .transportations(Set.of(FavorableNews.Transportation.잘_모르겠어요)) - .developments(Set.of(FavorableNews.Development.잘_모르겠어요)) - .educations(Set.of(FavorableNews.Education.잘_모르겠어요)) - .environments(Set.of(FavorableNews.Environment.잘_모르겠어요)) - .cultures(Set.of(FavorableNews.Culture.잘_모르겠어요)) - .industries(Set.of(FavorableNews.Industry.잘_모르겠어요)) - .policies(Set.of(FavorableNews.Policy.잘_모르겠어요)) - .text("updated_favorable_news_text") - .build(); -} diff --git a/insight-service/insight-domain/insight-application-service/build.gradle b/insight-service/insight-domain/insight-application-service/build.gradle index c049d055..28ce4cf3 100644 --- a/insight-service/insight-domain/insight-application-service/build.gradle +++ b/insight-service/insight-domain/insight-application-service/build.gradle @@ -1,6 +1,16 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':insight-service:insight-domain:insight-domain-core') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation project(':insight-service:insight-messaging:message') + + implementation project(':member-service:member-service-client:member-service-client-api') + + implementation project(':infrastructure:saga') + + implementation 'org.springframework.boot:spring-boot-starter' + // TODO - CHECK + implementation 'org.springframework:spring-tx' + implementation 'org.springframework.data:spring-data-commons' } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/InsightApplicationServiceImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/InsightApplicationServiceImpl.java new file mode 100644 index 00000000..bc1e9c02 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/InsightApplicationServiceImpl.java @@ -0,0 +1,151 @@ +package com.project.imdang.insight.domain; + +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; +import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; +import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; +import com.project.imdang.insight.domain.dto.insight.detail.DetailInsightQuery; +import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; +import com.project.imdang.insight.domain.dto.insight.list.MyApartmentComplexResult; +import com.project.imdang.insight.domain.dto.insight.list.MyDistrictResult; +import com.project.imdang.insight.domain.dto.insight.list.InsightResult; +import com.project.imdang.insight.domain.dto.insight.list.InsightSimpleResult; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByApartmentComplexQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDateQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDistrictQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightQuery; +import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; +import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; +import com.project.imdang.insight.domain.handler.insight.AccuseInsightCommandHandler; +import com.project.imdang.insight.domain.handler.insight.CreateInsightCommandHandler; +import com.project.imdang.insight.domain.handler.insight.DeleteInsightCommandHandler; +import com.project.imdang.insight.domain.handler.insight.DetailInsightQueryHandler; +import com.project.imdang.insight.domain.handler.insight.ListDistrictQueryHandler; +import com.project.imdang.insight.domain.handler.insight.ListInsightQueryHandler; +import com.project.imdang.insight.domain.handler.insight.ListMyInsightApartmentComplexByDistrictQueryHandler; +import com.project.imdang.insight.domain.handler.insight.ListMyInsightCreatedByMeQueryHandler; +import com.project.imdang.insight.domain.handler.insight.ListMyInsightDistrictQueryHandler; +import com.project.imdang.insight.domain.handler.insight.ListMyInsightQueryHandler; +import com.project.imdang.insight.domain.handler.insight.ListMyVisitedApartmentComplexQueryHandler; +import com.project.imdang.insight.domain.handler.insight.RecommendInsightCommandHandler; +import com.project.imdang.insight.domain.handler.insight.UpdateInsightCommandHandler; +import com.project.imdang.insight.domain.ports.input.service.InsightApplicationService; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +@Validated +@RequiredArgsConstructor +@Service +public class InsightApplicationServiceImpl implements InsightApplicationService { + + private final ListInsightQueryHandler listInsightQueryHandler; + private final ListMyVisitedApartmentComplexQueryHandler listMyVisitedApartmentComplexQueryHandler; + private final ListDistrictQueryHandler listDistrictQueryHandler; + + private final ListMyInsightDistrictQueryHandler listMyInsightDistrictQueryHandler; + private final ListMyInsightApartmentComplexByDistrictQueryHandler listMyInsightApartmentComplexByDistrictQueryHandler; + private final ListMyInsightQueryHandler listMyInsightQueryHandler; + private final ListMyInsightCreatedByMeQueryHandler listMyInsightCreatedByMeQueryHandler; + + private final DetailInsightQueryHandler detailInsightQueryHandler; + private final CreateInsightCommandHandler createInsightCommandHandler; + private final UpdateInsightCommandHandler updateInsightCommandHandler; + private final DeleteInsightCommandHandler deleteInsightCommandHandler; + + private final RecommendInsightCommandHandler recommendInsightCommandHandler; + private final AccuseInsightCommandHandler accuseInsightCommandHandler; + + @Override + public Page listInsight(ListInsightQuery listInsightQuery) { + return listInsightQueryHandler.list(listInsightQuery); + } + + @Override + public Page listInsightByDate(ListInsightByDateQuery listInsightByDateQuery) { + return listInsightQueryHandler.listByDate(listInsightByDateQuery); + } + + @Override + public Page listInsightByDistrict(ListInsightByDistrictQuery listInsightByDistrictQuery) { + return listInsightQueryHandler.listByDistrict(listInsightByDistrictQuery); + } + + @Override + public Page listInsightByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery) { + return listInsightQueryHandler.listByApartmentComplex(listInsightByApartmentComplexQuery); + } + + @Override + public List listMyVisitedApartmentComplex(MemberId memberId) { + return listMyVisitedApartmentComplexQueryHandler.listMyVisitedApartmentComplex(memberId); + } + + @Override + public Page listDistrict(String siDo, String siGunGu, Integer pageNumber, Integer pageSize) { + return listDistrictQueryHandler.listDistrict(siDo, siGunGu, pageNumber, pageSize); + } + + @Override + public List listMyInsightDistrict(MemberId memberId) { + return listMyInsightDistrictQueryHandler.listMyInsightDistrict(memberId); + } + + @Override + public List listMyInsightApartmentComplexByDistrict(MemberId memberId, String siDo, String siGunGu, String eupMyeonDong) { + final District district = District.builder() + .siDo(siDo) + .siGunGu(siGunGu) + .eupMyeonDong(eupMyeonDong) + .build(); + return listMyInsightApartmentComplexByDistrictQueryHandler.listMyInsightApartmentComplexByDistrict(memberId, district); + } + + @Override + public Page listMyInsight(ListMyInsightQuery listMyInsightQuery) { + return listMyInsightQueryHandler.listMyInsight(listMyInsightQuery); + } + + @Override + public Page listMyInsightCreatedByMe(ListMyInsightCreatedByMeQuery listMyInsightCreatedByMeQuery) { + return listMyInsightCreatedByMeQueryHandler.listMyInsightCreatedByMe(listMyInsightCreatedByMeQuery); + } + + @Override + public InsightDetailResult detailInsight(DetailInsightQuery detailInsightQuery) { + return detailInsightQueryHandler.detailInsight(detailInsightQuery); + } + + @Override + public InsightId createInsight(CreateInsightCommand createInsightCommand) { + return createInsightCommandHandler.createInsight(createInsightCommand); + } + + @Override + public InsightId updateInsight(UpdateInsightCommand updateInsightCommand) { + return updateInsightCommandHandler.updateInsight(updateInsightCommand); + } + + @Override + public InsightId deleteInsight(DeleteInsightCommand deleteInsightCommand) { + return deleteInsightCommandHandler.deleteInsight(deleteInsightCommand); + } + + @Override + public InsightId recommendInsight(RecommendInsightCommand recommendInsightCommand) { + return recommendInsightCommandHandler.recommendInsight(recommendInsightCommand); + } + + @Override + public InsightId accuseInsight(AccuseInsightCommand accuseInsightCommand) { + return accuseInsightCommandHandler.accuseInsight(accuseInsightCommand); + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/accuse/AccuseInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/accuse/AccuseInsightCommand.java new file mode 100644 index 00000000..50d5e92c --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/accuse/AccuseInsightCommand.java @@ -0,0 +1,19 @@ +package com.project.imdang.insight.domain.dto.insight.accuse; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AccuseInsightCommand { + // insightId - accuseMemberId UNIQUE + private InsightId insightId; + private MemberId accuseMemberId; // accusedBy : 신고한 memberId +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/create/CreateInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/create/CreateInsightCommand.java new file mode 100644 index 00000000..0e67c3cc --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/create/CreateInsightCommand.java @@ -0,0 +1,45 @@ +package com.project.imdang.insight.domain.dto.insight.create; + +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.File; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.Set; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class CreateInsightCommand { + private MemberId memberId; // createdBy + private int score; + private File mainImage; + + private String title; + private Address address; + private ApartmentComplex apartmentComplex; + + private LocalDate visitAt; + private Set visitTimes; + private Set visitMethods; + + private String summary; + private Access access; + + // 인프라 + private Infra infra; + // 단지 환경 + private ComplexEnvironment complexEnvironment; +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/delete/DeleteInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/delete/DeleteInsightCommand.java new file mode 100644 index 00000000..38857fde --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/delete/DeleteInsightCommand.java @@ -0,0 +1,18 @@ +package com.project.imdang.insight.domain.dto.insight.delete; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DeleteInsightCommand { + private InsightId insightId; + private MemberId memberId; +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/DetailInsightQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/DetailInsightQuery.java new file mode 100644 index 00000000..15e6bdbf --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/DetailInsightQuery.java @@ -0,0 +1,16 @@ +package com.project.imdang.insight.domain.dto.insight.detail; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.Getter; + +@Getter +public class DetailInsightQuery { + private InsightId insightId; + private MemberId memberId; // requestedBy + + public DetailInsightQuery(InsightId insightId, MemberId memberId) { + this.insightId = insightId; + this.memberId = memberId; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/detail/DetailInsightResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java similarity index 55% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/detail/DetailInsightResponse.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java index 96a9c9ff..5b1e718d 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/detail/DetailInsightResponse.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java @@ -1,15 +1,14 @@ -package com.project.imdang.insight.service.domain.dto.insight.detail; +package com.project.imdang.insight.domain.dto.insight.detail; -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -19,19 +18,17 @@ import java.time.LocalDate; import java.time.ZonedDateTime; import java.util.Set; -import java.util.UUID; @Builder @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DetailInsightResponse { +public class InsightDetailResult { - private UUID memberId; + private MemberId memberId; private String memberNickname; - private UUID insightId; - private Long snapshotId; + private InsightId insightId; private String mainImage; private String title; @@ -47,8 +44,6 @@ public class DetailInsightResponse { private Infra infra; private ComplexEnvironment complexEnvironment; - private ComplexFacility complexFacility; - private FavorableNews favorableNews; private Boolean recommended; // 로그인한 사용자가 추천했는가? private Boolean accused; // 로그인한 사용자가 신고했는가? @@ -58,15 +53,11 @@ public class DetailInsightResponse { private Integer score; private ZonedDateTime createdAt; - private ExchangeRequestStatus exchangeRequestStatus; - private Boolean exchangeRequestCreatedByMe; - private UUID exchangeRequestId; private Boolean createdByMe; - public DetailInsightResponse toPreviewInsightResponse() { - return DetailInsightResponse.builder() + public InsightDetailResult toPreviewInsightResponse() { + return InsightDetailResult.builder() .insightId(insightId) - .snapshotId(snapshotId) .mainImage(mainImage) .title(title) .address(address) @@ -85,9 +76,6 @@ public DetailInsightResponse toPreviewInsightResponse() { .memberNickname(memberNickname) .createdAt(createdAt) .score(score) - .exchangeRequestStatus(exchangeRequestStatus) - .exchangeRequestCreatedByMe(exchangeRequestCreatedByMe) - .exchangeRequestId(exchangeRequestId) .createdByMe(createdByMe) .build(); } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ApartmentComplexResult.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ApartmentComplexResult.java new file mode 100644 index 00000000..a3fc9b61 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ApartmentComplexResult.java @@ -0,0 +1,15 @@ +package com.project.imdang.insight.domain.dto.insight.list; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ApartmentComplexResult { + private String name; + + public ApartmentComplexResult(String name) { + this.name = name; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/DistrictResult.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/DistrictResult.java new file mode 100644 index 00000000..dd71ac35 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/DistrictResult.java @@ -0,0 +1,18 @@ +package com.project.imdang.insight.domain.dto.insight.list; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DistrictResult { + private String siDo; + private String siGunGu; + private String eupMyeonDong; + private String code; +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java new file mode 100644 index 00000000..14e8a042 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java @@ -0,0 +1,25 @@ +package com.project.imdang.insight.domain.dto.insight.list; + +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.InsightId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.ZonedDateTime; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class InsightResult { + private InsightId insightId; + private Integer recommendedCount; + private Address address; + private String title; + private String mainImage; + private String memberNickname; + private ZonedDateTime createdAt; +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/InsightSimpleResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightSimpleResult.java similarity index 56% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/InsightSimpleResponse.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightSimpleResult.java index b8c10d4c..e2c6e72e 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/InsightSimpleResponse.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightSimpleResult.java @@ -1,20 +1,19 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; +package com.project.imdang.insight.domain.dto.insight.list; -import com.project.imdang.insight.service.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.InsightId; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.UUID; - @Builder @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class InsightSimpleResponse { - private UUID insightId; +public class InsightSimpleResult { + private InsightId insightId; private Integer recommendedCount; private Address address; private String title; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByApartmentComplexQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByApartmentComplexQuery.java new file mode 100644 index 00000000..b889493b --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByApartmentComplexQuery.java @@ -0,0 +1,20 @@ +package com.project.imdang.insight.domain.dto.insight.list; + +import com.project.imdang.common.domain.dto.PagingQuery; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class ListInsightByApartmentComplexQuery extends PagingQuery { + private String apartmentComplexName; + + @Builder + private ListInsightByApartmentComplexQuery(Integer pageNumber, + Integer pageSize, + String direction, + String[] properties, + String apartmentComplexName) { + super(pageNumber, pageSize, direction, properties); + this.apartmentComplexName = apartmentComplexName; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByDateQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByDateQuery.java new file mode 100644 index 00000000..3552c45a --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByDateQuery.java @@ -0,0 +1,22 @@ +package com.project.imdang.insight.domain.dto.insight.list; + +import com.project.imdang.common.domain.dto.PagingQuery; +import lombok.Builder; +import lombok.Getter; + +import java.time.LocalDate; + +@Getter +public class ListInsightByDateQuery extends PagingQuery { + private LocalDate date; + + @Builder + private ListInsightByDateQuery(Integer pageNumber, + Integer pageSize, + String direction, + String[] properties, + LocalDate date) { + super(pageNumber, pageSize, direction, properties); + this.date = date; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByDistrictQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByDistrictQuery.java new file mode 100644 index 00000000..18e04c38 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightByDistrictQuery.java @@ -0,0 +1,25 @@ +package com.project.imdang.insight.domain.dto.insight.list; + +import com.project.imdang.common.domain.dto.PagingQuery; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class ListInsightByDistrictQuery extends PagingQuery { + + private String siDo; + private String siGunGu; + private String eupMyeonDong; + + @Builder + private ListInsightByDistrictQuery(Integer pageNumber, + Integer pageSize, + String direction, + String[] properties, + String siDo, String siGunGu, String eupMyeonDong) { + super(pageNumber, pageSize, direction, properties); + this.siDo = siDo; + this.siGunGu = siGunGu; + this.eupMyeonDong = eupMyeonDong; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightQuery.java new file mode 100644 index 00000000..12b12151 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListInsightQuery.java @@ -0,0 +1,17 @@ +package com.project.imdang.insight.domain.dto.insight.list; + +import com.project.imdang.common.domain.dto.PagingQuery; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class ListInsightQuery extends PagingQuery { + + @Builder + private ListInsightQuery(Integer pageNumber, + Integer pageSize, + String direction, + String[] properties) { + super(pageNumber, pageSize, direction, properties); + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListMyInsightCreatedByMeQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListMyInsightCreatedByMeQuery.java similarity index 72% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListMyInsightCreatedByMeQuery.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListMyInsightCreatedByMeQuery.java index b20dbdc6..d388330d 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListMyInsightCreatedByMeQuery.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListMyInsightCreatedByMeQuery.java @@ -1,21 +1,19 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; +package com.project.imdang.insight.domain.dto.insight.list; +import com.project.imdang.common.domain.valueobject.MemberId; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.UUID; - @Builder @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ListMyInsightCreatedByMeQuery { -// @Setter - private UUID memberId; + private MemberId memberId; private Integer pageNumber; private Integer pageSize; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListMyInsightQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListMyInsightQuery.java new file mode 100644 index 00000000..c290768c --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/ListMyInsightQuery.java @@ -0,0 +1,36 @@ +package com.project.imdang.insight.domain.dto.insight.list; + +import com.project.imdang.common.domain.dto.PagingQuery; +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class ListMyInsightQuery extends PagingQuery { + + private MemberId memberId; + + private District district; +// private String siDo; +// private String siGunGu; +// private String eupMyeonDong; + + private String apartmentComplexName; + private Boolean onlyMine; + + @Builder + private ListMyInsightQuery(Integer pageNumber, Integer pageSize, String direction, String[] properties, + MemberId memberId, + String siDo, String siGunGu, String eupMyeonDong, + String apartmentComplexName, Boolean onlyMine) { + super(pageNumber, pageSize, direction, properties); + this.memberId = memberId; +// this.siDo = siDo; +// this.siGunGu = siGunGu; +// this.eupMyeonDong = eupMyeonDong; + this.district = new District(siDo, siGunGu, eupMyeonDong, null); + this.apartmentComplexName = apartmentComplexName; + this.onlyMine = onlyMine; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/MemberResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MemberResult.java similarity index 74% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/MemberResponse.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MemberResult.java index c89fa67b..56eadb09 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/MemberResponse.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MemberResult.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; +package com.project.imdang.insight.domain.dto.insight.list; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -10,8 +10,7 @@ @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class MemberResponse { - +public class MemberResult { private String nickname; private String image; } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ApartmentComplexResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MyApartmentComplexResult.java similarity index 73% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ApartmentComplexResponse.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MyApartmentComplexResult.java index d9477d83..41414bec 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ApartmentComplexResponse.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MyApartmentComplexResult.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; +package com.project.imdang.insight.domain.dto.insight.list; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -10,7 +10,7 @@ @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ApartmentComplexResponse { +public class MyApartmentComplexResult { private String apartmentComplexName; private Long insightCount; } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/DistrictResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MyDistrictResult.java similarity index 82% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/DistrictResponse.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MyDistrictResult.java index 6f267c38..5903917a 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/DistrictResponse.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/MyDistrictResult.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; +package com.project.imdang.insight.domain.dto.insight.list; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -10,7 +10,7 @@ @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DistrictResponse { +public class MyDistrictResult { private String siDo; // 시/도 (예: 서울특별시) private String siGunGu; // 시/군/구 (예: 종로구) private String eupMyeonDong; // 읍/면/동 (예: 효제동) diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/recommend/RecommendInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/recommend/RecommendInsightCommand.java new file mode 100644 index 00000000..8871905e --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/recommend/RecommendInsightCommand.java @@ -0,0 +1,18 @@ +package com.project.imdang.insight.domain.dto.insight.recommend; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class RecommendInsightCommand { + private InsightId insightId; + private MemberId recommendMemberId; // recommendedBy +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java new file mode 100644 index 00000000..7f4c2744 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java @@ -0,0 +1,47 @@ +package com.project.imdang.insight.domain.dto.insight.update; + +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.File; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.util.Set; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class UpdateInsightCommand { + private InsightId insightId; + private MemberId memberId; + + private Address address; + private ApartmentComplex apartmentComplex; + + private int score; + private String title; + private File mainImage; + private String summary; + + private LocalDate visitAt; + private Set visitTimes; + private Set visitMethods; + private Access access; + + // 인프라 + private Infra infra; + // 단지 환경 + private ComplexEnvironment complexEnvironment; +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/AccuseInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/AccuseInsightCommandHandler.java new file mode 100644 index 00000000..23c896bb --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/AccuseInsightCommandHandler.java @@ -0,0 +1,63 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.InsightDomainService; +import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; +import com.project.imdang.insight.domain.entity.Accuse; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.event.InsightAccusedEvent; +import com.project.imdang.insight.domain.exception.AccuseAlreadyExistException; +import com.project.imdang.insight.domain.helper.AccuseHelper; +import com.project.imdang.insight.domain.helper.InsightHelper; +import com.project.imdang.insight.domain.ports.output.publisher.InsightAccusedEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightAccusedEventMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + + +@Slf4j +@RequiredArgsConstructor +@Component +public class AccuseInsightCommandHandler { + + private final InsightDomainService insightDomainService; + private final InsightHelper insightHelper; + private final AccuseHelper accuseHelper; + private final InsightAccusedEventMessagePublisher insightAccusedEventMessagePublisher; + + @Transactional + public InsightId accuseInsight(AccuseInsightCommand accuseInsightCommand) { + + MemberId accusedBy = accuseInsightCommand.getAccuseMemberId(); + InsightId accusedInsightId = accuseInsightCommand.getInsightId(); + + // accusedInsightId - memberId(accusedBy)로 중복 신고 여부 체크 + checkAlreadyAccused(accusedBy, accusedInsightId); + + Insight accusedInsight = insightHelper.get(accusedInsightId); + InsightAccusedEvent insightAccusedEvent = insightDomainService.accuseInsight(accusedInsight, accusedBy); + + Insight savedInsight = insightHelper.save(insightAccusedEvent.getInsight()); + Accuse savedAccuse = accuseHelper.save(insightAccusedEvent.getAccuse()); + + // publish + InsightAccusedEventMessage insightAccusedEventMessage + = new InsightAccusedEventMessage(accusedInsight.getId().getValue(), accusedInsight.getMemberId().getValue()); + insightAccusedEventMessagePublisher.publish(insightAccusedEventMessage); + + log.info("Insight[id: {}] is accused by Member[id: {}].", savedInsight.getId().getValue(), savedAccuse.getAccuseMemberId().getValue()); + return savedInsight.getId(); + } + + private void checkAlreadyAccused(MemberId accusedBy, InsightId accusedInsightId) { + Optional optional = accuseHelper.getByAccuseMemberIdAndAccusedInsightId(accusedBy, accusedInsightId); + if (optional.isPresent()) { + throw new AccuseAlreadyExistException(); + } + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/CreateInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/CreateInsightCommandHandler.java new file mode 100644 index 00000000..7db7b966 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/CreateInsightCommandHandler.java @@ -0,0 +1,58 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.valueobject.File; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.insight.domain.InsightDomainService; +import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.exception.InsightDomainException; +import com.project.imdang.insight.domain.helper.InsightHelper; +import com.project.imdang.insight.domain.mapper.InsightDataMapper; +import com.project.imdang.insight.domain.ports.output.file.FileService; +import com.project.imdang.insight.domain.ports.output.publisher.InsightCreatedEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightCreatedEventMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; + +@Slf4j +@RequiredArgsConstructor +@Component +public class CreateInsightCommandHandler { + + private final InsightDomainService insightDomainService; + private final InsightHelper insightHelper; + private final InsightDataMapper insightDataMapper; + + private final InsightCreatedEventMessagePublisher insightCreatedEventMessagePublisher; + private final FileService fileService; + + @Transactional + public InsightId createInsight(CreateInsightCommand createInsightCommand) { + Insight insight = insightDataMapper.createInsightCommandToInsight(createInsightCommand); + + String mainImage = uploadImage(createInsightCommand.getMainImage()); + Insight created = insightDomainService.createInsight(insight, mainImage); + Insight savedInsight = insightHelper.save(created); + log.info("Insight[id: {}] is created.", savedInsight.getId().getValue()); + + // publish + InsightCreatedEventMessage insightCreatedEventMessage + = new InsightCreatedEventMessage(savedInsight.getId().getValue(), savedInsight.getMemberId().getValue()); + insightCreatedEventMessagePublisher.publish(insightCreatedEventMessage); + return savedInsight.getId(); + } + + private String uploadImage(File mainImageFile) { + String mainImage; + try { + mainImage = fileService.upload(mainImageFile); + } catch (IOException e) { + throw new InsightDomainException(e.getMessage()); + } + return mainImage; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DeleteInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DeleteInsightCommandHandler.java new file mode 100644 index 00000000..d7b2b784 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DeleteInsightCommandHandler.java @@ -0,0 +1,46 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.InsightDomainService; +import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.event.InsightDeletedEvent; +import com.project.imdang.insight.domain.helper.InsightHelper; +import com.project.imdang.insight.domain.ports.output.publisher.InsightDeletedEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightDeletedEventMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RequiredArgsConstructor +@Component +public class DeleteInsightCommandHandler { + private final InsightDomainService insightDomainService; + private final InsightHelper insightHelper; + + private final InsightDeletedEventMessagePublisher insightDeletedEventMessagePublisher; + + @Transactional + public InsightId deleteInsight(DeleteInsightCommand deleteInsightCommand) { + InsightId insightId = deleteInsightCommand.getInsightId(); + Insight insight = insightHelper.get(insightId); + + // validation + MemberId deletedBy = deleteInsightCommand.getMemberId(); + InsightDeletedEvent insightDeletedEvent = insightDomainService.deleteInsight(insight, deletedBy); + Insight deletedInsight = insightHelper.save(insightDeletedEvent.getInsight()); + + final InsightId deletedInsightId = deletedInsight.getId(); + log.info("Insight[id: {}] is deleted.", deletedInsightId.getValue()); + + // publish + InsightDeletedEventMessage insightDeletedEventMessage + = new InsightDeletedEventMessage(deletedInsightId.getValue(), deletedInsight.getMemberId().getValue()); + insightDeletedEventMessagePublisher.publish(insightDeletedEventMessage); + + return deletedInsightId; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DetailInsightQueryHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DetailInsightQueryHandler.java new file mode 100644 index 00000000..4917f2e4 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DetailInsightQueryHandler.java @@ -0,0 +1,52 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.dto.insight.detail.DetailInsightQuery; +import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.exception.InsightNotFoundException; +import com.project.imdang.insight.domain.exception.MemberNotFoundException; +import com.project.imdang.insight.domain.mapper.InsightDataMapper; +import com.project.imdang.insight.domain.ports.output.repository.AccuseRepository; +import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; +import com.project.imdang.insight.domain.ports.output.repository.RecommendRepository; +import com.project.imdang.member.domain.client.MemberData; +import com.project.imdang.member.domain.client.MemberDataResolver; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RequiredArgsConstructor +@Component +public class DetailInsightQueryHandler { + + private final InsightRepository insightRepository; + private final InsightDataMapper insightDataMapper; + + private final RecommendRepository recommendRepository; + private final AccuseRepository accuseRepository; + + private final MemberDataResolver memberResolver; + + // TODO - CHECK : 조회 수 증가 + @Transactional(readOnly = true) + public InsightDetailResult detailInsight(DetailInsightQuery detailInsightQuery) { + + InsightId insightId = detailInsightQuery.getInsightId(); + Insight insight = insightRepository.findById(insightId) + .orElseThrow(() -> new InsightNotFoundException(insightId)); + + MemberId requestedBy = detailInsightQuery.getMemberId(); + boolean recommended = recommendRepository.findByRecommendMemberIdAndRecommendedInsightId(requestedBy, insightId).isPresent(); + boolean accused = accuseRepository.findByAccuseMemberIdAndAccusedInsightId(requestedBy, insightId).isPresent(); + MemberId insightCreatedBy = insight.getMemberId(); + MemberData member = memberResolver.resolve(insightCreatedBy) + .orElseThrow(() -> new MemberNotFoundException(insightCreatedBy)); + String memberNickname = member.getNickname(); + return insightDataMapper.insightToDetailInsightResponse( + insight, memberNickname, recommended, accused, insightCreatedBy.equals(requestedBy)); + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListDistrictCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListDistrictQueryHandler.java similarity index 72% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListDistrictCommandHandler.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListDistrictQueryHandler.java index 41909cf5..8bd9cda0 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListDistrictCommandHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListDistrictQueryHandler.java @@ -1,8 +1,8 @@ -package com.project.imdang.insight.service.domain.handler.insight; +package com.project.imdang.insight.domain.handler.insight; -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.insight.service.domain.ports.output.repository.DistrictRepository; -import com.project.imdang.insight.service.domain.valueobject.District; +import com.project.imdang.common.domain.utils.PagingUtils; +import com.project.imdang.insight.domain.ports.output.repository.DistrictRepository; +import com.project.imdang.common.domain.valueobject.District; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -13,7 +13,7 @@ @Slf4j @RequiredArgsConstructor @Component -public class ListDistrictCommandHandler { +public class ListDistrictQueryHandler { private final DistrictRepository districtRepository; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListInsightQueryHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListInsightQueryHandler.java new file mode 100644 index 00000000..7aaa7f95 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListInsightQueryHandler.java @@ -0,0 +1,113 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.utils.PagingUtils; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.dto.insight.list.InsightResult; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByApartmentComplexQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDateQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDistrictQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightQuery; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.mapper.InsightDataMapper; +import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; +import com.project.imdang.member.domain.client.MemberData; +import com.project.imdang.member.domain.client.MemberDataResolver; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +@Transactional(readOnly = true) +@Slf4j +@RequiredArgsConstructor +@Component +public class ListInsightQueryHandler { + + private final InsightRepository insightRepository; + private final InsightDataMapper insightDataMapper; + + private final MemberDataResolver memberResolver; + + public Page list(ListInsightQuery listInsightQuery) { + PageRequest pageRequest = PagingUtils.getPageRequest( + listInsightQuery.getPageNumber(), listInsightQuery.getPageSize(), listInsightQuery.getDirection(), listInsightQuery.getProperties()); + + Page paged = insightRepository.findAll(pageRequest); + Map memberNicknameMap = getMemberNicknameMap(paged.getContent()); + return paged.map(insight -> { + String memberNickname = memberNicknameMap.get(insight.getMemberId()); + return insightDataMapper.insightToInsightResponse(insight, memberNickname); + }); + } + + public Page listByDate(ListInsightByDateQuery listInsightByDateQuery) { + PageRequest pageRequest = PagingUtils.getPageRequest( + listInsightByDateQuery.getPageNumber(), listInsightByDateQuery.getPageSize(), listInsightByDateQuery.getDirection(), listInsightByDateQuery.getProperties()); + + Page paged = insightRepository.findAllByDate(listInsightByDateQuery.getDate(), pageRequest); + Map memberNicknameMap = getMemberNicknameMap(paged.getContent()); + return paged.map(insight -> { + String memberNickname = memberNicknameMap.get(insight.getMemberId()); + return insightDataMapper.insightToInsightResponse(insight, memberNickname); + }); + } + + public Page listByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery) { + PageRequest pageRequest = PagingUtils.getPageRequest( + listInsightByApartmentComplexQuery.getPageNumber(), listInsightByApartmentComplexQuery.getPageSize(), listInsightByApartmentComplexQuery.getDirection(), listInsightByApartmentComplexQuery.getProperties()); + ApartmentComplex apartmentComplex = ApartmentComplex.builder() + .name(listInsightByApartmentComplexQuery.getApartmentComplexName()) + .build(); + + Page paged = insightRepository.findAllByApartmentComplex(apartmentComplex, pageRequest); + Map memberNicknameMap = getMemberNicknameMap(paged.getContent()); + return paged.map(insight -> { + String memberNickname = memberNicknameMap.get(insight.getMemberId()); + return insightDataMapper.insightToInsightResponse(insight, memberNickname); + }); + } + + public Page listByDistrict(ListInsightByDistrictQuery listInsightByDistrictQuery) { + PageRequest pageRequest = PagingUtils.getPageRequest( + listInsightByDistrictQuery.getPageNumber(), listInsightByDistrictQuery.getPageSize(), listInsightByDistrictQuery.getDirection(), listInsightByDistrictQuery.getProperties()); + + District district = District.builder() + .siDo(listInsightByDistrictQuery.getSiDo()) + .siGunGu(listInsightByDistrictQuery.getSiGunGu()) + .eupMyeonDong(listInsightByDistrictQuery.getEupMyeonDong()) + .build(); + Page paged = insightRepository.findAllByDistrict(district, pageRequest); + Map memberNicknameMap = getMemberNicknameMap(paged.getContent()); + return paged.map(insight -> { + String memberNickname = memberNicknameMap.get(insight.getMemberId()); + return insightDataMapper.insightToInsightResponse(insight, memberNickname); + }); + } + + private List getInsightResponses(List insights) { + Map memberNicknameMap = getMemberNicknameMap(insights); + return insights.stream().map(insight -> { + String memberNickname = memberNicknameMap.get(insight.getMemberId()); + return insightDataMapper.insightToInsightResponse(insight, memberNickname); + }).toList(); + } + + private Map getMemberNicknameMap(List insights) { + List memberIds = insights.stream() + .map(Insight::getMemberId) + .toList(); + return memberResolver.resolve(memberIds).stream() + .collect(Collectors.toMap(memberData -> new MemberId(memberData.getMemberId()), MemberData::getNickname)); + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightApartmentComplexByDistrictQueryHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightApartmentComplexByDistrictQueryHandler.java new file mode 100644 index 00000000..2d7b0c22 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightApartmentComplexByDistrictQueryHandler.java @@ -0,0 +1,30 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.dto.insight.list.MyApartmentComplexResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@RequiredArgsConstructor +@Component +public class ListMyInsightApartmentComplexByDistrictQueryHandler { + + @Transactional(readOnly = true) + public List listMyInsightApartmentComplexByDistrict(MemberId memberId, District district) { + List results = new ArrayList<>(); + return results.stream() + .map(result -> MyApartmentComplexResult.builder() + .apartmentComplexName((String) result[0]) + .insightCount((Long) result[1]) + .build()) + .collect(Collectors.toList()); + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightCreatedByMeQueryHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightCreatedByMeQueryHandler.java new file mode 100644 index 00000000..9bdd5dc4 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightCreatedByMeQueryHandler.java @@ -0,0 +1,28 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.utils.PagingUtils; +import com.project.imdang.insight.domain.dto.insight.list.InsightSimpleResult; +import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; +import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RequiredArgsConstructor +@Component +public class ListMyInsightCreatedByMeQueryHandler { + + private final InsightRepository insightRepository; + + @Transactional(readOnly = true) + public Page listMyInsightCreatedByMe(ListMyInsightCreatedByMeQuery listMyInsightCreatedByMeQuery) { + + PageRequest pageRequest = PagingUtils.getPageRequest( + listMyInsightCreatedByMeQuery.getPageNumber(), listMyInsightCreatedByMeQuery.getPageSize(), listMyInsightCreatedByMeQuery.getDirection(), listMyInsightCreatedByMeQuery.getProperties()); + return null; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightDistrictCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightDistrictQueryHandler.java similarity index 59% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightDistrictCommandHandler.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightDistrictQueryHandler.java index d014245e..ccca5a8b 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightDistrictCommandHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightDistrictQueryHandler.java @@ -1,29 +1,25 @@ -package com.project.imdang.insight.service.domain.handler.insight; +package com.project.imdang.insight.domain.handler.insight; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.list.DistrictResponse; -import com.project.imdang.insight.service.domain.ports.output.repository.MemberSnapshotRepository; -import com.project.imdang.insight.service.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.dto.insight.list.MyDistrictResult; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @Component -public class ListMyInsightDistrictCommandHandler { - - private final MemberSnapshotRepository memberSnapshotRepository; +public class ListMyInsightDistrictQueryHandler { @Transactional(readOnly = true) - public List listMyInsightDistrict(UUID _memberId) { - MemberId memberId = new MemberId(_memberId); - List districts = memberSnapshotRepository.findAllDistinctDistrictByMemberId(memberId); + public List listMyInsightDistrict(MemberId memberId) { + List districts = new ArrayList<>(); // TODO - 쿼리 개선 return districts.stream() @@ -36,11 +32,11 @@ public List listMyInsightDistrict(UUID _memberId) { .siGunGu(siGunGu) .eupMyeonDong(eupMyeonDong) .build(); - Long[] result = memberSnapshotRepository.countAllByMemberIdAndDistrict(memberId, district); + Long[] result = new Long[10]; Long apartmentComplexCount = result[0]; Long insightCount = result[1]; - return DistrictResponse.builder() + return MyDistrictResult.builder() .siDo(siDo) .siGunGu(siGunGu) .eupMyeonDong(eupMyeonDong) diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightQueryHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightQueryHandler.java new file mode 100644 index 00000000..04810fa1 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyInsightQueryHandler.java @@ -0,0 +1,33 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.utils.PagingUtils; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.dto.insight.list.InsightResult; +import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightQuery; +import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; +import com.project.imdang.member.domain.client.MemberDataResolver; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RequiredArgsConstructor +@Component +public class ListMyInsightQueryHandler { + + private final InsightRepository insightRepository; + private final MemberDataResolver memberResolver; + + @Transactional(readOnly = true) + public Page listMyInsight(ListMyInsightQuery listMyInsightQuery) { + + PageRequest pageRequest = PagingUtils.getPageRequest( + listMyInsightQuery.getPageNumber(), listMyInsightQuery.getPageSize(), listMyInsightQuery.getDirection(), listMyInsightQuery.getProperties()); + MemberId memberId = listMyInsightQuery.getMemberId(); + Boolean onlyMine = listMyInsightQuery.getOnlyMine(); + return null; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyVisitedApartmentComplexCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyVisitedApartmentComplexQueryHandler.java similarity index 53% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyVisitedApartmentComplexCommandHandler.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyVisitedApartmentComplexQueryHandler.java index 11b6b717..c2cebc39 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyVisitedApartmentComplexCommandHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListMyVisitedApartmentComplexQueryHandler.java @@ -1,26 +1,24 @@ -package com.project.imdang.insight.service.domain.handler.insight; +package com.project.imdang.insight.domain.handler.insight; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.UUID; @Slf4j @RequiredArgsConstructor @Component -public class ListMyVisitedApartmentComplexCommandHandler { +public class ListMyVisitedApartmentComplexQueryHandler { private final InsightRepository insightRepository; @Transactional(readOnly = true) - public List listMyVisitedApartmentComplex(UUID _memberId) { - MemberId memberId = new MemberId(_memberId); + public List listMyVisitedApartmentComplex(MemberId memberId) { return insightRepository.findDistinctApartmentComplexByMemberId(memberId); } } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/RecommendInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/RecommendInsightCommandHandler.java new file mode 100644 index 00000000..55e17d0c --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/RecommendInsightCommandHandler.java @@ -0,0 +1,55 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.InsightDomainService; +import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.Recommend; +import com.project.imdang.insight.domain.event.InsightRecommendedEvent; +import com.project.imdang.insight.domain.exception.RecommendAlreadyExistException; +import com.project.imdang.insight.domain.helper.InsightHelper; +import com.project.imdang.insight.domain.helper.RecommendHelper; +import com.project.imdang.insight.domain.mapper.InsightDataMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Slf4j +@RequiredArgsConstructor +@Component +public class RecommendInsightCommandHandler { + + private final InsightDomainService insightDomainService; + private final InsightHelper insightHelper; + private final InsightDataMapper insightDataMapper; + + private final RecommendHelper recommendHelper; + + @Transactional + public InsightId recommendInsight(RecommendInsightCommand recommendInsightCommand) { + + MemberId recommendedBy = recommendInsightCommand.getRecommendMemberId(); + InsightId recommendedInsightId = recommendInsightCommand.getInsightId(); + // recommendedInsightId - memberId(recommendedBy)로 중복 추천 여부 체크 + checkAlreadyRecommended(recommendedBy, recommendedInsightId); + + Insight recommendedInsight = insightHelper.get(recommendedInsightId); + InsightRecommendedEvent insightRecommendedEvent = insightDomainService.recommendInsight(recommendedInsight, recommendedBy); + Insight savedInsight = insightHelper.save(insightRecommendedEvent.getInsight()); + + Recommend savedRecommend = recommendHelper.save(insightRecommendedEvent.getRecommend()); + log.info("Insight[id: {}] is recommended by Member[id: {}].", savedInsight.getId().getValue(), savedRecommend.getRecommendMemberId().getValue()); + return savedInsight.getId(); + } + + private void checkAlreadyRecommended(MemberId recommendedBy, InsightId recommendedInsightId) { + Optional optional = recommendHelper.getByRecommendMemberIdAndRecommendedInsightId(recommendedBy, recommendedInsightId); + if (optional.isPresent()) { + throw new RecommendAlreadyExistException(); + } + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java new file mode 100644 index 00000000..dd430d53 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java @@ -0,0 +1,68 @@ +package com.project.imdang.insight.domain.handler.insight; + +import com.project.imdang.common.domain.valueobject.File; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.InsightDomainService; +import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.event.InsightUpdatedEvent; +import com.project.imdang.insight.domain.exception.InsightDomainException; +import com.project.imdang.insight.domain.helper.InsightHelper; +import com.project.imdang.insight.domain.ports.output.file.FileService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; + +@Slf4j +@RequiredArgsConstructor +@Component +public class UpdateInsightCommandHandler { + + private final InsightDomainService insightDomainService; + private final InsightHelper insightHelper; + private final FileService fileService; + + @Transactional + public InsightId updateInsight(UpdateInsightCommand updateInsightCommand) { + + InsightId insightId = updateInsightCommand.getInsightId(); + Insight insight = insightHelper.get(insightId); + + // validation check + MemberId updatedBy = updateInsightCommand.getMemberId(); + String mainImage = uploadImage(updateInsightCommand.getMainImage()); + InsightUpdatedEvent insightUpdatedEvent = insightDomainService.updateInsight( + insight, + updatedBy, + mainImage, + updateInsightCommand.getTitle(), + updateInsightCommand.getAddress(), + updateInsightCommand.getApartmentComplex(), + updateInsightCommand.getVisitAt(), + updateInsightCommand.getVisitTimes(), + updateInsightCommand.getVisitMethods(), + updateInsightCommand.getAccess(), + updateInsightCommand.getSummary(), + updateInsightCommand.getInfra(), + updateInsightCommand.getComplexEnvironment(), + updateInsightCommand.getScore()); + Insight updated = insightUpdatedEvent.getInsight(); + log.info("Insight[id: {}] is updated.", updated.getId().getValue()); + Insight savedInsight = insightHelper.save(updated); + return savedInsight.getId(); + } + + private String uploadImage(File mainImageFile) { + String mainImage; + try { + mainImage = fileService.upload(mainImageFile); + } catch (IOException e) { + throw new InsightDomainException(e.getMessage()); + } + return mainImage; + } +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/AccuseHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/AccuseHelper.java similarity index 70% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/AccuseHelper.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/AccuseHelper.java index 3355f9e7..6d2fc03f 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/AccuseHelper.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/AccuseHelper.java @@ -1,10 +1,10 @@ -package com.project.imdang.insight.service.domain.handler; +package com.project.imdang.insight.domain.helper; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Accuse; -import com.project.imdang.insight.service.domain.exception.InsightDomainException; -import com.project.imdang.insight.service.domain.ports.output.repository.AccuseRepository; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Accuse; +import com.project.imdang.insight.domain.exception.InsightDomainException; +import com.project.imdang.insight.domain.ports.output.repository.AccuseRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java similarity index 68% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightHelper.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java index 600ebbbb..b3ae8292 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightHelper.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java @@ -1,10 +1,10 @@ -package com.project.imdang.insight.service.domain.handler; +package com.project.imdang.insight.domain.helper; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.exception.InsightDomainException; -import com.project.imdang.insight.service.domain.exception.InsightNotFoundException; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.exception.InsightDomainException; +import com.project.imdang.insight.domain.exception.InsightNotFoundException; +import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RecommendHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/RecommendHelper.java similarity index 70% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RecommendHelper.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/RecommendHelper.java index 6e62e1ab..5914b781 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RecommendHelper.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/RecommendHelper.java @@ -1,10 +1,10 @@ -package com.project.imdang.insight.service.domain.handler; +package com.project.imdang.insight.domain.helper; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Recommend; -import com.project.imdang.insight.service.domain.exception.InsightDomainException; -import com.project.imdang.insight.service.domain.ports.output.repository.RecommendRepository; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Recommend; +import com.project.imdang.insight.domain.exception.InsightDomainException; +import com.project.imdang.insight.domain.ports.output.repository.RecommendRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java new file mode 100644 index 00000000..52cb1e9b --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java @@ -0,0 +1,71 @@ +package com.project.imdang.insight.domain.mapper; + +import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; +import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; +import com.project.imdang.insight.domain.dto.insight.list.InsightResult; +import com.project.imdang.insight.domain.entity.Insight; +import org.springframework.stereotype.Component; + +@Component +public class InsightDataMapper { + + public InsightResult insightToInsightResponse(Insight insight, String memberNickname) { + return InsightResult.builder() + .insightId(insight.getId()) + .recommendedCount(insight.getRecommendedCount()) + .address(insight.getAddress()) + .title(insight.getTitle()) + .mainImage(insight.getMainImage()) + .memberNickname(memberNickname) + .createdAt(insight.getCreatedAt()) + .build(); + } + + public Insight createInsightCommandToInsight(CreateInsightCommand createInsightCommand) { + return Insight.builder() + .memberId(createInsightCommand.getMemberId()) + .title(createInsightCommand.getTitle()) + .address(createInsightCommand.getAddress()) + .apartmentComplex(createInsightCommand.getApartmentComplex()) + .visitAt(createInsightCommand.getVisitAt()) + .visitTimes(createInsightCommand.getVisitTimes()) + .visitMethods(createInsightCommand.getVisitMethods()) + .access(createInsightCommand.getAccess()) + .summary(createInsightCommand.getSummary()) + .infra(createInsightCommand.getInfra()) + .complexEnvironment(createInsightCommand.getComplexEnvironment()) + .score(createInsightCommand.getScore()) + .build(); + } + + public InsightDetailResult insightToDetailInsightResponse(Insight insight, + String memberNickname, + Boolean recommended, + Boolean accused, + Boolean createdByMe) { + return InsightDetailResult.builder() + .memberId(insight.getMemberId()) + .memberNickname(memberNickname) + .insightId(insight.getId()) + .mainImage(insight.getMainImage()) + .title(insight.getTitle()) + .address(insight.getAddress()) + .apartmentComplex(insight.getApartmentComplex()) + .visitAt(insight.getVisitAt()) + .visitTimes(insight.getVisitTimes()) + .visitMethods(insight.getVisitMethods()) + .access(insight.getAccess()) + .summary(insight.getSummary()) + .infra(insight.getInfra()) + .complexEnvironment(insight.getComplexEnvironment()) + .recommended(recommended) + .accused(accused) + .recommendedCount(insight.getRecommendedCount()) + .accusedCount(insight.getAccusedCount()) + .viewCount(insight.getViewCount()) + .score(insight.getScore()) + .createdAt(insight.getCreatedAt()) + .createdByMe(createdByMe) + .build(); + } +} diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberAccusedResponseMessage.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/message/response/MemberAccusedResponse.java similarity index 74% rename from common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberAccusedResponseMessage.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/message/response/MemberAccusedResponse.java index 013f38c7..72aad0c5 100644 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/message/MemberAccusedResponseMessage.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/message/response/MemberAccusedResponse.java @@ -1,4 +1,4 @@ -package com.project.imdang.domain.message; +package com.project.imdang.insight.domain.message.response; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -10,7 +10,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor -public class MemberAccusedResponseMessage { +public class MemberAccusedResponse { private boolean isCompleted; private UUID accusedMemberId; } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/input/service/InsightApplicationService.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/input/service/InsightApplicationService.java new file mode 100644 index 00000000..d8188ebd --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/input/service/InsightApplicationService.java @@ -0,0 +1,49 @@ +package com.project.imdang.insight.domain.ports.input.service; + +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; +import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; +import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; +import com.project.imdang.insight.domain.dto.insight.detail.DetailInsightQuery; +import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; +import com.project.imdang.insight.domain.dto.insight.list.MyApartmentComplexResult; +import com.project.imdang.insight.domain.dto.insight.list.MyDistrictResult; +import com.project.imdang.insight.domain.dto.insight.list.InsightResult; +import com.project.imdang.insight.domain.dto.insight.list.InsightSimpleResult; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByApartmentComplexQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDateQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDistrictQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListInsightQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; +import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightQuery; +import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; +import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; +import org.springframework.data.domain.Page; + +import java.util.List; + +public interface InsightApplicationService { + Page listInsight(ListInsightQuery listInsightQuery); + Page listInsightByDate(ListInsightByDateQuery listInsightByDateQuery); + Page listInsightByDistrict(ListInsightByDistrictQuery listInsightByDistrictQuery); + Page listInsightByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery); + List listMyVisitedApartmentComplex(MemberId memberId); + Page listDistrict(String siDo, String siGunGu, Integer pageNumber, Integer pageSize); + + List listMyInsightDistrict(MemberId memberId); + List listMyInsightApartmentComplexByDistrict(MemberId memberId, String siDo, String siGunGu, String eupMyeonDong); + Page listMyInsight(ListMyInsightQuery listMyInsightQuery); + Page listMyInsightCreatedByMe(ListMyInsightCreatedByMeQuery listMyInsightCreatedByMeQuery); + + InsightDetailResult detailInsight(DetailInsightQuery detailInsightQuery); + // = uploadInsight + InsightId createInsight(CreateInsightCommand createInsightCommand); + InsightId updateInsight(UpdateInsightCommand updateInsightCommand); + InsightId deleteInsight(DeleteInsightCommand deleteInsightCommand); + + InsightId recommendInsight(RecommendInsightCommand recommendInsightCommand); + InsightId accuseInsight(AccuseInsightCommand accuseInsightCommand); +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/file/FileService.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/file/FileService.java new file mode 100644 index 00000000..67d01362 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/file/FileService.java @@ -0,0 +1,9 @@ +package com.project.imdang.insight.domain.ports.output.file; + +import com.project.imdang.common.domain.valueobject.File; + +import java.io.IOException; + +public interface FileService { + String upload(File file) throws IOException; +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightAccusedEventMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightAccusedEventMessagePublisher.java new file mode 100644 index 00000000..5b4ce3f4 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightAccusedEventMessagePublisher.java @@ -0,0 +1,7 @@ +package com.project.imdang.insight.domain.ports.output.publisher; + +import com.project.imdang.common.domain.event.DomainEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightAccusedEventMessage; + +public interface InsightAccusedEventMessagePublisher extends DomainEventMessagePublisher { +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightCreatedEventMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightCreatedEventMessagePublisher.java new file mode 100644 index 00000000..eace7d40 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightCreatedEventMessagePublisher.java @@ -0,0 +1,7 @@ +package com.project.imdang.insight.domain.ports.output.publisher; + +import com.project.imdang.common.domain.event.DomainEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightCreatedEventMessage; + +public interface InsightCreatedEventMessagePublisher extends DomainEventMessagePublisher { +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightDeletedEventMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightDeletedEventMessagePublisher.java new file mode 100644 index 00000000..6d24af35 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/publisher/InsightDeletedEventMessagePublisher.java @@ -0,0 +1,7 @@ +package com.project.imdang.insight.domain.ports.output.publisher; + +import com.project.imdang.common.domain.event.DomainEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightDeletedEventMessage; + +public interface InsightDeletedEventMessagePublisher extends DomainEventMessagePublisher { +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/AccuseRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/AccuseRepository.java new file mode 100644 index 00000000..3ce2ed53 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/AccuseRepository.java @@ -0,0 +1,12 @@ +package com.project.imdang.insight.domain.ports.output.repository; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Accuse; + +import java.util.Optional; + +public interface AccuseRepository { + Optional findByAccuseMemberIdAndAccusedInsightId(MemberId accuseMemberId, InsightId accusedInsightId); + Accuse save(Accuse accuse); +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/DistrictRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/DistrictRepository.java similarity index 69% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/DistrictRepository.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/DistrictRepository.java index 1562505e..cdfcf286 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/DistrictRepository.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/DistrictRepository.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.domain.ports.output.repository; +package com.project.imdang.insight.domain.ports.output.repository; -import com.project.imdang.insight.service.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.District; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/InsightRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightRepository.java similarity index 65% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/InsightRepository.java rename to insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightRepository.java index 8b0afeeb..c4419eae 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/InsightRepository.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightRepository.java @@ -1,10 +1,10 @@ -package com.project.imdang.insight.service.domain.ports.output.repository; +package com.project.imdang.insight.domain.ports.output.repository; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.District; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/RecommendRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/RecommendRepository.java new file mode 100644 index 00000000..6e16eeeb --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/RecommendRepository.java @@ -0,0 +1,12 @@ +package com.project.imdang.insight.domain.ports.output.repository; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Recommend; + +import java.util.Optional; + +public interface RecommendRepository { + Optional findByRecommendMemberIdAndRecommendedInsightId(MemberId recommendMemberId, InsightId recommendedInsightId); + Recommend save(Recommend recommend); +} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ExchangeApplicationServiceImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ExchangeApplicationServiceImpl.java deleted file mode 100644 index bfafa397..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ExchangeApplicationServiceImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.project.imdang.insight.service.domain; - -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestResponse; -import com.project.imdang.insight.service.domain.dto.exchange.list.ListExchangeRequestedByMeQuery; -import com.project.imdang.insight.service.domain.dto.exchange.list.ListExchangeRequestedByOthersQuery; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestResponse; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightCommand; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.handler.exchange.*; -import com.project.imdang.insight.service.domain.ports.input.service.ExchangeApplicationService; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class ExchangeApplicationServiceImpl implements ExchangeApplicationService { - - private final RequestExchangeCommandHandler requestExchangeCommandHandler; - private final AcceptExchangeRequestCommandHandler acceptExchangeRequestCommandHandler; - private final RejectExchangeRequestCommandHandler rejectExchangeRequestCommandHandler; - private final ListExchangeRequestedByMeHandler listExchangeRequestedByMeHandler; - private final ListExchangeRequestedByOthersHandler listExchangeRequestedByOthersHandler; - - @Override - public RequestExchangeInsightResponse requestExchangeInsight(RequestExchangeInsightCommand requestExchangeInsightCommand) { - return requestExchangeCommandHandler.requestExchange(requestExchangeInsightCommand); - } - - @Override - public AcceptExchangeRequestResponse acceptExchangeRequest(AcceptExchangeRequestCommand acceptExchangeRequestCommand) { - return acceptExchangeRequestCommandHandler.acceptExchangeRequest(acceptExchangeRequestCommand); - } - - @Override - public RejectExchangeRequestResponse rejectExchangeRequest(RejectExchangeRequestCommand rejectExchangeRequestCommand) { - return rejectExchangeRequestCommandHandler.rejectExchangeRequest(rejectExchangeRequestCommand); - } - - @Override - public Page listExchangeRequestedByMe(ListExchangeRequestedByMeQuery listExchangeRequestedByMeQuery) { - return listExchangeRequestedByMeHandler.list(listExchangeRequestedByMeQuery); - } - - @Override - public Page listExchangeRequestedByOthers(ListExchangeRequestedByOthersQuery listExchangeRequestedByOthersQuery) { - return listExchangeRequestedByOthersHandler.list(listExchangeRequestedByOthersQuery); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/InsightApplicationServiceImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/InsightApplicationServiceImpl.java deleted file mode 100644 index a8ba567f..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/InsightApplicationServiceImpl.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.project.imdang.insight.service.domain; - -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ApartmentComplexResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.DistrictResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightSimpleResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByApartmentComplexQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByDateQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByDistrictQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListMyInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightResponse; -import com.project.imdang.insight.service.domain.handler.insight.AccuseInsightCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.CreateInsightCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.DeleteInsightCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.DetailInsightCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListDistrictCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListInsightByApartmentComplexCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListInsightByDateCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListInsightByDistrictCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListInsightCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListMyInsightApartmentComplexByDistrictCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListMyInsightCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListMyInsightCreatedByMeCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListMyInsightDistrictCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.ListMyVisitedApartmentComplexCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.RecommendInsightCommandHandler; -import com.project.imdang.insight.service.domain.handler.insight.UpdateInsightCommandHandler; -import com.project.imdang.insight.service.domain.ports.input.service.InsightApplicationService; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.District; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.List; -import java.util.UUID; - -@Validated -@RequiredArgsConstructor -@Service -public class InsightApplicationServiceImpl implements InsightApplicationService { - - private final ListInsightCommandHandler listInsightCommandHandler; - private final ListInsightByDateCommandHandler listInsightByDateCommandHandler; - private final ListInsightByDistrictCommandHandler listInsightByDistrictCommandHandler; - private final ListInsightByApartmentComplexCommandHandler listInsightByApartmentComplexCommandHandler; - private final ListMyVisitedApartmentComplexCommandHandler listMyVisitedApartmentComplexCommandHandler; - private final ListDistrictCommandHandler listDistrictCommandHandler; - - private final ListMyInsightDistrictCommandHandler listMyInsightDistrictCommandHandler; - private final ListMyInsightApartmentComplexByDistrictCommandHandler listMyInsightApartmentComplexByDistrictCommandHandler; - private final ListMyInsightCommandHandler listMyInsightCommandHandler; - private final ListMyInsightCreatedByMeCommandHandler listMyInsightCreatedByMeCommandHandler; - - private final DetailInsightCommandHandler detailInsightCommandHandler; - private final CreateInsightCommandHandler createInsightCommandHandler; - private final UpdateInsightCommandHandler updateInsightCommandHandler; - private final DeleteInsightCommandHandler deleteInsightCommandHandler; - - private final RecommendInsightCommandHandler recommendInsightCommandHandler; - private final AccuseInsightCommandHandler accuseInsightCommandHandler; - - @Override - public Page listInsight(ListInsightQuery listInsightQuery) { - return listInsightCommandHandler.listInsight(listInsightQuery); - } - - @Override - public Page listInsightByDate(ListInsightByDateQuery listInsightByDateQuery) { - return listInsightByDateCommandHandler.listInsightByDate(listInsightByDateQuery); - } - - @Override - public Page listInsightByDistrict(ListInsightByDistrictQuery listInsightByDistrictQuery) { - return listInsightByDistrictCommandHandler.listInsightByDistrict(listInsightByDistrictQuery); - } - - @Override - public Page listInsightByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery) { - return listInsightByApartmentComplexCommandHandler.listInsightByApartmentComplex(listInsightByApartmentComplexQuery); - } - - @Override - public List listMyVisitedApartmentComplex(UUID memberId) { - return listMyVisitedApartmentComplexCommandHandler.listMyVisitedApartmentComplex(memberId); - } - - @Override - public Page listDistrict(String siDo, String siGunGu, Integer pageNumber, Integer pageSize) { - return listDistrictCommandHandler.listDistrict(siDo, siGunGu, pageNumber, pageSize); - } - - @Override - public List listMyInsightDistrict(UUID memberId) { - return listMyInsightDistrictCommandHandler.listMyInsightDistrict(memberId); - } - - @Override - public List listMyInsightApartmentComplexByDistrict(UUID memberId, District district) { - return listMyInsightApartmentComplexByDistrictCommandHandler.listMyInsightApartmentComplexByDistrict(memberId, district); - } - - @Override - public Page listMyInsight(ListMyInsightQuery listMyInsightQuery) { - return listMyInsightCommandHandler.listMyInsight(listMyInsightQuery); - } - - @Override - public Page listMyInsightCreatedByMe(ListMyInsightCreatedByMeQuery listMyInsightCreatedByMeQuery) { - return listMyInsightCreatedByMeCommandHandler.listMyInsightCreatedByMe(listMyInsightCreatedByMeQuery); - } - - @Override - public DetailInsightResponse detailInsight(DetailInsightQuery detailInsightQuery) { - return detailInsightCommandHandler.detailInsight(detailInsightQuery); - } - - @Override - public CreateInsightResponse createInsight(CreateInsightCommand createInsightCommand) { - return createInsightCommandHandler.createInsight(createInsightCommand); - } - - @Override - public UpdateInsightResponse updateInsight(UpdateInsightCommand updateInsightCommand) { - return updateInsightCommandHandler.updateInsight(updateInsightCommand); - } - - @Override - public DeleteInsightResponse deleteInsight(DeleteInsightCommand deleteInsightCommand) { - return deleteInsightCommandHandler.deleteInsight(deleteInsightCommand); - } - - @Override - public RecommendInsightResponse recommendInsight(RecommendInsightCommand recommendInsightCommand) { - return recommendInsightCommandHandler.recommendInsight(recommendInsightCommand); - } - - @Override - public AccuseInsightResponse accuseInsight(AccuseInsightCommand accuseInsightCommand) { - return accuseInsightCommandHandler.accuseInsight(accuseInsightCommand); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/accept/AcceptExchangeRequestCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/accept/AcceptExchangeRequestCommand.java deleted file mode 100644 index 24cf7832..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/accept/AcceptExchangeRequestCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.exchange.accept; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class AcceptExchangeRequestCommand { - - @Schema(description = "교환 요청ID") - @NotNull - private UUID exchangeRequestId; - @Setter - @Schema(description = "요청 받은 사용자 ID") - private UUID requestedMemberId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/accept/AcceptExchangeRequestResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/accept/AcceptExchangeRequestResponse.java deleted file mode 100644 index f7753eaa..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/accept/AcceptExchangeRequestResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.exchange.accept; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class AcceptExchangeRequestResponse { - private UUID exchangeRequestId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/list/ListExchangeRequestedByMeQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/list/ListExchangeRequestedByMeQuery.java deleted file mode 100644 index 200da6b2..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/list/ListExchangeRequestedByMeQuery.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.exchange.list; - -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ListExchangeRequestedByMeQuery { - // TODO - PagingQuery 클래스 이동 - - @Setter - @Schema(description = "요청한 사용자 ID") - private UUID requestMemberId; - // 대기, 거절, 완료 - @Schema(description = "교환 요청 상태") - @NotNull - private ExchangeRequestStatus exchangeRequestStatus; - - private Integer pageNumber; - private Integer pageSize; - private String direction; - private String[] properties; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/list/ListExchangeRequestedByOthersQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/list/ListExchangeRequestedByOthersQuery.java deleted file mode 100644 index 404ff93a..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/list/ListExchangeRequestedByOthersQuery.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.exchange.list; - -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ListExchangeRequestedByOthersQuery { - - @Setter - @Schema(description = "요청 받은 사용자ID") - private UUID requestedMemberId; - // 대기, 거절, 완료 - @Schema(description = "요청 상태") - @NotNull - private ExchangeRequestStatus exchangeRequestStatus; - - private Integer pageNumber; - private Integer pageSize; - private String direction; - private String[] properties; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/reject/RejectExchangeRequestCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/reject/RejectExchangeRequestCommand.java deleted file mode 100644 index 683543be..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/reject/RejectExchangeRequestCommand.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.exchange.reject; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RejectExchangeRequestCommand { - @Schema(description = "교환 요청ID") - @NotNull - private UUID exchangeRequestId; - @Setter - @Schema(description = "요청 받은 사용자ID") - private UUID requestedMemberId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/request/RequestExchangeInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/request/RequestExchangeInsightCommand.java deleted file mode 100644 index af4333cd..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/request/RequestExchangeInsightCommand.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.exchange.request; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RequestExchangeInsightCommand { - @Schema(description = "요청 받은 인사이트ID") - @NotNull - private UUID requestedInsightId; - - // requestedBy - @Setter - @Schema(description = "교환 요청한 사용자 ID") - private UUID requestMemberId; - - ///////////////////////////////////////////////// - // 내가 작성한 인사이트 - @Schema(description = "교환 요청한 사용자의 인사이트ID") -// @NotNull - private UUID requestMemberInsightId; - // OR - @Schema(description = "쿠폰ID") - private Long memberCouponId; - ///////////////////////////////////////////////// -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/request/RequestExchangeInsightResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/request/RequestExchangeInsightResponse.java deleted file mode 100644 index a186e156..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/request/RequestExchangeInsightResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.exchange.request; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RequestExchangeInsightResponse { - @Schema(description = "교환 요청 ID") - private UUID exchangeRequestId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/accuse/AccuseInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/accuse/AccuseInsightCommand.java deleted file mode 100644 index 3d38d16a..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/accuse/AccuseInsightCommand.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.accuse; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class AccuseInsightCommand { - // insightId - accuseMemberId UNIQUE - @NotNull - @Schema(description = "인사이트ID") - private UUID insightId; - - @Setter - @Schema(description = "신고한 사용자ID") - private UUID accuseMemberId; // accusedBy : 신고한 memberId -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/accuse/AccuseInsightResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/accuse/AccuseInsightResponse.java deleted file mode 100644 index ea945d29..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/accuse/AccuseInsightResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.accuse; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class AccuseInsightResponse { - private UUID insightId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/create/CreateInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/create/CreateInsightCommand.java deleted file mode 100644 index dd5d5782..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/create/CreateInsightCommand.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.create; - -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.PositiveOrZero; -import jakarta.validation.constraints.Size; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.springframework.web.multipart.MultipartFile; - -import java.time.LocalDate; -import java.util.Set; -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class CreateInsightCommand { - - @Setter - private UUID memberId; // createdBy - - @Schema(description = "인사이트 작성 점수") - @NotNull - @PositiveOrZero - private int score; - - @Schema(description = "메인 이미지") - @Setter - private MultipartFile mainImage; - @Schema(description = "제목") - @NotBlank - @Size(min = 1, max = 20) - private String title; - @Schema(description = "주소") - @NotNull - private Address address; - @Schema(description = "아파트 단지") - private ApartmentComplex apartmentComplex; - - // TODO - ZoneId 필요 - // private ZonedDateTime visitAt; - @Schema(description = "다녀온 날짜", example = "2024-12-31") - @NotNull - private LocalDate visitAt; - @Schema(description = "다녀온 시간") - private Set visitTimes; - @Schema(description = "교통 수단") - @NotNull - private Set visitMethods; - - @Schema(description = "요약") - @NotBlank - @Size(min = 30, max = 200) - private String summary; - - @Schema(description = "출입 제한") - @NotNull - private Access access; - - // 인프라 - private Infra infra; - // 단지 환경 - private ComplexEnvironment complexEnvironment; - // 단지 시설 - private ComplexFacility complexFacility; - // (예정된) 호재 - private FavorableNews favorableNews; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/create/CreateInsightResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/create/CreateInsightResponse.java deleted file mode 100644 index fe8fa366..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/create/CreateInsightResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.create; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class CreateInsightResponse { - private UUID insightId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/delete/DeleteInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/delete/DeleteInsightCommand.java deleted file mode 100644 index f69d9bdd..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/delete/DeleteInsightCommand.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.delete; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DeleteInsightCommand { - @NotNull - @Schema(description = "인사이트ID") - private UUID insightId; - @Setter - @Schema(description = "사용자ID") - private UUID memberId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/detail/DetailInsightQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/detail/DetailInsightQuery.java deleted file mode 100644 index d3948437..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/detail/DetailInsightQuery.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.detail; - -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DetailInsightQuery { - @NotNull - private UUID insightId; - -// @Setter - private UUID memberId; // requestedBy -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/InsightResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/InsightResponse.java deleted file mode 100644 index 375090f5..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/InsightResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; - -import com.project.imdang.insight.service.domain.valueobject.Address; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.time.ZonedDateTime; -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class InsightResponse { - @Schema(description = "인사이트ID") - private UUID insightId; - @Schema(description = "추천 수") - private Integer recommendedCount; - @Schema(description = "주소") - private Address address; - @Schema(description = "제목") - private String title; - @Schema(description = "메인 이미지") - private String mainImage; - @Schema(description = "사용자 닉네임") - private String memberNickname; - private ZonedDateTime createdAt; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByApartmentComplexQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByApartmentComplexQuery.java deleted file mode 100644 index ac0f4f1a..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByApartmentComplexQuery.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; - -import jakarta.validation.constraints.NotBlank; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ListInsightByApartmentComplexQuery { - @NotBlank - private String apartmentComplexName; - - private Integer pageNumber; - private Integer pageSize; - private String direction; - private String[] properties; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByDateQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByDateQuery.java deleted file mode 100644 index 085cd4ee..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByDateQuery.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.time.LocalDate; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@Schema(description = "검색 조건") -public class ListInsightByDateQuery { - - private LocalDate date; - - private Integer pageNumber; - private Integer pageSize; - private String direction; - private String[] properties; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByDistrictQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByDistrictQuery.java deleted file mode 100644 index 1755b57e..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightByDistrictQuery.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; - -import jakarta.validation.constraints.NotBlank; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ListInsightByDistrictQuery { - - @NotBlank - private String siDo; - @NotBlank - private String siGunGu; - @NotBlank - private String eupMyeonDong; - - private Integer pageNumber; - private Integer pageSize; - private String direction; - private String[] properties; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightQuery.java deleted file mode 100644 index 8b52375e..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListInsightQuery.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@Schema(description = "검색 조건") -public class ListInsightQuery { - private Integer pageNumber; - private Integer pageSize; - private String direction; - private String[] properties; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListMyInsightQuery.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListMyInsightQuery.java deleted file mode 100644 index b453596d..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/list/ListMyInsightQuery.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.list; - -import com.project.imdang.insight.service.domain.valueobject.District; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ListMyInsightQuery { - -// @Setter - private UUID memberId; - private District district; - private String apartmentComplexName; - - private Boolean onlyMine; - - private Integer pageNumber; - private Integer pageSize; - private String direction; - private String[] properties; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/recommend/RecommendInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/recommend/RecommendInsightCommand.java deleted file mode 100644 index b788d95f..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/recommend/RecommendInsightCommand.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.recommend; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RecommendInsightCommand { - @NotNull - @Schema(description = "인사이트ID") - private UUID insightId; - @Setter - @Schema(description = "추천한 사용자ID") - private UUID recommendMemberId; // recommendedBy -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/recommend/RecommendInsightResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/recommend/RecommendInsightResponse.java deleted file mode 100644 index 369b144e..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/recommend/RecommendInsightResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.recommend; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RecommendInsightResponse { - private UUID insightId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/request/RequestInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/request/RequestInsightCommand.java deleted file mode 100644 index 7f3fee87..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/request/RequestInsightCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.request; - -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RequestInsightCommand { - @NotNull - private UUID requestedInsightId; - @NotNull - private Long memberCouponId; - - @Setter - @NotNull - private UUID requestMemberId; // requestedBy -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/request/RequestInsightResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/request/RequestInsightResponse.java deleted file mode 100644 index cb488b9d..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/request/RequestInsightResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.request; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RequestInsightResponse { - private UUID insightId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/update/UpdateInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/update/UpdateInsightCommand.java deleted file mode 100644 index 97c933c2..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/update/UpdateInsightCommand.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.update; - -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.PositiveOrZero; -import jakarta.validation.constraints.Size; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.springframework.web.multipart.MultipartFile; - -import java.time.LocalDate; -import java.util.Set; -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class UpdateInsightCommand { - // TODO - 수정 가능한 항목 - @NotNull - private UUID insightId; - // TODO - validation - @Setter - private UUID memberId; - - private Address address; - private ApartmentComplex apartmentComplex; - - @Schema(description = "인사이트 작성 점수") - @NotNull - @PositiveOrZero - private int score; - @Schema(description = "제목") - @NotBlank - @Size(min = 1, max = 20) - private String title; - @Schema(description = "메인 이미지") - @Setter - private MultipartFile mainImage; - @Schema(description = "요약") - @NotBlank - @Size(min = 30, max = 200) - private String summary; - - // TODO - ZoneId 필요 - // private ZonedDateTime visitAt; - @Schema(description = "방문 날짜", example = "2024-12-31") - @NotNull - private LocalDate visitAt; - @Schema(description = "방문 시간") - @NotNull - private Set visitTimes; - @Schema(description = "교통 수단") - @NotNull - private Set visitMethods; - @Schema(description = "출입 제한") - @NotNull - private Access access; - - // 인프라 - private Infra infra; - // 단지 환경 - private ComplexEnvironment complexEnvironment; - // 단지 시설 - private ComplexFacility complexFacility; - // (예정된) 호재 - private FavorableNews favorableNews; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/update/UpdateInsightResponse.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/update/UpdateInsightResponse.java deleted file mode 100644 index 42994be1..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/update/UpdateInsightResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.project.imdang.insight.service.domain.dto.insight.update; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class UpdateInsightResponse { - private UUID insightId; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/exception/InsightApplicationServiceException.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/exception/InsightApplicationServiceException.java deleted file mode 100644 index 5c5f71e6..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/exception/InsightApplicationServiceException.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.project.imdang.insight.service.domain.exception; - -import com.project.imdang.domain.exception.ApplicationServiceException; -import com.project.imdang.domain.exception.ErrorCode; - -public class InsightApplicationServiceException extends ApplicationServiceException { - - public InsightApplicationServiceException(ErrorCode errorCode) { - // TODO - 수정 - super(errorCode.name()); - } - - public InsightApplicationServiceException(String message) { - super(message); - } - - public InsightApplicationServiceException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/AccuseInsightMemberSaga.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/AccuseInsightMemberSaga.java deleted file mode 100644 index 9661bf7f..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/AccuseInsightMemberSaga.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.MemberAccusedResponseMessage; -import com.project.imdang.insight.service.domain.exception.InsightApplicationServiceException; -import com.project.imdang.saga.SagaStep; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import static com.project.imdang.domain.exception.ErrorCode.MEMBER_ACCUSE_FAILED; - -@Slf4j -@RequiredArgsConstructor -@Component -public class AccuseInsightMemberSaga implements SagaStep { - - @Override - public void process(MemberAccusedResponseMessage response) { - log.info("Member[id: {}] accused.", response.getAccusedMemberId()); - } - - @Override - public void rollback(MemberAccusedResponseMessage response) { - throw new InsightApplicationServiceException(MEMBER_ACCUSE_FAILED); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestAcceptedCountMessagePublisherImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestAcceptedCountMessagePublisherImpl.java deleted file mode 100644 index f4142db6..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestAcceptedCountMessagePublisherImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.ExchangeRequestAcceptedCountRequestMessage; -import com.project.imdang.insight.service.domain.ports.output.publisher.ExchangeRequestAcceptedCountMessagePublisher; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class ExchangeRequestAcceptedCountMessagePublisherImpl implements ExchangeRequestAcceptedCountMessagePublisher { - - private final ApplicationEventPublisher applicationEventPublisher; - - @Override - public void publish(ExchangeRequestAcceptedCountRequestMessage exchangeRequestCountRequestMessage) { - applicationEventPublisher.publishEvent(exchangeRequestCountRequestMessage); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestCreatedRequestMessagePublisherImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestCreatedRequestMessagePublisherImpl.java deleted file mode 100644 index 201035f0..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestCreatedRequestMessagePublisherImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.ExchangeRequestCreatedRequestMessage; -import com.project.imdang.insight.service.domain.ports.output.publisher.ExchangeRequestCreatedRequestMessagePublisher; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class ExchangeRequestCreatedRequestMessagePublisherImpl implements ExchangeRequestCreatedRequestMessagePublisher { - - private final ApplicationEventPublisher applicationEventPublisher; - - public void publish(ExchangeRequestCreatedRequestMessage exchangeRequestCreatedRequestMessage) { - applicationEventPublisher.publishEvent(exchangeRequestCreatedRequestMessage); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestHelper.java deleted file mode 100644 index 89b36ad5..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestHelper.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.exception.ExchangeDomainException; -import com.project.imdang.insight.service.domain.exception.ExchangeRequestNotFoundException; -import com.project.imdang.insight.service.domain.ports.output.repository.ExchangeRequestRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ExchangeRequestHelper { - - private final ExchangeRequestRepository exchangeRequestRepository; - - public ExchangeRequest get(ExchangeRequestId exchangeRequestId) { - return exchangeRequestRepository.findById(exchangeRequestId) - .orElseThrow(() -> new ExchangeRequestNotFoundException(exchangeRequestId)); - } - - public ExchangeRequest save(ExchangeRequest exchangeRequest) { - ExchangeRequest savedExchangeRequest = exchangeRequestRepository.save(exchangeRequest); - if(savedExchangeRequest == null) { - String errorMessage = "Could not save ExchangeRequest!"; - log.error(errorMessage); - throw new ExchangeDomainException(errorMessage); - } - log.info("ExchangeRequest[id: {}] is saved.", savedExchangeRequest.getId().getValue()); - return savedExchangeRequest; - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestRejectedCountMessagePublisherImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestRejectedCountMessagePublisherImpl.java deleted file mode 100644 index d4a42b9d..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestRejectedCountMessagePublisherImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.ExchangeRequestRejectedCountRequestMessage; -import com.project.imdang.insight.service.domain.ports.output.publisher.ExchangeRequestRejectedCountMessagePublisher; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class ExchangeRequestRejectedCountMessagePublisherImpl implements ExchangeRequestRejectedCountMessagePublisher { - - private final ApplicationEventPublisher applicationEventPublisher; - - public void publish(ExchangeRequestRejectedCountRequestMessage exchangeRequestRejectedCountRequestMessage) { - applicationEventPublisher.publishEvent(exchangeRequestRejectedCountRequestMessage); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestRejectedRequestMessagePublisherImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestRejectedRequestMessagePublisherImpl.java deleted file mode 100644 index afd6df28..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/ExchangeRequestRejectedRequestMessagePublisherImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.ExchangeRequestRejectedRequestMessage; -import com.project.imdang.insight.service.domain.ports.output.publisher.ExchangeRequestRejectedRequestMessagePublisher; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class ExchangeRequestRejectedRequestMessagePublisherImpl implements ExchangeRequestRejectedRequestMessagePublisher { - - private final ApplicationEventPublisher applicationEventPublisher; - - public void publish(ExchangeRequestRejectedRequestMessage exchangeRequestRejectedRequestMessage) { - applicationEventPublisher.publishEvent(exchangeRequestRejectedRequestMessage); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightAccusedRequestMessagePublisherImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightAccusedRequestMessagePublisherImpl.java deleted file mode 100644 index f6bfe3d2..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightAccusedRequestMessagePublisherImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.InsightAccusedRequestMessage; -import com.project.imdang.insight.service.domain.ports.output.publisher.InsightAccusedRequestMessagePublisher; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class InsightAccusedRequestMessagePublisherImpl implements InsightAccusedRequestMessagePublisher { - - private final ApplicationEventPublisher applicationEventPublisher; - - public void publish(InsightAccusedRequestMessage insightAccusedRequestMessage) { - applicationEventPublisher.publishEvent(insightAccusedRequestMessage); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightCreatedCountMessagePublisherImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightCreatedCountMessagePublisherImpl.java deleted file mode 100644 index 5f03a7f5..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/InsightCreatedCountMessagePublisherImpl.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.InsightCreatedCountRequestMessage; -import com.project.imdang.insight.service.domain.ports.output.publisher.InsightCreatedCountMessagePublisher; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class InsightCreatedCountMessagePublisherImpl implements InsightCreatedCountMessagePublisher { - - private final ApplicationEventPublisher applicationEventPublisher; - - @Override - public void publish(InsightCreatedCountRequestMessage insightCreatedCountRequestMessage) { - applicationEventPublisher.publishEvent(insightCreatedCountRequestMessage); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberAccusedResponseMessageListenerImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberAccusedResponseMessageListenerImpl.java deleted file mode 100644 index 6e3a55fc..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberAccusedResponseMessageListenerImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.MemberAccusedResponseMessage; -import com.project.imdang.insight.service.domain.ports.input.listener.MemberAccusedResponseMessageListener; -import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class MemberAccusedResponseMessageListenerImpl implements MemberAccusedResponseMessageListener { - - private final AccuseInsightMemberSaga accuseInsightMemberSaga; - - // TODO - vs TransactionalEventListener - @EventListener - @Override - public void updated(MemberAccusedResponseMessage memberAccusedResponseMessage) { - if (memberAccusedResponseMessage.isCompleted()) { - accuseInsightMemberSaga.process(memberAccusedResponseMessage); - } else { - accuseInsightMemberSaga.rollback(memberAccusedResponseMessage); - } - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberCouponCancelledResponseMessageListenerImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberCouponCancelledResponseMessageListenerImpl.java deleted file mode 100644 index eda41cc9..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberCouponCancelledResponseMessageListenerImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.MemberCouponCancelledResponseMessage; -import com.project.imdang.insight.service.domain.ports.input.listener.MemberCouponCancelledResponseMessageListener; -import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class MemberCouponCancelledResponseMessageListenerImpl implements MemberCouponCancelledResponseMessageListener { - - private final RejectExchangeRequestMemberCouponSaga rejectExchangeRequestMemberCouponSaga; - - // TODO - vs TransactionalEventListener - @EventListener - @Override - public void updated(MemberCouponCancelledResponseMessage memberCouponCancelledResponseMessage) { - if (memberCouponCancelledResponseMessage.isCompleted()) { - rejectExchangeRequestMemberCouponSaga.process(memberCouponCancelledResponseMessage); - } else { - rejectExchangeRequestMemberCouponSaga.rollback(memberCouponCancelledResponseMessage); - } - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberCouponUsedResponseMessageListenerImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberCouponUsedResponseMessageListenerImpl.java deleted file mode 100644 index c0acf55a..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberCouponUsedResponseMessageListenerImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.MemberCouponUsedResponseMessage; -import com.project.imdang.insight.service.domain.ports.input.listener.MemberCouponUsedResponseMessageListener; -import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class MemberCouponUsedResponseMessageListenerImpl implements MemberCouponUsedResponseMessageListener { - - private final RequestExchangeMemberCouponSaga requestExchangeMemberCouponSaga; - - // TODO - vs TransactionalEventListener - @EventListener - @Override - public void updated(MemberCouponUsedResponseMessage memberCouponUsedResponseMessage) { - if (memberCouponUsedResponseMessage.isCompleted()) { - requestExchangeMemberCouponSaga.process(memberCouponUsedResponseMessage); - } else { - requestExchangeMemberCouponSaga.rollback(memberCouponUsedResponseMessage); - } - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberSnapshotHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberSnapshotHelper.java deleted file mode 100644 index dd7e3c05..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/MemberSnapshotHelper.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.MemberSnapshot; -import com.project.imdang.insight.service.domain.exception.InsightDomainException; -import com.project.imdang.insight.service.domain.ports.output.repository.MemberSnapshotRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Optional; - -@Slf4j -@RequiredArgsConstructor -@Component -public class MemberSnapshotHelper { - - private final MemberSnapshotRepository memberSnapshotRepository; - - public Optional getByMemberIdAndInsightId(MemberId memberId, InsightId insightId) { - return memberSnapshotRepository.findByMemberIdAndInsightId(memberId, insightId); - } - - public MemberSnapshot save(MemberSnapshot memberSnapshot) { - MemberSnapshot saved = memberSnapshotRepository.save(memberSnapshot); - if (saved == null) { - String errorMessage = "Could not save memberSnapshot!"; - log.error(errorMessage); - throw new InsightDomainException(errorMessage); - } - log.info("memberSnapshot[id: {}] is saved.", saved.getId().getValue()); - return saved; - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RejectExchangeRequestMemberCouponSaga.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RejectExchangeRequestMemberCouponSaga.java deleted file mode 100644 index b5e22494..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RejectExchangeRequestMemberCouponSaga.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.MemberCouponCancelledResponseMessage; -import com.project.imdang.insight.service.domain.exception.InsightApplicationServiceException; -import com.project.imdang.saga.SagaStep; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import static com.project.imdang.domain.exception.ErrorCode.EXCHANGE_REQUEST_REJECT_FAILED; - -@Slf4j -@RequiredArgsConstructor -@Component -public class RejectExchangeRequestMemberCouponSaga implements SagaStep { - - @Override - public void process(MemberCouponCancelledResponseMessage response) { - log.info("MemberCoupon[id: {}] cancelled.", response.getMemberCouponId()); - } - - @Override - public void rollback(MemberCouponCancelledResponseMessage response) { - throw new InsightApplicationServiceException(EXCHANGE_REQUEST_REJECT_FAILED); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RequestExchangeMemberCouponSaga.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RequestExchangeMemberCouponSaga.java deleted file mode 100644 index 4f92ef09..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/RequestExchangeMemberCouponSaga.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.domain.message.MemberCouponUsedResponseMessage; -import com.project.imdang.insight.service.domain.exception.InsightApplicationServiceException; -import com.project.imdang.saga.SagaStep; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import static com.project.imdang.domain.exception.ErrorCode.EXCHANGE_REQUEST_FAILED; - -@Slf4j -@RequiredArgsConstructor -@Component -public class RequestExchangeMemberCouponSaga implements SagaStep { - - // memberCoupon "USED" 처리 완료 - @Override - public void process(MemberCouponUsedResponseMessage response) { - log.info("MemberCoupon[id: {}] used.", response.getMemberCouponId()); - } - - // memberCoupon "USED" 처리 실패 - @Override - public void rollback(MemberCouponUsedResponseMessage response) { - throw new InsightApplicationServiceException(EXCHANGE_REQUEST_FAILED); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/SnapshotHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/SnapshotHelper.java deleted file mode 100644 index ba510558..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/SnapshotHelper.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.exception.InsightDomainException; -import com.project.imdang.insight.service.domain.ports.output.repository.SnapshotRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@RequiredArgsConstructor -@Component -public class SnapshotHelper { - - private final SnapshotRepository snapshotRepository; - - public Snapshot save(Snapshot snapshot) { - Snapshot saved = snapshotRepository.save(snapshot); - if (saved == null) { - String errorMessage = "Could not save snapshot!"; - log.error(errorMessage); - throw new InsightDomainException(errorMessage); - } - log.info("Snapshot[id: {}] is saved.", saved.getId().getValue()); - return saved; - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/UploadImageHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/UploadImageHelper.java deleted file mode 100644 index f270ae50..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/UploadImageHelper.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.project.imdang.insight.service.domain.handler; - -import com.project.imdang.insight.service.domain.ports.output.file.FileService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; - -@Slf4j -@RequiredArgsConstructor -@Component -public class UploadImageHelper { - - private static final String DIRECTORY = "image"; - - private final FileService fileService; - - public String uploadImage(MultipartFile image) { - - if (image == null || image.isEmpty()) { - return null; - } - - try { - return fileService.upload(DIRECTORY, image); - } catch (IOException e) { - String errorMessage = "Failed to upload image!"; - log.error(errorMessage); - // TODO - 예외 처리 - throw new RuntimeException(errorMessage); - } - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/AcceptExchangeRequestCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/AcceptExchangeRequestCommandHandler.java deleted file mode 100644 index c70aeed9..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/AcceptExchangeRequestCommandHandler.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.exchange; - -import com.project.imdang.domain.message.ExchangeRequestAcceptedCountRequestMessage; -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.event.EventProcessor; -import com.project.imdang.insight.service.domain.ExchangeDomainService; -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestResponse; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.entity.MemberSnapshot; -import com.project.imdang.insight.service.domain.event.ExchangeRequestAcceptedEvent; -import com.project.imdang.insight.service.domain.handler.ExchangeRequestHelper; -import com.project.imdang.insight.service.domain.handler.MemberSnapshotHelper; -import com.project.imdang.insight.service.domain.mapper.ExchangeRequestDataMapper; -import com.project.imdang.insight.service.domain.ports.output.publisher.ExchangeRequestAcceptedCountMessagePublisher; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@RequiredArgsConstructor -@Component -public class AcceptExchangeRequestCommandHandler { - - private final ExchangeDomainService exchangeDomainService; - private final ExchangeRequestHelper exchangeRequestHelper; - private final ExchangeRequestDataMapper exchangeRequestDataMapper; - - private final MemberSnapshotHelper memberSnapshotHelper; - private final ExchangeRequestAcceptedCountMessagePublisher exchangeRequestAcceptedCountMessagePublisher; - private final EventProcessor eventProcessor; - - @Transactional - public AcceptExchangeRequestResponse acceptExchangeRequest( - AcceptExchangeRequestCommand acceptExchangeRequestCommand) { - ExchangeRequestId exchangeRequestId = new ExchangeRequestId( - acceptExchangeRequestCommand.getExchangeRequestId()); - ExchangeRequest exchangeRequest = exchangeRequestHelper.get(exchangeRequestId); - - // validation check - if (!exchangeRequest.getRequestedMemberId().getValue() - .equals(acceptExchangeRequestCommand.getRequestedMemberId())) { - throw new IllegalArgumentException(); - } - /* - * if (exchangeRequest.getMemberCouponId() != null) { - * MemberCouponId memberCouponId = exchangeRequest.getMemberCouponId(); - * exchangeRequestAcceptedRequestMessagePublisher.publish( - * new ExchangeRequestAcceptedRequestMessage(memberCouponId.getValue())); - * } - */ - - ExchangeRequestAcceptedEvent exchangeRequestAcceptedEvent = exchangeDomainService - .acceptExchangeRequest(exchangeRequest); - // publish event - ExchangeRequestAcceptedCountRequestMessage event = new ExchangeRequestAcceptedCountRequestMessage( - exchangeRequest.getRequestMemberId().getValue()); - exchangeRequestAcceptedCountMessagePublisher.publish(event); - eventProcessor.process(exchangeRequestAcceptedEvent); - - log.info("ExchangeRequest[id: {}] is accepted.", exchangeRequest.getId().getValue()); - ExchangeRequest saved = exchangeRequestHelper.save(exchangeRequestAcceptedEvent.getExchangeRequest()); - - MemberSnapshot requestMemberSnapshot = MemberSnapshot.builder() - .memberId(exchangeRequest.getRequestMemberId()) - .snapshotId(exchangeRequest.getRequestedSnapshotId()) - .insightId(exchangeRequest.getRequestedInsightId()) - .exchangeRequestId(saved.getId()) - // TODO - CHECK - .createdAt(exchangeRequestAcceptedEvent.getCreatedAt()) - .build(); - memberSnapshotHelper.save(requestMemberSnapshot); - - if (exchangeRequest.getRequestMemberSnapshotId() != null) { - MemberSnapshot requestedMemberSnapshot = MemberSnapshot.builder() - .memberId(exchangeRequest.getRequestedMemberId()) - .snapshotId(exchangeRequest.getRequestMemberSnapshotId()) - .insightId(exchangeRequest.getRequestMemberInsightId()) - .exchangeRequestId(saved.getId()) - // TODO - CHECK - .createdAt(exchangeRequestAcceptedEvent.getCreatedAt()) - .build(); - memberSnapshotHelper.save(requestedMemberSnapshot); - } - - return exchangeRequestDataMapper.exchangeRequestToAcceptExchangeRequestResponse(saved); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/ListExchangeRequestedByMeHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/ListExchangeRequestedByMeHandler.java deleted file mode 100644 index ed9328a8..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/ListExchangeRequestedByMeHandler.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.exchange; - -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.exchange.list.ListExchangeRequestedByMeQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.repository.ExchangeRequestRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListExchangeRequestedByMeHandler { - - private final ExchangeRequestRepository exchangeRequestRepository; - private final InsightRepository insightRepository; - private final InsightDataMapper insightDataMapper; - - private final InsightMemberLookup insightMemberLookup; - - @Transactional(readOnly = true) - public Page list(ListExchangeRequestedByMeQuery listExchangeRequestedByMeQuery) { - - UUID requestMemberId = listExchangeRequestedByMeQuery.getRequestMemberId(); - PageRequest pageRequest = PagingUtils.getPageRequest( - listExchangeRequestedByMeQuery.getPageNumber(), listExchangeRequestedByMeQuery.getPageSize(), - listExchangeRequestedByMeQuery.getDirection(), listExchangeRequestedByMeQuery.getProperties()); - ExchangeRequestStatus exchangeRequestStatus = listExchangeRequestedByMeQuery.getExchangeRequestStatus(); - Page paged - = exchangeRequestRepository.findAllByRequestMemberIdAndExchangeRequestStatus(new MemberId(requestMemberId), exchangeRequestStatus, pageRequest); - - List requestedInsightIds = paged.getContent().stream() - .map(ExchangeRequest::getRequestedInsightId) - .collect(Collectors.toList()); - List requestedInsights = insightRepository.findAllByIds(requestedInsightIds); - List insightResponses = getInsightResponses(requestedInsights); - return new PageImpl<>(insightResponses, paged.getPageable(), paged.getTotalElements()); - } - - private List getInsightResponses(List insights) { - Map memberNicknameMap = getMemberNicknameMap(insights); - return insights.stream().map(insight -> { - String memberNickname = memberNicknameMap.get(insight.getMemberId()); - return insightDataMapper.insightToInsightResponse(insight, memberNickname); - }).toList(); - } - - private Map getMemberNicknameMap(List insights) { - List memberIds = insights.stream() - .map(Insight::getMemberId) - .toList(); - return insightMemberLookup.lookupByMemberIds(memberIds).stream() - .collect(Collectors.toMap(MemberInfo::memberId, MemberInfo::nickname)); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/ListExchangeRequestedByOthersHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/ListExchangeRequestedByOthersHandler.java deleted file mode 100644 index 6584a3d3..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/ListExchangeRequestedByOthersHandler.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.exchange; - -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.exchange.list.ListExchangeRequestedByOthersQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.repository.ExchangeRequestRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.UUID; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListExchangeRequestedByOthersHandler { - - private final ExchangeRequestRepository exchangeRequestRepository; - private final InsightRepository insightRepository; - private final InsightDataMapper insightDataMapper; - - private final InsightMemberLookup insightMemberLookup; - - @Transactional(readOnly = true) - public Page list(ListExchangeRequestedByOthersQuery listExchangeRequestedByOthersQuery) { - - UUID requestedMemberId = listExchangeRequestedByOthersQuery.getRequestedMemberId(); - PageRequest pageRequest = PagingUtils.getPageRequest( - listExchangeRequestedByOthersQuery.getPageNumber(), listExchangeRequestedByOthersQuery.getPageSize(), - listExchangeRequestedByOthersQuery.getDirection(), listExchangeRequestedByOthersQuery.getProperties()); - - ExchangeRequestStatus exchangeRequestStatus = listExchangeRequestedByOthersQuery.getExchangeRequestStatus(); - Page paged - = exchangeRequestRepository.findAllByRequestedMemberIdAndExchangeRequestStatus(new MemberId(requestedMemberId), exchangeRequestStatus, pageRequest); - - List requestMemberInsightIds = paged.getContent().stream() - .map(ExchangeRequest::getRequestMemberInsightId) - .filter(Objects::nonNull) - .toList(); - List requestMemberInsights = insightRepository.findAllByIds(requestMemberInsightIds); - List insightResponses = getInsightResponses(requestMemberInsights); - return new PageImpl<>(insightResponses, paged.getPageable(), paged.getTotalElements()); - } - - private List getInsightResponses(List insights) { - Map memberNicknameMap = getMemberNicknameMap(insights); - return insights.stream().map(insight -> { - String memberNickname = memberNicknameMap.get(insight.getMemberId()); - return insightDataMapper.insightToInsightResponse(insight, memberNickname); - }).toList(); - } - - private Map getMemberNicknameMap(List insights) { - List memberIds = insights.stream() - .map(Insight::getMemberId) - .toList(); - return insightMemberLookup.lookupByMemberIds(memberIds).stream() - .collect(Collectors.toMap(MemberInfo::memberId, MemberInfo::nickname)); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/RejectExchangeRequestCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/RejectExchangeRequestCommandHandler.java deleted file mode 100644 index edf9a220..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/RejectExchangeRequestCommandHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.exchange; - -import com.project.imdang.domain.message.ExchangeRequestRejectedCountRequestMessage; -import com.project.imdang.domain.message.ExchangeRequestRejectedRequestMessage; -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.event.EventProcessor; -import com.project.imdang.insight.service.domain.ExchangeDomainService; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestResponse; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.event.ExchangeRequestRejectedEvent; -import com.project.imdang.insight.service.domain.handler.ExchangeRequestHelper; -import com.project.imdang.insight.service.domain.mapper.ExchangeRequestDataMapper; -import com.project.imdang.insight.service.domain.ports.output.publisher.ExchangeRequestRejectedCountMessagePublisher; -import com.project.imdang.insight.service.domain.ports.output.publisher.ExchangeRequestRejectedRequestMessagePublisher; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@RequiredArgsConstructor -@Component -public class RejectExchangeRequestCommandHandler { - // TODO - CHECK : 교환 요청/거절/승인 내역을 따로 저장해서 GROUP BY로 COUNT하는 방법 - // TODO - CHECK : 거절 횟수로 쿠폰 발급하는 것은 배치로? 비동기(kafka)? 로직에서 바로 처리 - // 교환 요청한 상대방의 rejectedCount + 1 → 횟수 비교해서 쿠폰 발급 - private final ExchangeDomainService exchangeDomainService; - private final ExchangeRequestHelper exchangeRequestHelper; - private final ExchangeRequestDataMapper exchangeRequestDataMapper; - - private final ExchangeRequestRejectedRequestMessagePublisher exchangeRequestRejectedRequestMessagePublisher; - private final ExchangeRequestRejectedCountMessagePublisher exchangeRequestRejectedCountMessagePublisher; - private final EventProcessor eventProcessor; - - @Transactional - public RejectExchangeRequestResponse rejectExchangeRequest( - RejectExchangeRequestCommand rejectExchangeRequestCommand) { - ExchangeRequestId exchangeRequestId = new ExchangeRequestId( - rejectExchangeRequestCommand.getExchangeRequestId()); - ExchangeRequest exchangeRequest = exchangeRequestHelper.get(exchangeRequestId); - - // validation check - if (!exchangeRequest.getRequestedMemberId().getValue() - .equals(rejectExchangeRequestCommand.getRequestedMemberId())) { - throw new IllegalArgumentException(); - } - - if (exchangeRequest.getMemberCouponId() != null) { - MemberCouponId memberCouponId = exchangeRequest.getMemberCouponId(); - exchangeRequestRejectedRequestMessagePublisher.publish( - new ExchangeRequestRejectedRequestMessage(memberCouponId.getValue())); - } - - // 거절 이벤트 횟수 카운트 발생 - ExchangeRequestRejectedEvent exchangeRequestRejectedEvent = exchangeDomainService - .rejectExchangeRequest(exchangeRequest); - - // 이벤트 publish (-> 비동기) - ExchangeRequestRejectedCountRequestMessage exchangeRequestRejectedCountRequestMessage = new ExchangeRequestRejectedCountRequestMessage( - exchangeRequestRejectedEvent.getExchangeRequest().getRequestMemberId().getValue()); - exchangeRequestRejectedCountMessagePublisher.publish(exchangeRequestRejectedCountRequestMessage); - eventProcessor.process(exchangeRequestRejectedEvent); - - log.info("ExchangeRequest[id: {}] is rejected.", exchangeRequest.getId().getValue()); - ExchangeRequest saved = exchangeRequestHelper.save(exchangeRequestRejectedEvent.getExchangeRequest()); - - return exchangeRequestDataMapper.exchangeRequestToRejectExchangeRequestResponse(saved); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/RequestExchangeCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/RequestExchangeCommandHandler.java deleted file mode 100644 index 9ea65f87..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/exchange/RequestExchangeCommandHandler.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.exchange; - -import com.project.imdang.domain.exception.ErrorCode; -import com.project.imdang.domain.message.ExchangeRequestCreatedRequestMessage; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.event.EventProcessor; -import com.project.imdang.insight.service.domain.ExchangeDomainService; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightCommand; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightResponse; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.event.ExchangeRequestByCouponCreatedEvent; -import com.project.imdang.insight.service.domain.event.ExchangeRequestCreatedEvent; -import com.project.imdang.insight.service.domain.exception.InsightApplicationServiceException; -import com.project.imdang.insight.service.domain.exception.SnapshotNotFoundException; -import com.project.imdang.insight.service.domain.handler.ExchangeRequestHelper; -import com.project.imdang.insight.service.domain.handler.InsightHelper; -import com.project.imdang.insight.service.domain.mapper.ExchangeRequestDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.publisher.ExchangeRequestCreatedRequestMessagePublisher; -import com.project.imdang.insight.service.domain.ports.output.repository.ExchangeRequestRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.SnapshotRepository; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; - -import static com.project.imdang.domain.exception.ErrorCode.MEMBER_15ACCUSED; -import static com.project.imdang.domain.exception.ErrorCode.MEMBER_5ACCUSED; -import static com.project.imdang.domain.exception.ErrorCode.MEMBER_NOT_EXIST; - - -@Slf4j -@RequiredArgsConstructor -@Component -public class RequestExchangeCommandHandler { - - private final ExchangeDomainService exchangeDomainService; - private final ExchangeRequestRepository exchangeRequestRepository; - private final ExchangeRequestDataMapper exchangeRequestDataMapper; - private final ExchangeRequestHelper exchangeRequestHelper; - private final InsightHelper insightHelper; - - private final SnapshotRepository snapshotRepository; - - private final InsightMemberLookup insightMemberLookup; - - private final ExchangeRequestCreatedRequestMessagePublisher exchangeRequestCreatedRequestMessagePublisher; - private final EventProcessor eventProcessor; - - @Transactional - public RequestExchangeInsightResponse requestExchange(RequestExchangeInsightCommand requestExchangeInsightCommand) { - - // 5회, 15회 누적 사용자 - 교환 신청/수락/거절 버튼 클릭 시 팝업 노출 - MemberId requestMemberId = new MemberId(requestExchangeInsightCommand.getRequestMemberId()); - checkMember(requestMemberId); - - InsightId requestedInsightId = new InsightId(requestExchangeInsightCommand.getRequestedInsightId()); - Insight requestedInsight = checkInsight(requestedInsightId); - - // 동일한 요청(수락/대기중) 내역 존재 시, 요청 불가 - exchangeRequestRepository.findByRequestMemberIdAndRequestedInsightId(requestMemberId, requestedInsightId).stream() - .filter(e -> !e.getStatus().equals(ExchangeRequestStatus.REJECTED)) - .findAny() - .ifPresent((e) -> { - throw new InsightApplicationServiceException(ErrorCode.ALREADY_EXCHANGE_REQUESTED); - }); - - ExchangeRequest saved; - if (requestExchangeInsightCommand.getRequestMemberInsightId() != null) { - - // 상호 교환 불가 - InsightId requestMemberInsightId = new InsightId(requestExchangeInsightCommand.getRequestMemberInsightId()); - checkInsight(requestMemberInsightId); - - exchangeRequestRepository.findByRequestMemberInsightIdAndRequestedInsightId(requestedInsightId, requestMemberInsightId).stream() - .filter(e -> !e.getStatus().equals(ExchangeRequestStatus.REJECTED)) - .findAny() - .ifPresent((e) -> { - throw new InsightApplicationServiceException(ErrorCode.ALREADY_EXCHANGE_REQUESTED); - }); - - // 쿠폰으로 요청된 이력이 있는 경우 - 요청 불가 - exchangeRequestRepository.findByRequestMemberIdAndRequestedInsightIdAndMemberCouponIsNotNull(requestedInsight.getMemberId(), requestMemberInsightId).stream() - .filter(e -> !e.getStatus().equals(ExchangeRequestStatus.REJECTED)) - .findAny() - .ifPresent((e) -> { - throw new InsightApplicationServiceException(ErrorCode.ALREADY_EXCHANGE_REQUESTED); - }); - - ExchangeRequest exchangeRequest = exchangeRequestDataMapper.requestExchangeInsightCommandToExchangeRequest(requestExchangeInsightCommand); - Snapshot requestedSnapshot = snapshotRepository.findLatestByInsightId(requestedInsightId) - .orElseThrow(() -> new SnapshotNotFoundException(requestedInsightId)); - Snapshot requestMemberSnapshot = snapshotRepository.findLatestByInsightId(requestMemberInsightId) - .orElseThrow(() -> new SnapshotNotFoundException(requestedInsightId)); - - ExchangeRequestCreatedEvent exchangeRequestCreatedEvent = exchangeDomainService.requestExchange(exchangeRequest, requestedSnapshot, requestMemberSnapshot); - saved = exchangeRequestHelper.save(exchangeRequestCreatedEvent.getExchangeRequest()); - eventProcessor.process(exchangeRequestCreatedEvent); - } else { - // 쿠폰 사용 - Assert.notNull(requestExchangeInsightCommand.getMemberCouponId(), "MemberCouponId must not be null!"); - MemberCouponId memberCouponId = new MemberCouponId(requestExchangeInsightCommand.getMemberCouponId()); - - // 인사이트로 요청된 이력이 있는 경우 - 요청 불가 - exchangeRequestRepository.findByRequestedMemberIdAndRequestMemberInsightId(requestMemberId, requestedInsightId).stream() - .filter(e -> !e.getStatus().equals(ExchangeRequestStatus.REJECTED)) - .findAny() - .ifPresent((e) -> { - throw new InsightApplicationServiceException(ErrorCode.ALREADY_EXCHANGE_REQUESTED); - }); - - // publish - exchangeRequestCreatedRequestMessagePublisher.publish( - new ExchangeRequestCreatedRequestMessage(memberCouponId.getValue())); - - ExchangeRequest exchangeRequest = exchangeRequestDataMapper.requestExchangeInsightCommandToExchangeRequest(requestExchangeInsightCommand); - Snapshot requestedSnapshot = snapshotRepository.findLatestByInsightId(requestedInsightId) - .orElseThrow(() -> new SnapshotNotFoundException(requestedInsightId)); - ExchangeRequestByCouponCreatedEvent exchangeRequestByCouponCreatedEvent = exchangeDomainService.requestExchangeWithCoupon(exchangeRequest, requestedSnapshot, memberCouponId); - saved = exchangeRequestHelper.save(exchangeRequestByCouponCreatedEvent.getExchangeRequest()); - eventProcessor.process(exchangeRequestByCouponCreatedEvent); - } - - return exchangeRequestDataMapper.exchangeRequestToRequestExchangeInsightResponse(saved); - } - - private void checkMember(MemberId requestMemberId) { - MemberInfo memberInfo = insightMemberLookup.lookupByMemberId(requestMemberId) - .orElseThrow(() -> new InsightApplicationServiceException(MEMBER_NOT_EXIST)); - - if (memberInfo.accusedCount() == 5) { - throw new InsightApplicationServiceException(MEMBER_5ACCUSED); - } else if (memberInfo.accusedCount() == 15) { - throw new InsightApplicationServiceException(MEMBER_15ACCUSED); - } - } - - private Insight checkInsight(InsightId insightId) { - return insightHelper.get(insightId); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/AccuseInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/AccuseInsightCommandHandler.java deleted file mode 100644 index c11ff6e1..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/AccuseInsightCommandHandler.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.message.InsightAccusedRequestMessage; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.InsightDomainService; -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightResponse; -import com.project.imdang.insight.service.domain.entity.Accuse; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.event.InsightAccusedEvent; -import com.project.imdang.insight.service.domain.exception.InsightApplicationServiceException; -import com.project.imdang.insight.service.domain.handler.AccuseHelper; -import com.project.imdang.insight.service.domain.handler.InsightHelper; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.publisher.InsightAccusedRequestMessagePublisher; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Optional; - -import static com.project.imdang.domain.exception.ErrorCode.ALREADY_ACCUSED; - - -@Slf4j -@RequiredArgsConstructor -@Component -public class AccuseInsightCommandHandler { - - private final InsightDomainService insightDomainService; - private final InsightHelper insightHelper; - private final InsightDataMapper insightDataMapper; - - private final AccuseHelper accuseHelper; - private final InsightAccusedRequestMessagePublisher insightAccusedRequestMessagePublisher; - - @Transactional - public AccuseInsightResponse accuseInsight(AccuseInsightCommand accuseInsightCommand) { - - MemberId accusedBy = new MemberId(accuseInsightCommand.getAccuseMemberId()); - InsightId accusedInsightId = new InsightId(accuseInsightCommand.getInsightId()); - - // accusedInsightId - memberId(accusedBy)로 중복 신고 여부 체크 - checkAlreadyAccused(accusedBy, accusedInsightId); - - Insight accusedInsight = insightHelper.get(accusedInsightId); - InsightAccusedEvent insightAccusedEvent = insightDomainService.accuseInsight(accusedInsight, accusedBy); - Insight savedInsight = insightHelper.save(insightAccusedEvent.getInsight()); - Accuse savedAccuse = accuseHelper.save(insightAccusedEvent.getAccuse()); - // publish - insightAccusedRequestMessagePublisher.publish(new InsightAccusedRequestMessage(savedAccuse.getAccusedMemberId().getValue())); - - log.info("Insight[id: {}] is accused by Member[id: {}].", savedInsight.getId().getValue(), savedAccuse.getAccuseMemberId().getValue()); - return insightDataMapper.insightToAccuseInsightResponse(savedInsight); - } - - private void checkAlreadyAccused(MemberId accusedBy, InsightId accusedInsightId) { - Optional optional = accuseHelper.getByAccuseMemberIdAndAccusedInsightId(accusedBy, accusedInsightId); - if (optional.isPresent()) { - throw new InsightApplicationServiceException(ALREADY_ACCUSED); - } - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/CreateInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/CreateInsightCommandHandler.java deleted file mode 100644 index 8c47b04f..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/CreateInsightCommandHandler.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.message.InsightCreatedCountRequestMessage; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.InsightDomainService; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightResponse; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.MemberSnapshot; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.handler.InsightHelper; -import com.project.imdang.insight.service.domain.handler.MemberSnapshotHelper; -import com.project.imdang.insight.service.domain.handler.SnapshotHelper; -import com.project.imdang.insight.service.domain.handler.UploadImageHelper; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.publisher.InsightCreatedCountMessagePublisher; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@RequiredArgsConstructor -@Component -public class CreateInsightCommandHandler { - - private final InsightDomainService insightDomainService; - private final InsightHelper insightHelper; - private final InsightDataMapper insightDataMapper; - - private final SnapshotHelper snapshotHelper; - private final MemberSnapshotHelper memberSnapshotHelper; - - - private final InsightCreatedCountMessagePublisher insightCreatedCountMessagePublisher; - private final UploadImageHelper uploadImageHelper; - - @Transactional - public CreateInsightResponse createInsight(CreateInsightCommand createInsightCommand) { - Insight insight = insightDataMapper.createInsightCommandToInsight(createInsightCommand); - // TODO - CHECK : event - - String mainImage = uploadImageHelper.uploadImage(createInsightCommand.getMainImage()); - Insight created = insightDomainService.createInsight(insight, mainImage); - - Insight saved = insightHelper.save(created); - InsightCreatedCountRequestMessage event = new InsightCreatedCountRequestMessage(saved.getMemberId().getValue()); - insightCreatedCountMessagePublisher.publish(event); - log.info("Insight[id: {}] is created.", saved.getId().getValue()); - - // TODO : event - // TODO : InsightCreatedEvent - Snapshot snapshot = insightDomainService.captureInsight(saved); - // TODO : snapshotDomainService(?) - Snapshot savedSnapshot = snapshotHelper.save(snapshot); - - // memberSnapshot에 insert - MemberSnapshot memberSnapshot = MemberSnapshot.builder() - .memberId(new MemberId(createInsightCommand.getMemberId())) - .snapshotId(new SnapshotId(savedSnapshot.getId().getValue())) - .insightId(new InsightId(savedSnapshot.getInsightId().getValue())) - .createdAt(created.getCreatedAt()) - .build(); - memberSnapshotHelper.save(memberSnapshot); - - return insightDataMapper.insightToCreateInsightResponse(insight); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/DeleteInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/DeleteInsightCommandHandler.java deleted file mode 100644 index 4e3fd6d1..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/DeleteInsightCommandHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.InsightDomainService; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightResponse; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.event.InsightDeletedEvent; -import com.project.imdang.insight.service.domain.handler.InsightHelper; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@RequiredArgsConstructor -@Component -public class DeleteInsightCommandHandler { - private final InsightDomainService insightDomainService; - private final InsightHelper insightHelper; - private final InsightDataMapper insightDataMapper; - - @Transactional - public DeleteInsightResponse deleteInsight(DeleteInsightCommand deleteInsightCommand) { - InsightId insightId = new InsightId(deleteInsightCommand.getInsightId()); - Insight insight = insightHelper.get(insightId); - - // validation - MemberId deletedBy = new MemberId(deleteInsightCommand.getMemberId()); - InsightDeletedEvent insightDeletedEvent = insightDomainService.deleteInsight(insight, deletedBy); - insightHelper.save(insightDeletedEvent.getInsight()); - log.info("Insight[id: {}] is deleted.", insightDeletedEvent.getInsight().getId().getValue()); - // TODO - publish event - return insightDataMapper.insightToDeleteInsightResponse(insightDeletedEvent.getInsight()); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/DetailInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/DetailInsightCommandHandler.java deleted file mode 100644 index 12e3a84e..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/DetailInsightCommandHandler.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightResponse; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.exception.InsightApplicationServiceException; -import com.project.imdang.insight.service.domain.exception.InsightNotFoundException; -import com.project.imdang.insight.service.domain.exception.SnapshotNotFoundException; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.mapper.SnapshotDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.repository.AccuseRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.ExchangeRequestRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.RecommendRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.SnapshotRepository; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; - -import static com.project.imdang.domain.exception.ErrorCode.MEMBER_NOT_EXIST; - -@Slf4j -@RequiredArgsConstructor -@Component -public class DetailInsightCommandHandler { - - private final InsightRepository insightRepository; - private final InsightDataMapper insightDataMapper; - private final ExchangeRequestRepository exchangeRequestRepository; - private final SnapshotRepository snapshotRepository; - private final SnapshotDataMapper snapshotDataMapper; - - private final RecommendRepository recommendRepository; - private final AccuseRepository accuseRepository; - - private final InsightMemberLookup insightMemberLookup; - - // PENDING + 누가 요청한 것인가? - // 교환 요청을 받았으나 아직 수락하지 않은 상태 - // 교환 요청을 했으나 상대방이 아직 수락하지 않은 상태 - - // 등록, 수정할 때마다 snapshot 생성 - // 가장 최신 버전의 snapshot 데이터로 보여주기 - // TODO - CHECK : 조회 수 증가 - // 본인의 인사이트, 교환하지 않은 타인의 인사이트, 교환한(수정된/수정 안 된) 타인의 인사이트 - @Transactional(readOnly = true) - public DetailInsightResponse detailInsight(DetailInsightQuery detailInsightQuery) { - - InsightId insightId = new InsightId(detailInsightQuery.getInsightId()); - - Optional insightResult = insightRepository.findById(insightId); - if (insightResult.isPresent()) { - Insight insight = insightResult.get(); - - UUID memberId = detailInsightQuery.getMemberId(); - if (Objects.isNull(memberId)) { - // TODO : requestedBy == null인 경우(로그인 X) - - } else { - - MemberId requestedBy = new MemberId(memberId); - boolean recommended = recommendRepository.findByRecommendMemberIdAndRecommendedInsightId(requestedBy, insightId).isPresent(); - boolean accused = accuseRepository.findByAccuseMemberIdAndAccusedInsightId(requestedBy, insightId).isPresent(); - MemberId insightCreatedBy = insight.getMemberId(); - MemberInfo memberInfo = insightMemberLookup.lookupByMemberId(insightCreatedBy) - .orElseThrow(() -> new InsightApplicationServiceException(MEMBER_NOT_EXIST)); - String memberNickname = memberInfo.nickname(); - - // 본인의 인사이트 - if (insightCreatedBy.equals(requestedBy)) { - return insightDataMapper.insightToDetailInsightResponse( - insight, memberNickname, recommended, accused, null, null, null, Boolean.TRUE); - } else { - // 타인의 인사이트 - - // 교환 신청 여부 확인 - // 1) 로그인 유저(requestedBy)가 교환 요청을 한 경우 - // exchangeRequestCreatedByMe - List requestList = exchangeRequestRepository.findByRequestMemberIdAndRequestedInsightId(requestedBy, insightId); - if (!requestList.isEmpty()) { - - List acceptedList = requestList.stream() - .filter(exchangeRequestCreatedByMe -> ExchangeRequestStatus.ACCEPTED.equals(exchangeRequestCreatedByMe.getStatus())) - .toList(); - if (acceptedList.size() > 1) { - throw new IllegalStateException("ACCEPTED ExchangeRequest cannot be more than one!"); - } - if (acceptedList.size() == 1) { - ExchangeRequest accepted = acceptedList.get(0); - SnapshotId snapshotId = accepted.getRequestedSnapshotId(); - Snapshot snapshot = snapshotRepository.findById(snapshotId) - .orElseThrow(() -> new SnapshotNotFoundException(snapshotId)); - Integer recommendedCount = insight.getRecommendedCount(); - Integer accusedCount = insight.getAccusedCount(); - Integer viewCount = insight.getViewCount(); - return snapshotDataMapper.snapshotToDetailInsightResponse( - snapshot, - memberNickname, - recommended, - accused, - recommendedCount, - accusedCount, - viewCount, - ExchangeRequestStatus.ACCEPTED, - Boolean.TRUE, - null, - Boolean.FALSE); - } else { - - List pendingList = requestList.stream() - .filter(exchangeRequestCreatedByMe -> ExchangeRequestStatus.PENDING.equals(exchangeRequestCreatedByMe.getStatus())) - .toList(); - if (pendingList.size() > 1) { - throw new IllegalStateException("PENDING ExchangeRequest cannot be more than one!"); - } - if (pendingList.size() == 1) { - ExchangeRequest pending = pendingList.get(0); - return insightDataMapper.insightToDetailInsightResponse( - insight, memberNickname, recommended, accused, ExchangeRequestStatus.PENDING, Boolean.TRUE, pending.getId(), Boolean.FALSE) - .toPreviewInsightResponse(); - } else { - - List rejectedList = requestList.stream() - .filter(exchangeRequestCreatedByMe -> ExchangeRequestStatus.REJECTED.equals(exchangeRequestCreatedByMe.getStatus())) - .toList(); - if (rejectedList.isEmpty()) { - throw new IllegalStateException("REJECTED ExchangeRequest should be more than zero!"); - } - return insightDataMapper.insightToDetailInsightResponse( - insight, memberNickname, recommended, accused, ExchangeRequestStatus.REJECTED, Boolean.TRUE, null, Boolean.FALSE) - .toPreviewInsightResponse(); - - } - } - - } else { - - // 2) 로그인 유저가 교환 요청을 받은 경우 - List requestedList = - exchangeRequestRepository.findByRequestedMemberIdAndMemberCouponIdAndRequestMemberInsightId(requestedBy, null, insightId); - if (!requestedList.isEmpty()) { - - List acceptedList = requestedList.stream() - .filter(exchangeRequestCreatedByOther -> ExchangeRequestStatus.ACCEPTED.equals(exchangeRequestCreatedByOther.getStatus())) - .toList(); - if (acceptedList.size() > 1) { - throw new IllegalStateException("ACCEPTED ExchangeRequest cannot be more than one!"); - } - - if (acceptedList.size() == 1) { - ExchangeRequest accepted = acceptedList.get(0); - SnapshotId snapshotId = accepted.getRequestMemberSnapshotId(); - Snapshot snapshot = snapshotRepository.findById(snapshotId) - .orElseThrow(() -> new SnapshotNotFoundException(snapshotId)); - Integer recommendedCount = insight.getRecommendedCount(); - Integer accusedCount = insight.getAccusedCount(); - Integer viewCount = insight.getViewCount(); - return snapshotDataMapper.snapshotToDetailInsightResponse( - snapshot, - memberNickname, - recommended, - accused, - recommendedCount, - accusedCount, - viewCount, - ExchangeRequestStatus.ACCEPTED, - Boolean.FALSE, - null, - Boolean.FALSE); - } else { - - List pendingList = requestedList.stream() - .filter(exchangeRequestCreatedByOther -> ExchangeRequestStatus.PENDING.equals(exchangeRequestCreatedByOther.getStatus())) - .toList(); - if (pendingList.size() > 1) { - throw new IllegalStateException("PENDING ExchangeRequest cannot be more than one!"); - } - if (pendingList.size() == 1) { - ExchangeRequest pending = pendingList.get(0); - return insightDataMapper.insightToDetailInsightResponse( - insight, - memberNickname, - recommended, - accused, - ExchangeRequestStatus.PENDING, - Boolean.FALSE, - pending.getId(), - Boolean.FALSE) - .toPreviewInsightResponse(); - } else { - - List rejectedList = requestedList.stream() - .filter(exchangeRequestCreatedByMe -> ExchangeRequestStatus.REJECTED.equals(exchangeRequestCreatedByMe.getStatus())) - .toList(); - if (rejectedList.isEmpty()) { - throw new IllegalStateException("REJECTED ExchangeRequest should be more than zero!"); - } - return insightDataMapper.insightToDetailInsightResponse( - insight, - memberNickname, - recommended, - accused, - ExchangeRequestStatus.REJECTED, - Boolean.FALSE, - null, - Boolean.FALSE) - .toPreviewInsightResponse(); - } - } - } else { - // 교환 신청 X - 교환 완료해야 추천 가능 - return insightDataMapper.insightToDetailInsightResponse( - insight, memberNickname, recommended, accused, null, null, null, Boolean.FALSE) - .toPreviewInsightResponse(); - } - } - } - } - - } - throw new InsightNotFoundException(insightId); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByApartmentComplexCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByApartmentComplexCommandHandler.java deleted file mode 100644 index 2ae87cf5..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByApartmentComplexCommandHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByApartmentComplexQuery; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListInsightByApartmentComplexCommandHandler { - - private final InsightRepository insightRepository; - private final InsightDataMapper insightDataMapper; - - private final InsightMemberLookup insightMemberLookup; - - @Transactional(readOnly = true) - public Page listInsightByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery) { - PageRequest pageRequest = PagingUtils.getPageRequest( - listInsightByApartmentComplexQuery.getPageNumber(), listInsightByApartmentComplexQuery.getPageSize(), listInsightByApartmentComplexQuery.getDirection(), listInsightByApartmentComplexQuery.getProperties()); - ApartmentComplex apartmentComplex = ApartmentComplex.builder() - .name(listInsightByApartmentComplexQuery.getApartmentComplexName()) - .build(); - - Page paged = insightRepository.findAllByApartmentComplex(apartmentComplex, pageRequest); - Map memberNicknameMap = getMemberNicknameMap(paged.getContent()); - return paged.map(insight -> { - String memberNickname = memberNicknameMap.get(insight.getMemberId()); - return insightDataMapper.insightToInsightResponse(insight, memberNickname); - }); - } - - private Map getMemberNicknameMap(List insights) { - List memberIds = insights.stream() - .map(Insight::getMemberId) - .toList(); - return insightMemberLookup.lookupByMemberIds(memberIds).stream() - .collect(Collectors.toMap(MemberInfo::memberId, MemberInfo::nickname)); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByDateCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByDateCommandHandler.java deleted file mode 100644 index 474e74f2..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByDateCommandHandler.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByDateQuery; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListInsightByDateCommandHandler { - - private final InsightRepository insightRepository; - private final InsightDataMapper insightDataMapper; - - private final InsightMemberLookup insightMemberLookup; - - @Transactional(readOnly = true) - public Page listInsightByDate(ListInsightByDateQuery listInsightByDateQuery) { - PageRequest pageRequest = PagingUtils.getPageRequest( - listInsightByDateQuery.getPageNumber(), listInsightByDateQuery.getPageSize(), listInsightByDateQuery.getDirection(), listInsightByDateQuery.getProperties()); - - Page paged = insightRepository.findAllByDate(listInsightByDateQuery.getDate(), pageRequest); - Map memberNicknameMap = getMemberNicknameMap(paged.getContent()); - return paged.map(insight -> { - String memberNickname = memberNicknameMap.get(insight.getMemberId()); - return insightDataMapper.insightToInsightResponse(insight, memberNickname); - }); - } - - private Map getMemberNicknameMap(List insights) { - List memberIds = insights.stream() - .map(Insight::getMemberId) - .toList(); - List memberInfos = insightMemberLookup.lookupByMemberIds(memberIds); - return memberInfos.stream() - .collect(Collectors.toMap(MemberInfo::memberId, MemberInfo::nickname)); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByDistrictCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByDistrictCommandHandler.java deleted file mode 100644 index 65f8f6fd..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightByDistrictCommandHandler.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByDistrictQuery; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.valueobject.District; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListInsightByDistrictCommandHandler { - - private final InsightRepository insightRepository; - private final InsightDataMapper insightDataMapper; - - private final InsightMemberLookup insightMemberLookup; - - @Transactional(readOnly = true) - public Page listInsightByDistrict(ListInsightByDistrictQuery listInsightByDistrictQuery) { - PageRequest pageRequest = PagingUtils.getPageRequest( - listInsightByDistrictQuery.getPageNumber(), listInsightByDistrictQuery.getPageSize(), listInsightByDistrictQuery.getDirection(), listInsightByDistrictQuery.getProperties()); - - District district = District.builder() - .siDo(listInsightByDistrictQuery.getSiDo()) - .siGunGu(listInsightByDistrictQuery.getSiGunGu()) - .eupMyeonDong(listInsightByDistrictQuery.getEupMyeonDong()) - .build(); - Page paged = insightRepository.findAllByDistrict(district, pageRequest); - Map memberNicknameMap = getMemberNicknameMap(paged.getContent()); - return paged.map(insight -> { - String memberNickname = memberNicknameMap.get(insight.getMemberId()); - return insightDataMapper.insightToInsightResponse(insight, memberNickname); - }); - } - - private Map getMemberNicknameMap(List insights) { - List memberIds = insights.stream() - .map(Insight::getMemberId) - .toList(); - return insightMemberLookup.lookupByMemberIds(memberIds).stream() - .collect(Collectors.toMap(MemberInfo::memberId, MemberInfo::nickname)); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightCommandHandler.java deleted file mode 100644 index 4ba7a701..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListInsightCommandHandler.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightQuery; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListInsightCommandHandler { - - private final InsightRepository insightRepository; - private final InsightDataMapper insightDataMapper; - - private final InsightMemberLookup insightMemberLookup; - - @Transactional(readOnly = true) - public Page listInsight(ListInsightQuery listInsightQuery) { - PageRequest pageRequest = PagingUtils.getPageRequest( - listInsightQuery.getPageNumber(), listInsightQuery.getPageSize(), listInsightQuery.getDirection(), listInsightQuery.getProperties()); - - Page paged = insightRepository.findAll(pageRequest); - Map memberNicknameMap = getMemberNicknameMap(paged.getContent()); - return paged.map(insight -> { - String memberNickname = memberNicknameMap.get(insight.getMemberId()); - return insightDataMapper.insightToInsightResponse(insight, memberNickname); - }); - } - - private Map getMemberNicknameMap(List insights) { - List memberIds = insights.stream() - .map(Insight::getMemberId) - .toList(); - return insightMemberLookup.lookupByMemberIds(memberIds).stream() - .collect(Collectors.toMap(MemberInfo::memberId, MemberInfo::nickname)); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightApartmentComplexByDistrictCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightApartmentComplexByDistrictCommandHandler.java deleted file mode 100644 index 5c79a26b..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightApartmentComplexByDistrictCommandHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.list.ApartmentComplexResponse; -import com.project.imdang.insight.service.domain.ports.output.repository.MemberSnapshotRepository; -import com.project.imdang.insight.service.domain.valueobject.District; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListMyInsightApartmentComplexByDistrictCommandHandler { - - private final MemberSnapshotRepository memberSnapshotRepository; - - @Transactional(readOnly = true) - public List listMyInsightApartmentComplexByDistrict(UUID _memberId, District district) { - MemberId memberId = new MemberId(_memberId); - List results = memberSnapshotRepository.findAllDistinctApartmentComplexAndInsightCountByMemberIdAndDistrict(memberId, district); - return results.stream() - .map(result -> ApartmentComplexResponse.builder() - .apartmentComplexName((String) result[0]) - .insightCount((Long) result[1]) - .build()) - .collect(Collectors.toList()); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightCommandHandler.java deleted file mode 100644 index 3d2f841a..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightCommandHandler.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListMyInsightQuery; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.MemberSnapshot; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.mapper.SnapshotDataMapper; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.MemberSnapshotRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.SnapshotRepository; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListMyInsightCommandHandler { - - private final MemberSnapshotRepository memberSnapshotRepository; - private final SnapshotRepository snapshotRepository; - private final SnapshotDataMapper snapshotDataMapper; - - private final InsightRepository insightRepository; - private final InsightMemberLookup insightMemberLookup; - - @Transactional(readOnly = true) - public Page listMyInsight(ListMyInsightQuery listMyInsightQuery) { - - PageRequest pageRequest = PagingUtils.getPageRequest( - listMyInsightQuery.getPageNumber(), listMyInsightQuery.getPageSize(), listMyInsightQuery.getDirection(), listMyInsightQuery.getProperties()); - MemberId memberId = new MemberId(listMyInsightQuery.getMemberId()); - Boolean onlyMine = listMyInsightQuery.getOnlyMine(); - - // TODO - CHECK : EntityGraph - Page paged; - if (listMyInsightQuery.getApartmentComplexName() != null) { - // 단지별 보기 - ApartmentComplex apartmentComplex - = new ApartmentComplex(listMyInsightQuery.getApartmentComplexName()); - - if (Boolean.TRUE.equals(onlyMine)) { - paged = memberSnapshotRepository.findAllByMemberIdAndApartmentComplexAndSnapshotMemberId(memberId, apartmentComplex, memberId, pageRequest); - } else { - paged = memberSnapshotRepository.findAllByMemberIdAndApartmentComplex(memberId, apartmentComplex, pageRequest); - } - } else { - - if (Boolean.TRUE.equals(onlyMine)) { - paged = memberSnapshotRepository.findAllByMemberIdAndDistrictAndSnapshotMemberId(memberId, listMyInsightQuery.getDistrict(), memberId, pageRequest); - } else { - paged = memberSnapshotRepository.findAllByMemberIdAndDistrict(memberId, listMyInsightQuery.getDistrict(), pageRequest); - } - } - - List snapshotIds = paged.getContent().stream() - .map(MemberSnapshot::getSnapshotId) - .toList(); - List snapshots = snapshotRepository.findAllByIds(snapshotIds); - List insightResponses = getInsightResponses(snapshots); - return new PageImpl<>(insightResponses, paged.getPageable(), paged.getTotalElements()); - } - - private List getInsightResponses(List snapshots) { - Map memberNicknameMap = getMemberNicknameMap(snapshots); - Map recommendedCountMap = getRecommendedCountMap(snapshots); - return snapshots.stream().map(snapshot -> { - String memberNickname = memberNicknameMap.get(snapshot.getMemberId()); - Integer recommendedCount = recommendedCountMap.get(snapshot.getInsightId()); - return snapshotDataMapper.snapshotToInsightResponse(snapshot, memberNickname, recommendedCount); - }).toList(); - } - - private Map getRecommendedCountMap(List snapshots) { - List insightIds = snapshots.stream() - .map(Snapshot::getInsightId) - .toList(); - return insightRepository.findAllByIds(insightIds).stream() - .collect(Collectors.toMap(Insight::getId, Insight::getRecommendedCount)); - } - - private Map getMemberNicknameMap(List snapshots) { - List memberIds = snapshots.stream() - .map(Snapshot::getMemberId) - .toList(); - return insightMemberLookup.lookupByMemberIds(memberIds).stream() - .collect(Collectors.toMap(MemberInfo::memberId, MemberInfo::nickname)); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightCreatedByMeCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightCreatedByMeCommandHandler.java deleted file mode 100644 index 44c8d8e2..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/ListMyInsightCreatedByMeCommandHandler.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightSimpleResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.MemberSnapshot; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.mapper.SnapshotDataMapper; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.MemberSnapshotRepository; -import com.project.imdang.insight.service.domain.ports.output.repository.SnapshotRepository; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Slf4j -@RequiredArgsConstructor -@Component -public class ListMyInsightCreatedByMeCommandHandler { - - private final MemberSnapshotRepository memberSnapshotRepository; - private final SnapshotRepository snapshotRepository; - private final SnapshotDataMapper snapshotDataMapper; - - private final InsightRepository insightRepository; - - @Transactional(readOnly = true) - public Page listMyInsightCreatedByMe(ListMyInsightCreatedByMeQuery listMyInsightCreatedByMeQuery) { - - PageRequest pageRequest = PagingUtils.getPageRequest( - listMyInsightCreatedByMeQuery.getPageNumber(), listMyInsightCreatedByMeQuery.getPageSize(), listMyInsightCreatedByMeQuery.getDirection(), listMyInsightCreatedByMeQuery.getProperties()); - - MemberId memberId = new MemberId(listMyInsightCreatedByMeQuery.getMemberId()); - Page paged = memberSnapshotRepository.findAllByMemberIdAndSnapshotMemberId(memberId, memberId, pageRequest); - - List snapshotIds = paged.getContent().stream() - .map(MemberSnapshot::getSnapshotId) - .toList(); - List snapshots = snapshotRepository.findAllByIds(snapshotIds); - List insightSimpleResponses = getInsightResponses(snapshots); - return new PageImpl<>(insightSimpleResponses, paged.getPageable(), paged.getTotalElements()); - } - - private List getInsightResponses(List snapshots) { - Map recommendedCountMap = getRecommendedCountMap(snapshots); - return snapshots.stream() - .map(snapshot -> { - Integer recommendedCount = recommendedCountMap.get(snapshot.getInsightId()); - return snapshotDataMapper.snapshotToInsightSimpleResponse(snapshot, recommendedCount); - }).toList(); - } - - private Map getRecommendedCountMap(List snapshots) { - List insightIds = snapshots.stream() - .map(Snapshot::getInsightId) - .toList(); - return insightRepository.findAllByIds(insightIds).stream() - .collect(Collectors.toMap(Insight::getId, Insight::getRecommendedCount)); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/RecommendInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/RecommendInsightCommandHandler.java deleted file mode 100644 index 919696a7..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/RecommendInsightCommandHandler.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.InsightDomainService; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightResponse; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.Recommend; -import com.project.imdang.insight.service.domain.event.InsightRecommendedEvent; -import com.project.imdang.insight.service.domain.exception.InsightApplicationServiceException; -import com.project.imdang.insight.service.domain.handler.InsightHelper; -import com.project.imdang.insight.service.domain.handler.MemberSnapshotHelper; -import com.project.imdang.insight.service.domain.handler.RecommendHelper; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Optional; - -import static com.project.imdang.domain.exception.ErrorCode.ALREADY_RECOMMENDED; -import static com.project.imdang.domain.exception.ErrorCode.EXCHANGE_REQUIRED; - -@Slf4j -@RequiredArgsConstructor -@Component -public class RecommendInsightCommandHandler { - - private final InsightDomainService insightDomainService; - private final InsightHelper insightHelper; - private final InsightDataMapper insightDataMapper; - - private final RecommendHelper recommendHelper; - private final MemberSnapshotHelper memberSnapshotHelper; - - @Transactional - public RecommendInsightResponse recommendInsight(RecommendInsightCommand recommendInsightCommand) { - - MemberId recommendedBy = new MemberId(recommendInsightCommand.getRecommendMemberId()); - InsightId recommendedInsightId = new InsightId(recommendInsightCommand.getInsightId()); - - // 교환 완료해야 상대방 인사이트 추천 가능 - // 교환하지 않은 상태에서 추천 클릭 시 "인사이트 교환해야 추천할 수 있어요" alert - // member_snapshot 확인 - checkExchangeCompleted(recommendedBy, recommendedInsightId); - - // recommendedInsightId - memberId(recommendedBy)로 중복 추천 여부 체크 - checkAlreadyRecommended(recommendedBy, recommendedInsightId); - - Insight recommendedInsight = insightHelper.get(recommendedInsightId); - InsightRecommendedEvent insightRecommendedEvent = insightDomainService.recommendInsight(recommendedInsight, recommendedBy); - Insight savedInsight = insightHelper.save(insightRecommendedEvent.getInsight()); - - Recommend savedRecommend = recommendHelper.save(insightRecommendedEvent.getRecommend()); - log.info("Insight[id: {}] is recommended by Member[id: {}].", savedInsight.getId().getValue(), savedRecommend.getRecommendMemberId().getValue()); - return insightDataMapper.insightToRecommendInsightResponse(savedInsight); - } - - private void checkExchangeCompleted(MemberId recommendedBy, InsightId insightId) { - memberSnapshotHelper.getByMemberIdAndInsightId(recommendedBy, insightId) - .orElseThrow(() -> new InsightApplicationServiceException(EXCHANGE_REQUIRED)); - } - - private void checkAlreadyRecommended(MemberId recommendedBy, InsightId recommendedInsightId) { - Optional optional = recommendHelper.getByRecommendMemberIdAndRecommendedInsightId(recommendedBy, recommendedInsightId); - if (optional.isPresent()) { - throw new InsightApplicationServiceException(ALREADY_RECOMMENDED); - } - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/UpdateInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/UpdateInsightCommandHandler.java deleted file mode 100644 index e0489cb9..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/handler/insight/UpdateInsightCommandHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.project.imdang.insight.service.domain.handler.insight; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.InsightDomainService; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightResponse; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.event.InsightUpdatedEvent; -import com.project.imdang.insight.service.domain.handler.InsightHelper; -import com.project.imdang.insight.service.domain.handler.SnapshotHelper; -import com.project.imdang.insight.service.domain.handler.UploadImageHelper; -import com.project.imdang.insight.service.domain.mapper.InsightDataMapper; -import com.project.imdang.insight.service.domain.ports.output.repository.MemberSnapshotRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@Slf4j -@RequiredArgsConstructor -@Component -public class UpdateInsightCommandHandler { - private final InsightDomainService insightDomainService; - private final InsightHelper insightHelper; - private final InsightDataMapper insightDataMapper; - - private final SnapshotHelper snapshotHelper; - private final MemberSnapshotRepository memberSnapshotRepository; - - private final UploadImageHelper uploadImageHelper; - - - @Transactional - public UpdateInsightResponse updateInsight(UpdateInsightCommand updateInsightCommand) { - InsightId insightId = new InsightId(updateInsightCommand.getInsightId()); - - // validation check - MemberId updatedBy = new MemberId(updateInsightCommand.getMemberId()); - Insight insight = insightHelper.get(insightId); - - String mainImage = uploadImageHelper.uploadImage(updateInsightCommand.getMainImage()); - InsightUpdatedEvent insightUpdatedEvent = insightDomainService.updateInsight( - insight, - updatedBy, - mainImage, - updateInsightCommand.getTitle(), - updateInsightCommand.getAddress(), - updateInsightCommand.getApartmentComplex(), - updateInsightCommand.getVisitAt(), - updateInsightCommand.getVisitTimes(), - updateInsightCommand.getVisitMethods(), - updateInsightCommand.getAccess(), - updateInsightCommand.getSummary(), - updateInsightCommand.getInfra(), - updateInsightCommand.getComplexEnvironment(), - updateInsightCommand.getComplexFacility(), - updateInsightCommand.getFavorableNews(), - updateInsightCommand.getScore()); - Insight updated = insightUpdatedEvent.getInsight(); - log.info("Insight[id: {}] is updated.", updated.getId().getValue()); - insightHelper.save(updated); - - Snapshot snapshot = insightDomainService.captureInsight(insightUpdatedEvent.getInsight()); - Snapshot saved = snapshotHelper.save(snapshot); - - // memberSnapshot에 update - memberSnapshotRepository.updateSnapshotIdByMemberIdAndInsightId(saved.getId(), updatedBy, insightId); - - return insightDataMapper.insightToUpdateInsightResponse(insightUpdatedEvent.getInsight()); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/ExchangeRequestDataMapper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/ExchangeRequestDataMapper.java deleted file mode 100644 index 02e0ced1..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/ExchangeRequestDataMapper.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.project.imdang.insight.service.domain.mapper; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestResponse; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestResponse; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightCommand; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightResponse; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import org.springframework.stereotype.Component; - -@Component -public class ExchangeRequestDataMapper { - - public ExchangeRequest requestExchangeInsightCommandToExchangeRequest(RequestExchangeInsightCommand requestExchangeInsightCommand) { - return ExchangeRequest.builder() - .requestedInsightId(new InsightId(requestExchangeInsightCommand.getRequestedInsightId())) - .requestMemberId(new MemberId(requestExchangeInsightCommand.getRequestMemberId())) - .requestMemberInsightId( - requestExchangeInsightCommand.getRequestMemberInsightId() != null ? - new InsightId(requestExchangeInsightCommand.getRequestMemberInsightId()) : null) - // 쿠폰으로 요청 시 - .memberCouponId( - requestExchangeInsightCommand.getMemberCouponId() != null ? - new MemberCouponId(requestExchangeInsightCommand.getMemberCouponId()) : null) - .build(); - } - - public RequestExchangeInsightResponse exchangeRequestToRequestExchangeInsightResponse(ExchangeRequest exchangeRequest) { - return RequestExchangeInsightResponse.builder() - .exchangeRequestId(exchangeRequest.getId().getValue()) - .build(); - } - - public AcceptExchangeRequestResponse exchangeRequestToAcceptExchangeRequestResponse(ExchangeRequest exchangeRequest) { - return AcceptExchangeRequestResponse.builder() - .exchangeRequestId(exchangeRequest.getId().getValue()) - .build(); - } - - public RejectExchangeRequestResponse exchangeRequestToRejectExchangeRequestResponse(ExchangeRequest exchangeRequest) { - return RejectExchangeRequestResponse.builder() - .exchangeRequestId(exchangeRequest.getId().getValue()) - .build(); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/InsightDataMapper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/InsightDataMapper.java deleted file mode 100644 index a557a5ac..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/InsightDataMapper.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.project.imdang.insight.service.domain.mapper; - -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightResponse; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import org.springframework.stereotype.Component; - -@Component -public class InsightDataMapper { - - public InsightResponse insightToInsightResponse(Insight insight, String memberNickname) { - return InsightResponse.builder() - .insightId(insight.getId().getValue()) - .recommendedCount(insight.getRecommendedCount()) - .address(insight.getAddress()) - .title(insight.getTitle()) - .mainImage(insight.getMainImage()) - .memberNickname(memberNickname) - .createdAt(insight.getCreatedAt()) - .build(); - } - - public Insight createInsightCommandToInsight(CreateInsightCommand createInsightCommand) { - return Insight.builder() - .memberId(new MemberId(createInsightCommand.getMemberId())) - .title(createInsightCommand.getTitle()) - .address(createInsightCommand.getAddress()) - .apartmentComplex(createInsightCommand.getApartmentComplex()) - .visitAt(createInsightCommand.getVisitAt()) - .visitTimes(createInsightCommand.getVisitTimes()) - .visitMethods(createInsightCommand.getVisitMethods()) - .access(createInsightCommand.getAccess()) - .summary(createInsightCommand.getSummary()) - .infra(createInsightCommand.getInfra()) - .complexEnvironment(createInsightCommand.getComplexEnvironment()) - .complexFacility(createInsightCommand.getComplexFacility()) - .favorableNews(createInsightCommand.getFavorableNews()) - .score(createInsightCommand.getScore()) - .build(); - } - - public CreateInsightResponse insightToCreateInsightResponse(Insight insight) { - return CreateInsightResponse.builder() - .insightId(insight.getId().getValue()) - .build(); - } - - public UpdateInsightResponse insightToUpdateInsightResponse(Insight insight) { - return UpdateInsightResponse.builder() - .insightId(insight.getId().getValue()) - .build(); - } - - public DeleteInsightResponse insightToDeleteInsightResponse(Insight insight) { - return DeleteInsightResponse.builder() - .insightId(insight.getId().getValue()) - .build(); - } - - public AccuseInsightResponse insightToAccuseInsightResponse(Insight insight) { - return AccuseInsightResponse.builder() - .insightId(insight.getId().getValue()) - .build(); - } - - public RecommendInsightResponse insightToRecommendInsightResponse(Insight insight) { - return RecommendInsightResponse.builder() - .insightId(insight.getId().getValue()) - .build(); - } - - public DetailInsightResponse insightToDetailInsightResponse(Insight insight, - String memberNickname, - Boolean recommended, - Boolean accused, - ExchangeRequestStatus exchangeRequestStatus, - Boolean exchangeRequestCreatedByMe, - ExchangeRequestId exchangeRequestId, - Boolean createdByMe) { - return DetailInsightResponse.builder() - .memberId(insight.getMemberId().getValue()) - .memberNickname(memberNickname) - .insightId(insight.getId().getValue()) - .mainImage(insight.getMainImage()) - .title(insight.getTitle()) - .address(insight.getAddress()) - .apartmentComplex(insight.getApartmentComplex()) - .visitAt(insight.getVisitAt()) - .visitTimes(insight.getVisitTimes()) - .visitMethods(insight.getVisitMethods()) - .access(insight.getAccess()) - .summary(insight.getSummary()) - .infra(insight.getInfra()) - .complexEnvironment(insight.getComplexEnvironment()) - .complexFacility(insight.getComplexFacility()) - .favorableNews(insight.getFavorableNews()) - .recommended(recommended) - .accused(accused) - .recommendedCount(insight.getRecommendedCount()) - .accusedCount(insight.getAccusedCount()) - .viewCount(insight.getViewCount()) - .score(insight.getScore()) - .createdAt(insight.getCreatedAt()) - .exchangeRequestStatus(exchangeRequestStatus) - .exchangeRequestCreatedByMe(exchangeRequestCreatedByMe) - .exchangeRequestId(exchangeRequestId != null ? exchangeRequestId.getValue() : null) - .createdByMe(createdByMe) - .build(); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/SnapshotDataMapper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/SnapshotDataMapper.java deleted file mode 100644 index fb02ddc1..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/mapper/SnapshotDataMapper.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.project.imdang.insight.service.domain.mapper; - -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightSimpleResponse; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import org.springframework.stereotype.Component; - -@Component -public class SnapshotDataMapper { - - public InsightResponse snapshotToInsightResponse(Snapshot snapshot, String memberNickname, Integer recommendedCount) { - return InsightResponse.builder() - .insightId(snapshot.getInsightId().getValue()) - .recommendedCount(recommendedCount) - .address(snapshot.getAddress()) - .title(snapshot.getTitle()) - .mainImage(snapshot.getMainImage()) - .memberNickname(memberNickname) - .build(); - } - - public InsightSimpleResponse snapshotToInsightSimpleResponse(Snapshot snapshot, Integer recommendedCount) { - return InsightSimpleResponse.builder() - .insightId(snapshot.getInsightId().getValue()) - .recommendedCount(recommendedCount) - .address(snapshot.getAddress()) - .title(snapshot.getTitle()) - .build(); - } - - public DetailInsightResponse snapshotToDetailInsightResponse(Snapshot snapshot, - String memberNickname, - Boolean recommended, - Boolean accused, - Integer recommendedCount, - Integer accusedCount, - Integer viewCount, - ExchangeRequestStatus exchangeRequestStatus, - Boolean exchangeRequestCreatedByMe, - ExchangeRequestId exchangeRequestId, - Boolean createdByMe) { - return DetailInsightResponse.builder() - .memberId(snapshot.getMemberId().getValue()) - .memberNickname(memberNickname) - .insightId(snapshot.getInsightId().getValue()) - .snapshotId(snapshot.getId().getValue()) - .mainImage(snapshot.getMainImage()) - .title(snapshot.getTitle()) - .address(snapshot.getAddress()) - .apartmentComplex(snapshot.getApartmentComplex()) - .visitAt(snapshot.getVisitAt()) - .visitTimes(snapshot.getVisitTimes()) - .visitMethods(snapshot.getVisitMethods()) - .access(snapshot.getAccess()) - .summary(snapshot.getSummary()) - .infra(snapshot.getInfra()) - .complexEnvironment(snapshot.getComplexEnvironment()) - .complexFacility(snapshot.getComplexFacility()) - .favorableNews(snapshot.getFavorableNews()) - .recommended(recommended) - .accused(accused) - .recommendedCount(recommendedCount) - .accusedCount(accusedCount) - .viewCount(viewCount) - .exchangeRequestStatus(exchangeRequestStatus) - .exchangeRequestCreatedByMe(exchangeRequestCreatedByMe) - .exchangeRequestId(exchangeRequestId != null ? exchangeRequestId.getValue() : null) - .createdByMe(createdByMe) - .build(); - } -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberAccusedResponseMessageListener.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberAccusedResponseMessageListener.java deleted file mode 100644 index 1835724f..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberAccusedResponseMessageListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.input.listener; - -import com.project.imdang.domain.message.MemberAccusedResponseMessage; - -public interface MemberAccusedResponseMessageListener { - void updated(MemberAccusedResponseMessage memberAccusedResponseMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberCouponCancelledResponseMessageListener.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberCouponCancelledResponseMessageListener.java deleted file mode 100644 index 1c290b15..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberCouponCancelledResponseMessageListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.input.listener; - -import com.project.imdang.domain.message.MemberCouponCancelledResponseMessage; - -public interface MemberCouponCancelledResponseMessageListener { - void updated(MemberCouponCancelledResponseMessage memberCouponCancelledResponseMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberCouponUsedResponseMessageListener.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberCouponUsedResponseMessageListener.java deleted file mode 100644 index 0b48f60f..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/listener/MemberCouponUsedResponseMessageListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.input.listener; - -import com.project.imdang.domain.message.MemberCouponUsedResponseMessage; - -public interface MemberCouponUsedResponseMessageListener { - void updated(MemberCouponUsedResponseMessage memberCouponUsedResponseMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/service/ExchangeApplicationService.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/service/ExchangeApplicationService.java deleted file mode 100644 index 5f7e538e..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/service/ExchangeApplicationService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.input.service; - -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.accept.AcceptExchangeRequestResponse; -import com.project.imdang.insight.service.domain.dto.exchange.list.ListExchangeRequestedByMeQuery; -import com.project.imdang.insight.service.domain.dto.exchange.list.ListExchangeRequestedByOthersQuery; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestCommand; -import com.project.imdang.insight.service.domain.dto.exchange.reject.RejectExchangeRequestResponse; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightCommand; -import com.project.imdang.insight.service.domain.dto.exchange.request.RequestExchangeInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import org.springframework.data.domain.Page; - -public interface ExchangeApplicationService { - RequestExchangeInsightResponse requestExchangeInsight(RequestExchangeInsightCommand requestExchangeInsightCommand); - AcceptExchangeRequestResponse acceptExchangeRequest(AcceptExchangeRequestCommand acceptExchangeRequestCommand); - RejectExchangeRequestResponse rejectExchangeRequest(RejectExchangeRequestCommand rejectExchangeRequestCommand); - // 내가 요청한 내역 - Page listExchangeRequestedByMe(ListExchangeRequestedByMeQuery listExchangeRequestedByMeQuery) ; - // 요청 받은 내역 - Page listExchangeRequestedByOthers(ListExchangeRequestedByOthersQuery listExchangeRequestedByOthersQuery); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/service/InsightApplicationService.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/service/InsightApplicationService.java deleted file mode 100644 index af825fe3..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/input/service/InsightApplicationService.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.input.service; - -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.accuse.AccuseInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.create.CreateInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.delete.DeleteInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.detail.DetailInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ApartmentComplexResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.DistrictResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.InsightSimpleResponse; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByApartmentComplexQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByDateQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightByDistrictQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; -import com.project.imdang.insight.service.domain.dto.insight.list.ListMyInsightQuery; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.recommend.RecommendInsightResponse; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightCommand; -import com.project.imdang.insight.service.domain.dto.insight.update.UpdateInsightResponse; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.District; -import org.springframework.data.domain.Page; - -import java.util.List; -import java.util.UUID; - -public interface InsightApplicationService { - Page listInsight(ListInsightQuery listInsightQuery); - Page listInsightByDate(ListInsightByDateQuery listInsightByDateQuery); - Page listInsightByDistrict(ListInsightByDistrictQuery listInsightByDistrictQuery); - Page listInsightByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery); - List listMyVisitedApartmentComplex(UUID memberId); - Page listDistrict(String siDo, String siGunGu, Integer pageNumber, Integer pageSize); - - List listMyInsightDistrict(UUID memberId); - List listMyInsightApartmentComplexByDistrict(UUID memberId, District district); - Page listMyInsight(ListMyInsightQuery listMyInsightQuery); - Page listMyInsightCreatedByMe(ListMyInsightCreatedByMeQuery listMyInsightCreatedByMeQuery); - - DetailInsightResponse detailInsight(DetailInsightQuery detailInsightQuery); - // = uploadInsight - CreateInsightResponse createInsight(CreateInsightCommand createInsightCommand); - UpdateInsightResponse updateInsight(UpdateInsightCommand updateInsightCommand); - DeleteInsightResponse deleteInsight(DeleteInsightCommand deleteInsightCommand); - - RecommendInsightResponse recommendInsight(RecommendInsightCommand recommendInsightCommand); - AccuseInsightResponse accuseInsight(AccuseInsightCommand accuseInsightCommand); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/file/FileService.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/file/FileService.java deleted file mode 100644 index 63cb73ec..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/file/FileService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.file; - -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; - -public interface FileService { - String upload(String directory, MultipartFile file) throws IOException; -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/lookup/InsightMemberLookup.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/lookup/InsightMemberLookup.java deleted file mode 100644 index 1cbb26e6..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/lookup/InsightMemberLookup.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.lookup; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; - -import java.util.List; -import java.util.Optional; - -public interface InsightMemberLookup { - Optional lookupByMemberId(MemberId memberId); - List lookupByMemberIds(List memberIds); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestAcceptedCountMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestAcceptedCountMessagePublisher.java deleted file mode 100644 index 3b655128..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestAcceptedCountMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.publisher; - -import com.project.imdang.domain.message.ExchangeRequestAcceptedCountRequestMessage; - -public interface ExchangeRequestAcceptedCountMessagePublisher { - void publish(ExchangeRequestAcceptedCountRequestMessage exchangeRequestCountRequestMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestCreatedRequestMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestCreatedRequestMessagePublisher.java deleted file mode 100644 index a4cc9c6a..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestCreatedRequestMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.publisher; - -import com.project.imdang.domain.message.ExchangeRequestCreatedRequestMessage; - -public interface ExchangeRequestCreatedRequestMessagePublisher { - void publish(ExchangeRequestCreatedRequestMessage exchangeRequestCreatedRequestMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestRejectedCountMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestRejectedCountMessagePublisher.java deleted file mode 100644 index a2a1672d..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestRejectedCountMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.publisher; - -import com.project.imdang.domain.message.ExchangeRequestRejectedCountRequestMessage; - -public interface ExchangeRequestRejectedCountMessagePublisher { - void publish(ExchangeRequestRejectedCountRequestMessage exchangeRequestRejectedCountRequestMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestRejectedRequestMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestRejectedRequestMessagePublisher.java deleted file mode 100644 index e7a1467b..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/ExchangeRequestRejectedRequestMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.publisher; - -import com.project.imdang.domain.message.ExchangeRequestRejectedRequestMessage; - -public interface ExchangeRequestRejectedRequestMessagePublisher { - void publish(ExchangeRequestRejectedRequestMessage exchangeRequestRejectedRequestMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/InsightAccusedRequestMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/InsightAccusedRequestMessagePublisher.java deleted file mode 100644 index 73b118f0..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/InsightAccusedRequestMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.publisher; - -import com.project.imdang.domain.message.InsightAccusedRequestMessage; - -public interface InsightAccusedRequestMessagePublisher { - void publish(InsightAccusedRequestMessage insightAccusedRequestMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/InsightCreatedCountMessagePublisher.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/InsightCreatedCountMessagePublisher.java deleted file mode 100644 index eb0c1dee..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/publisher/InsightCreatedCountMessagePublisher.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.publisher; - -import com.project.imdang.domain.message.InsightCreatedCountRequestMessage; - -public interface InsightCreatedCountMessagePublisher { - void publish(InsightCreatedCountRequestMessage insightCreatedCountRequestMessage); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/AccuseRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/AccuseRepository.java deleted file mode 100644 index bb7a022f..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/AccuseRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.repository; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Accuse; - -import java.util.Optional; - -public interface AccuseRepository { - Optional findByAccuseMemberIdAndAccusedInsightId(MemberId accuseMemberId, InsightId accusedInsightId); - Accuse save(Accuse accuse); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/ExchangeRequestRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/ExchangeRequestRepository.java deleted file mode 100644 index 8d72520d..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/ExchangeRequestRepository.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.repository; - -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; - -import java.util.List; -import java.util.Optional; - -public interface ExchangeRequestRepository { - - ExchangeRequest save(ExchangeRequest exchangeRequest); - Optional findById(ExchangeRequestId exchangeRequestId); - - // 교환 요청한 사람 - 교환 요청받은 인사이트 - List findByRequestMemberIdAndRequestedInsightId(MemberId requestMemberId, InsightId requestedInsightId); - - // 교환 요청받은 사람 - 교환 요청 시 사용된 MemberCoupon - 교환 요청 시 사용된 인사이트 - List findByRequestedMemberIdAndMemberCouponIdAndRequestMemberInsightId(MemberId requestedMemberId, MemberCouponId memberCouponId, InsightId requestMemberInsightId); - - // 교환 요청한 사람 - 교환 요청받은 인사이트 - List findByRequestMemberInsightIdAndRequestedInsightId(InsightId requestMemberInsightId, InsightId requestedInsightId); - - List findByRequestMemberIdAndRequestedInsightIdAndMemberCouponIsNotNull(MemberId requestMemberId, InsightId requestedInsightId); - List findByRequestedMemberIdAndRequestMemberInsightId(MemberId requestedMemberId, InsightId requestMemberInsightId); - - Page findAllByRequestMemberIdAndExchangeRequestStatus(MemberId requestMemberId, ExchangeRequestStatus exchangeRequestStatus, PageRequest pageRequest); - Page findAllByRequestedMemberIdAndExchangeRequestStatus(MemberId requestedMemberId, ExchangeRequestStatus exchangeRequestStatus, PageRequest pageRequest); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/MemberSnapshotRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/MemberSnapshotRepository.java deleted file mode 100644 index f5639670..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/MemberSnapshotRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.repository; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.MemberSnapshot; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.District; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; - -import java.util.List; -import java.util.Optional; - -public interface MemberSnapshotRepository { - - Optional findByMemberIdAndInsightId(MemberId memberId, InsightId insightId); - Page findAllByMemberIdAndDistrict(MemberId memberId, District district, PageRequest pageRequest); - Page findAllByMemberIdAndApartmentComplex(MemberId memberId, ApartmentComplex apartmentComplex, PageRequest pageRequest); - - Page findAllByMemberIdAndSnapshotMemberId(MemberId memberId, MemberId snapshotMemberId, PageRequest pageRequest); - Page findAllByMemberIdAndDistrictAndSnapshotMemberId(MemberId memberId, District district, MemberId snapshotMemberId, PageRequest pageRequest); - Page findAllByMemberIdAndApartmentComplexAndSnapshotMemberId(MemberId memberId, ApartmentComplex apartmentComplex, MemberId createdBy, PageRequest pageRequest); - - List findAllDistinctDistrictByMemberId(MemberId memberId); - List findAllDistinctApartmentComplexAndInsightCountByMemberIdAndDistrict(MemberId memberId, District district); - Long[] countAllByMemberIdAndDistrict(MemberId memberId, District district); - - MemberSnapshot save(MemberSnapshot memberSnapshot); - void updateSnapshotIdByMemberIdAndInsightId(SnapshotId snapshotId, MemberId memberId, InsightId insightId); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/RecommendRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/RecommendRepository.java deleted file mode 100644 index 38be50f2..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/RecommendRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.repository; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Recommend; - -import java.util.Optional; - -public interface RecommendRepository { - Optional findByRecommendMemberIdAndRecommendedInsightId(MemberId recommendMemberId, InsightId recommendedInsightId); - Recommend save(Recommend recommend); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/SnapshotRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/SnapshotRepository.java deleted file mode 100644 index 604c3d73..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/ports/output/repository/SnapshotRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.insight.service.domain.ports.output.repository; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; - -import java.util.List; -import java.util.Optional; - -public interface SnapshotRepository { - Snapshot save(Snapshot snapshot); - Optional findById(SnapshotId snapshotId); - Optional findLatestByInsightId(InsightId insightId); - List findAllByIds(List snapshotIds); -} diff --git a/insight-service/insight-domain/insight-application-service/src/main/resources/application.properties b/insight-service/insight-domain/insight-application-service/src/main/resources/application.properties deleted file mode 100644 index 301ec56a..00000000 --- a/insight-service/insight-domain/insight-application-service/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=insight-application-service diff --git a/insight-service/insight-domain/insight-domain-core/build.gradle b/insight-service/insight-domain/insight-domain-core/build.gradle index c049d055..1f712dad 100644 --- a/insight-service/insight-domain/insight-domain-core/build.gradle +++ b/insight-service/insight-domain/insight-domain-core/build.gradle @@ -1,6 +1,6 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':common:common-domain:common-domain-core') + + // TODO - api, 구현체 분리 + implementation 'org.springframework.boot:spring-boot-starter-logging' } diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java new file mode 100644 index 00000000..d01b983d --- /dev/null +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java @@ -0,0 +1,41 @@ +package com.project.imdang.insight.domain; + +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.event.InsightAccusedEvent; +import com.project.imdang.insight.domain.event.InsightDeletedEvent; +import com.project.imdang.insight.domain.event.InsightRecommendedEvent; +import com.project.imdang.insight.domain.event.InsightUpdatedEvent; + +import java.time.LocalDate; +import java.util.Set; + +public interface InsightDomainService { + Insight createInsight(Insight insight, String mainImage); + InsightUpdatedEvent updateInsight(Insight insight, + MemberId memberId, + String mainImage, + String title, + Address address, + ApartmentComplex apartmentComplex, + LocalDate visitAt, + Set visitTimes, + Set visitMethods, + Access access, + String summary, + Infra infra, + ComplexEnvironment complexEnvironment, + int score); + InsightDeletedEvent deleteInsight(Insight insight, MemberId deletedBy); + InsightRecommendedEvent recommendInsight(Insight insight, MemberId recommendedBy); + InsightAccusedEvent accuseInsight(Insight insight, MemberId accusedBy); + + void viewInsight(Insight insight); +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/InsightDomainServiceImpl.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java similarity index 61% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/InsightDomainServiceImpl.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java index ef3ac279..8841bc08 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/InsightDomainServiceImpl.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java @@ -1,24 +1,21 @@ -package com.project.imdang.insight.service.domain; +package com.project.imdang.insight.domain; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Accuse; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.Recommend; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.event.InsightAccusedEvent; -import com.project.imdang.insight.service.domain.event.InsightDeletedEvent; -import com.project.imdang.insight.service.domain.event.InsightRecommendedEvent; -import com.project.imdang.insight.service.domain.event.InsightUpdatedEvent; -import com.project.imdang.insight.service.domain.exception.InsightDomainException; -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import com.project.imdang.insight.domain.entity.Accuse; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.Recommend; +import com.project.imdang.insight.domain.event.InsightAccusedEvent; +import com.project.imdang.insight.domain.event.InsightDeletedEvent; +import com.project.imdang.insight.domain.event.InsightRecommendedEvent; +import com.project.imdang.insight.domain.event.InsightUpdatedEvent; +import com.project.imdang.insight.domain.exception.InsightDomainException; import lombok.extern.slf4j.Slf4j; import java.time.LocalDate; @@ -51,12 +48,10 @@ public InsightUpdatedEvent updateInsight(Insight insight, String summary, Infra infra, ComplexEnvironment complexEnvironment, - ComplexFacility complexFacility, - FavorableNews favorableNews, int score) { insight.update(memberId, mainImage, title, address, apartmentComplex, visitAt, visitTimes, visitMethods, access, summary, - infra, complexEnvironment, complexFacility, favorableNews, score); + infra, complexEnvironment, score); log.info("Insight[id: {}] is updated.", insight.getId().getValue()); return new InsightUpdatedEvent(insight, ZonedDateTime.now(ZoneId.of("UTC"))); } @@ -91,11 +86,4 @@ public void viewInsight(Insight insight) { insight.view(); log.info("Insight[id: {}] is viewed.", insight.getId().getValue()); } - - @Override - public Snapshot captureInsight(Insight insight) { - Snapshot snapshot = insight.capture(); - log.info("Insight[id: {}] is captured.", insight.getId().getValue()); - return snapshot; - } } diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Accuse.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Accuse.java similarity index 78% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Accuse.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Accuse.java index dd14498e..405aa326 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Accuse.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Accuse.java @@ -1,10 +1,10 @@ -package com.project.imdang.insight.service.domain.entity; +package com.project.imdang.insight.domain.entity; -import com.project.imdang.domain.entity.BaseEntity; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.valueobject.AccuseId; +import com.project.imdang.common.domain.entity.BaseEntity; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.valueobject.AccuseId; import lombok.Builder; import lombok.Getter; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Insight.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java similarity index 69% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Insight.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java index 4c0c5385..4935c465 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Insight.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java @@ -1,19 +1,17 @@ -package com.project.imdang.insight.service.domain.entity; - - -import com.project.imdang.domain.entity.AggregateRoot; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.exception.InsightDomainException; -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; +package com.project.imdang.insight.domain.entity; + + +import com.project.imdang.common.domain.entity.AggregateRoot; +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import com.project.imdang.insight.domain.exception.InsightDomainException; import lombok.Builder; import lombok.Getter; @@ -44,10 +42,6 @@ public class Insight extends AggregateRoot { private Infra infra; // 단지 환경 private ComplexEnvironment complexEnvironment; - // 단지 시설 - private ComplexFacility complexFacility; - // (예정된) 호재 - private FavorableNews favorableNews; private int recommendedCount; // 신고 횟수 @@ -75,8 +69,6 @@ public Insight(InsightId id, String summary, Infra infra, ComplexEnvironment complexEnvironment, - ComplexFacility complexFacility, - FavorableNews favorableNews, int recommendedCount, int accusedCount, int viewCount, @@ -96,8 +88,6 @@ public Insight(InsightId id, this.summary = summary; this.infra = infra; this.complexEnvironment = complexEnvironment; - this.complexFacility = complexFacility; - this.favorableNews = favorableNews; this.recommendedCount = recommendedCount; this.accusedCount = accusedCount; this.viewCount = viewCount; @@ -106,10 +96,6 @@ public Insight(InsightId id, this.isDeleted = isDeleted; } - public Snapshot capture() { - return Snapshot.createNewSnapshot(this); - } - public void initialize(String mainImage) { InsightId insightId = new InsightId(UUID.randomUUID()); setId(insightId); @@ -132,12 +118,7 @@ public Insight update(MemberId updatedBy, String summary, Infra infra, ComplexEnvironment complexEnvironment, - ComplexFacility complexFacility, - FavorableNews favorableNews, int score) { - // 교환 완료 시점의 인사이트 내용 유지 - // 교환 후 해당 인사이트가 수정되어도 수정사항 반영 X - // insight가 수정되면 snapshot 생성 및 저장 if (!updatedBy.equals(this.memberId)) { throw new InsightDomainException("Author does not match!"); @@ -156,15 +137,11 @@ public Insight update(MemberId updatedBy, this.summary = summary; this.infra = infra; this.complexEnvironment = complexEnvironment; - this.complexFacility = complexFacility; - this.favorableNews = favorableNews; this.score = score; return this; } public void delete() { - // 교환 완료 시점의 인사이트 내용 유지 - // 교환 후 해당 인사이트가 삭제되어도, 교환한 유저의 보관함에는 그대로 유지 this.isDeleted = true; } diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Recommend.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Recommend.java similarity index 79% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Recommend.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Recommend.java index 4d39e816..c706cd53 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Recommend.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Recommend.java @@ -1,9 +1,9 @@ -package com.project.imdang.insight.service.domain.entity; +package com.project.imdang.insight.domain.entity; -import com.project.imdang.domain.entity.BaseEntity; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.valueobject.RecommendId; +import com.project.imdang.common.domain.entity.BaseEntity; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.valueobject.RecommendId; import lombok.Builder; import lombok.Getter; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightAccusedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightAccusedEvent.java similarity index 63% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightAccusedEvent.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightAccusedEvent.java index c09832f1..66faf918 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightAccusedEvent.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightAccusedEvent.java @@ -1,7 +1,7 @@ -package com.project.imdang.insight.service.domain.event; +package com.project.imdang.insight.domain.event; -import com.project.imdang.insight.service.domain.entity.Accuse; -import com.project.imdang.insight.service.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.Accuse; +import com.project.imdang.insight.domain.entity.Insight; import lombok.Getter; import java.time.ZonedDateTime; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightCreatedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightCreatedEvent.java new file mode 100644 index 00000000..d76c0554 --- /dev/null +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightCreatedEvent.java @@ -0,0 +1,11 @@ +package com.project.imdang.insight.domain.event; + +import com.project.imdang.insight.domain.entity.Insight; + +import java.time.ZonedDateTime; + +public class InsightCreatedEvent extends InsightEvent { + public InsightCreatedEvent(Insight insight, ZonedDateTime createdAt) { + super(insight, createdAt); + } +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightDeletedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightDeletedEvent.java similarity index 63% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightDeletedEvent.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightDeletedEvent.java index e5f2e98b..4b80002b 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightDeletedEvent.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightDeletedEvent.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.domain.event; +package com.project.imdang.insight.domain.event; -import com.project.imdang.insight.service.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.Insight; import java.time.ZonedDateTime; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightEvent.java similarity index 65% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightEvent.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightEvent.java index 8d6303bb..82fb8e4f 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightEvent.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightEvent.java @@ -1,7 +1,8 @@ -package com.project.imdang.insight.service.domain.event; +package com.project.imdang.insight.domain.event; +import com.project.imdang.common.domain.event.DomainEventMessage; import com.project.imdang.domain.event.DomainEvent; -import com.project.imdang.insight.service.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.Insight; import lombok.Getter; import lombok.RequiredArgsConstructor; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightRecommendedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightRecommendedEvent.java similarity index 64% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightRecommendedEvent.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightRecommendedEvent.java index ca769b7c..3d681257 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightRecommendedEvent.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightRecommendedEvent.java @@ -1,7 +1,7 @@ -package com.project.imdang.insight.service.domain.event; +package com.project.imdang.insight.domain.event; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.Recommend; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.Recommend; import lombok.Getter; import java.time.ZonedDateTime; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightUpdatedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightUpdatedEvent.java similarity index 63% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightUpdatedEvent.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightUpdatedEvent.java index cc18f6bd..bcaa77e4 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/InsightUpdatedEvent.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/event/InsightUpdatedEvent.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.domain.event; +package com.project.imdang.insight.domain.event; -import com.project.imdang.insight.service.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.Insight; import java.time.ZonedDateTime; diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/AccuseAlreadyExistException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/AccuseAlreadyExistException.java new file mode 100644 index 00000000..568aed49 --- /dev/null +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/AccuseAlreadyExistException.java @@ -0,0 +1,18 @@ +package com.project.imdang.insight.domain.exception; + +import com.project.imdang.common.domain.exception.DomainAlreadyExistException; + +public class AccuseAlreadyExistException extends DomainAlreadyExistException { + + public AccuseAlreadyExistException() { + super("Accuse Already Exist"); + } + + public AccuseAlreadyExistException(String message) { + super(message); + } + + public AccuseAlreadyExistException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/InsightDomainException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/InsightDomainException.java similarity index 67% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/InsightDomainException.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/InsightDomainException.java index 72c17972..a931e6e6 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/InsightDomainException.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/InsightDomainException.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.domain.exception; +package com.project.imdang.insight.domain.exception; -import com.project.imdang.domain.exception.DomainException; +import com.project.imdang.common.domain.exception.DomainException; public class InsightDomainException extends DomainException { diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/InsightNotFoundException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/InsightNotFoundException.java similarity index 57% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/InsightNotFoundException.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/InsightNotFoundException.java index c3a010d4..410a1ab5 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/InsightNotFoundException.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/InsightNotFoundException.java @@ -1,8 +1,9 @@ -package com.project.imdang.insight.service.domain.exception; +package com.project.imdang.insight.domain.exception; -import com.project.imdang.domain.valueobject.InsightId; +import com.project.imdang.common.domain.exception.DomainNotFoundException; +import com.project.imdang.common.domain.valueobject.InsightId; -public class InsightNotFoundException extends InsightDomainException { +public class InsightNotFoundException extends DomainNotFoundException { public InsightNotFoundException(InsightId insightId) { this(String.format("Could not find insight[id: %s]!", insightId.getValue())); diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/MemberNotFoundException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/MemberNotFoundException.java new file mode 100644 index 00000000..3ca1dc77 --- /dev/null +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/MemberNotFoundException.java @@ -0,0 +1,19 @@ +package com.project.imdang.insight.domain.exception; + +import com.project.imdang.common.domain.exception.DomainNotFoundException; +import com.project.imdang.common.domain.valueobject.MemberId; + +public class MemberNotFoundException extends DomainNotFoundException { + + public MemberNotFoundException(MemberId memberId) { + this(String.format("Could not find member[id: %s]!", memberId.getValue())); + } + + public MemberNotFoundException(String message) { + super(message); + } + + public MemberNotFoundException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/RecommendAlreadyExistException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/RecommendAlreadyExistException.java new file mode 100644 index 00000000..be058b0e --- /dev/null +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/exception/RecommendAlreadyExistException.java @@ -0,0 +1,18 @@ +package com.project.imdang.insight.domain.exception; + +import com.project.imdang.common.domain.exception.DomainAlreadyExistException; + +public class RecommendAlreadyExistException extends DomainAlreadyExistException { + + public RecommendAlreadyExistException() { + super("Recommend Already Exist"); + } + + public RecommendAlreadyExistException(String message) { + super(message); + } + + public RecommendAlreadyExistException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/valueobject/AccuseId.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/valueobject/AccuseId.java new file mode 100644 index 00000000..cdd473ed --- /dev/null +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/valueobject/AccuseId.java @@ -0,0 +1,9 @@ +package com.project.imdang.insight.domain.valueobject; + +import com.project.imdang.common.domain.valueobject.BaseId; + +public class AccuseId extends BaseId { + public AccuseId(Long value) { + super(value); + } +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/RecommendId.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/valueobject/RecommendId.java similarity index 50% rename from insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/RecommendId.java rename to insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/valueobject/RecommendId.java index b0f20e20..d21f1319 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/RecommendId.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/valueobject/RecommendId.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.domain.valueobject; +package com.project.imdang.insight.domain.valueobject; -import com.project.imdang.domain.valueobject.BaseId; +import com.project.imdang.common.domain.valueobject.BaseId; public class RecommendId extends BaseId { public RecommendId(Long value) { diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/ExchangeDomainService.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/ExchangeDomainService.java deleted file mode 100644 index 3244febc..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/ExchangeDomainService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.project.imdang.insight.service.domain; - -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.event.ExchangeRequestAcceptedEvent; -import com.project.imdang.insight.service.domain.event.ExchangeRequestByCouponCreatedEvent; -import com.project.imdang.insight.service.domain.event.ExchangeRequestCreatedEvent; -import com.project.imdang.insight.service.domain.event.ExchangeRequestRejectedEvent; - -public interface ExchangeDomainService { - ExchangeRequestCreatedEvent requestExchange(ExchangeRequest exchangeRequest, Snapshot requestedSnapshot, Snapshot requestMemberSnapshot); - ExchangeRequestByCouponCreatedEvent requestExchangeWithCoupon(ExchangeRequest exchangeRequest, Snapshot requestedSnapshot, MemberCouponId memberCouponId); - ExchangeRequestAcceptedEvent acceptExchangeRequest(ExchangeRequest exchangeRequest); - ExchangeRequestRejectedEvent rejectExchangeRequest(ExchangeRequest exchangeRequest); -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/ExchangeDomainServiceImpl.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/ExchangeDomainServiceImpl.java deleted file mode 100644 index 4e75414d..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/ExchangeDomainServiceImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.project.imdang.insight.service.domain; - -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.event.ExchangeRequestAcceptedEvent; -import com.project.imdang.insight.service.domain.event.ExchangeRequestByCouponCreatedEvent; -import com.project.imdang.insight.service.domain.event.ExchangeRequestCreatedEvent; -import com.project.imdang.insight.service.domain.event.ExchangeRequestRejectedEvent; -import lombok.extern.slf4j.Slf4j; - -import java.time.ZonedDateTime; - -@Slf4j -public class ExchangeDomainServiceImpl implements ExchangeDomainService { - - @Override - public ExchangeRequestCreatedEvent requestExchange(ExchangeRequest exchangeRequest, Snapshot requestedSnapshot, Snapshot requestMemberSnapshot) { - exchangeRequest.initialize(requestedSnapshot, requestMemberSnapshot, null); - log.info("ExchangeRequest[id: {}] is initialized.", exchangeRequest.getId().getValue()); - return new ExchangeRequestCreatedEvent(exchangeRequest, ZonedDateTime.now()); - } - - @Override - public ExchangeRequestByCouponCreatedEvent requestExchangeWithCoupon(ExchangeRequest exchangeRequest, Snapshot requestedSnapshot, MemberCouponId memberCouponId) { - exchangeRequest.initialize(requestedSnapshot, null, memberCouponId); - log.info("ExchangeRequest[id: {}] is initialized.", exchangeRequest.getId().getValue()); - return new ExchangeRequestByCouponCreatedEvent(exchangeRequest, ZonedDateTime.now()); - } - - @Override - public ExchangeRequestAcceptedEvent acceptExchangeRequest(ExchangeRequest exchangeRequest) { - exchangeRequest.accept(); - log.info("ExchangeRequest[id: {}] is accepted.", exchangeRequest.getId().getValue()); - return new ExchangeRequestAcceptedEvent(exchangeRequest, ZonedDateTime.now()); - } - - @Override - public ExchangeRequestRejectedEvent rejectExchangeRequest(ExchangeRequest exchangeRequest) { - exchangeRequest.reject(); - log.info("ExchangeRequest[id: {}] is rejected.", exchangeRequest.getId().getValue()); - // TODO : 요청한 사용자의 거절 카운트 + 1, 거절 알림 - return new ExchangeRequestRejectedEvent(exchangeRequest, ZonedDateTime.now()); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/InsightDomainService.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/InsightDomainService.java deleted file mode 100644 index 734ae97b..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/InsightDomainService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.project.imdang.insight.service.domain; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.event.InsightAccusedEvent; -import com.project.imdang.insight.service.domain.event.InsightDeletedEvent; -import com.project.imdang.insight.service.domain.event.InsightRecommendedEvent; -import com.project.imdang.insight.service.domain.event.InsightUpdatedEvent; -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; - -import java.time.LocalDate; -import java.util.Set; - -public interface InsightDomainService { - Insight createInsight(Insight insight, String mainImage); - InsightUpdatedEvent updateInsight(Insight insight, - MemberId memberId, - String mainImage, - String title, - Address address, - ApartmentComplex apartmentComplex, - LocalDate visitAt, - Set visitTimes, - Set visitMethods, - Access access, - String summary, - Infra infra, - ComplexEnvironment complexEnvironment, - ComplexFacility complexFacility, - FavorableNews favorableNews, - int score); - InsightDeletedEvent deleteInsight(Insight insight, MemberId deletedBy); - InsightRecommendedEvent recommendInsight(Insight insight, MemberId recommendedBy); - InsightAccusedEvent accuseInsight(Insight insight, MemberId accusedBy); -// InsightRequestedEvent requestInsight(Insight insight); - - void viewInsight(Insight insight); - - // TODO - CHECK - Snapshot captureInsight(Insight insight); -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/ExchangeRequest.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/ExchangeRequest.java deleted file mode 100644 index 5c647b78..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/ExchangeRequest.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.project.imdang.insight.service.domain.entity; - - -import com.project.imdang.domain.entity.AggregateRoot; -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import lombok.Builder; -import lombok.Getter; - -import java.time.ZonedDateTime; -import java.util.UUID; - -@Getter -public class ExchangeRequest extends AggregateRoot { - private MemberId requestMemberId; - - //////////////////////////////////////////////////////////// - private final InsightId requestMemberInsightId; - private SnapshotId requestMemberSnapshotId; - // OR - private MemberCouponId memberCouponId; - //////////////////////////////////////////////////////////// - - private final InsightId requestedInsightId; - private SnapshotId requestedSnapshotId; - private MemberId requestedMemberId; - - private ZonedDateTime requestedAt; - private ZonedDateTime respondedAt; - private ExchangeRequestStatus status; - - @Builder - public ExchangeRequest(ExchangeRequestId id, - MemberId requestMemberId, - InsightId requestMemberInsightId, - SnapshotId requestMemberSnapshotId, - MemberCouponId memberCouponId, - InsightId requestedInsightId, - SnapshotId requestedSnapshotId, - MemberId requestedMemberId, - ZonedDateTime requestedAt, - ZonedDateTime respondedAt, - ExchangeRequestStatus status) { - setId(id); - this.requestMemberId = requestMemberId; - this.requestMemberInsightId = requestMemberInsightId; - this.requestMemberSnapshotId = requestMemberSnapshotId; - this.memberCouponId = memberCouponId; - this.requestedInsightId = requestedInsightId; - this.requestedSnapshotId = requestedSnapshotId; - this.requestedMemberId = requestedMemberId; - this.requestedAt = requestedAt; - this.respondedAt = respondedAt; - this.status = status; - } - - public void initialize(Snapshot requestedSnapshot, Snapshot requestMemberSnapshot, MemberCouponId memberCouponId) { - - // TODO - validation 체크 - - // TODO - 동일 글 중복 교환 요청 불가 (1개 글에 요청 1번으로 제한) - // requestMemberId - requestedInsightId UNIQUE - ExchangeRequestId id = new ExchangeRequestId(UUID.randomUUID()); - setId(id); - - this.requestedMemberId = requestedSnapshot.getMemberId(); - this.requestedSnapshotId = requestedSnapshot.getId(); - this.requestedAt = ZonedDateTime.now(); - - if (requestMemberSnapshot != null) { - this.requestMemberId = requestMemberSnapshot.getMemberId(); - this.requestMemberSnapshotId = requestMemberSnapshot.getId(); - } else { - // 쿠폰 사용 요청 - this.memberCouponId = memberCouponId; - } - - this.status = ExchangeRequestStatus.PENDING; - } - - public void accept() { - this.status = ExchangeRequestStatus.ACCEPTED; - this.respondedAt = ZonedDateTime.now(); - } - - public void reject() { - this.status = ExchangeRequestStatus.REJECTED; - this.respondedAt = ZonedDateTime.now(); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/MemberSnapshot.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/MemberSnapshot.java deleted file mode 100644 index 040c76da..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/MemberSnapshot.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.project.imdang.insight.service.domain.entity; - - -import com.project.imdang.domain.entity.BaseEntity; -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.valueobject.MemberSnapshotId; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import lombok.Builder; -import lombok.Getter; - -import java.time.ZonedDateTime; - -@Getter -public class MemberSnapshot extends BaseEntity { - - private final MemberId memberId; - private final SnapshotId snapshotId; - private final InsightId insightId; - private final ExchangeRequestId exchangeRequestId; - private final ZonedDateTime createdAt; - - @Builder - public MemberSnapshot(MemberSnapshotId id, MemberId memberId, SnapshotId snapshotId, InsightId insightId, ExchangeRequestId exchangeRequestId, ZonedDateTime createdAt) { - setId(id); - this.memberId = memberId; - this.snapshotId = snapshotId; - this.insightId = insightId; - this.exchangeRequestId = exchangeRequestId; - this.createdAt = createdAt; - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Snapshot.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Snapshot.java deleted file mode 100644 index 51dcc0d0..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/entity/Snapshot.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.project.imdang.insight.service.domain.entity; - - -import com.project.imdang.domain.entity.BaseEntity; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; -import lombok.Builder; -import lombok.Getter; - -import java.time.LocalDate; -import java.util.Set; - -@Getter -public class Snapshot extends BaseEntity { - - private final InsightId insightId; - private final MemberId memberId; // createdBy - private final String mainImage; - private final String title; - - private final Address address; - private final ApartmentComplex apartmentComplex; - - private final LocalDate visitAt; - private final Set visitTimes; - private final Set visitMethods; - private final Access access; - - private final String summary; - - // 인프라 - private final Infra infra; - // 단지 환경 - private final ComplexEnvironment complexEnvironment; - // 단지 시설 - private final ComplexFacility complexFacility; - // (예정된) 호재 - private final FavorableNews favorableNews; - - @Builder - public Snapshot(SnapshotId id, - InsightId insightId, - MemberId memberId, - String mainImage, - String title, - Address address, - ApartmentComplex apartmentComplex, - LocalDate visitAt, - Set visitTimes, - Set visitMethods, - Access access, - String summary, - Infra infra, - ComplexEnvironment complexEnvironment, - ComplexFacility complexFacility, - FavorableNews favorableNews) { - setId(id); - this.insightId = insightId; - this.memberId = memberId; - this.mainImage = mainImage; - this.title = title; - this.address = address; - this.apartmentComplex = apartmentComplex; - this.visitAt = visitAt; - this.visitTimes = visitTimes; - this.visitMethods = visitMethods; - this.access = access; - this.summary = summary; - this.infra = infra; - this.complexEnvironment = complexEnvironment; - this.complexFacility = complexFacility; - this.favorableNews = favorableNews; - } - - private Snapshot(Insight insight) { - this.insightId = insight.getId(); - this.memberId = insight.getMemberId(); - this.mainImage = insight.getMainImage(); - this.title = insight.getTitle(); - this.address = insight.getAddress(); - this.apartmentComplex = insight.getApartmentComplex(); - this.visitAt = insight.getVisitAt(); - this.visitTimes = insight.getVisitTimes(); - this.visitMethods = insight.getVisitMethods(); - this.access = insight.getAccess(); - this.summary = insight.getSummary(); - this.infra = insight.getInfra(); - this.complexEnvironment = insight.getComplexEnvironment(); - this.complexFacility = insight.getComplexFacility(); - this.favorableNews = insight.getFavorableNews(); - } - - static Snapshot createNewSnapshot(Insight insight) { - return new Snapshot(insight); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestAcceptedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestAcceptedEvent.java deleted file mode 100644 index 380e30f9..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestAcceptedEvent.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.domain.event; - -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; - -import java.time.ZonedDateTime; - -public class ExchangeRequestAcceptedEvent extends ExchangeRequestEvent { - - public ExchangeRequestAcceptedEvent(ExchangeRequest exchangeRequest, ZonedDateTime createdAt) { - super(exchangeRequest, createdAt); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestByCouponCreatedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestByCouponCreatedEvent.java deleted file mode 100644 index 09c88014..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestByCouponCreatedEvent.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.domain.event; - -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; - -import java.time.ZonedDateTime; - -public class ExchangeRequestByCouponCreatedEvent extends ExchangeRequestEvent { - - public ExchangeRequestByCouponCreatedEvent(ExchangeRequest exchangeRequest, ZonedDateTime createdAt) { - super(exchangeRequest, createdAt); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestCreatedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestCreatedEvent.java deleted file mode 100644 index d3d97134..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestCreatedEvent.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.domain.event; - -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; - -import java.time.ZonedDateTime; - -public class ExchangeRequestCreatedEvent extends ExchangeRequestEvent { - - public ExchangeRequestCreatedEvent(ExchangeRequest exchangeRequest, ZonedDateTime createdAt) { - super(exchangeRequest, createdAt); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestEvent.java deleted file mode 100644 index 155e3cd1..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestEvent.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.insight.service.domain.event; - -import com.project.imdang.domain.event.DomainEvent; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.time.ZonedDateTime; - -@Getter -@RequiredArgsConstructor -public abstract class ExchangeRequestEvent implements DomainEvent { - private final ExchangeRequest exchangeRequest; - private final ZonedDateTime createdAt; -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestRejectedEvent.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestRejectedEvent.java deleted file mode 100644 index 70b6ba28..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/event/ExchangeRequestRejectedEvent.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.domain.event; - -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; - -import java.time.ZonedDateTime; - -public class ExchangeRequestRejectedEvent extends ExchangeRequestEvent { - - public ExchangeRequestRejectedEvent(ExchangeRequest exchangeRequest, ZonedDateTime createdAt) { - super(exchangeRequest, createdAt); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/ExchangeDomainException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/ExchangeDomainException.java deleted file mode 100644 index 57c3c704..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/ExchangeDomainException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.insight.service.domain.exception; - -import com.project.imdang.domain.exception.DomainException; - -public class ExchangeDomainException extends DomainException { - - public ExchangeDomainException(String message) { - super(message); - } - - public ExchangeDomainException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/ExchangeRequestNotFoundException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/ExchangeRequestNotFoundException.java deleted file mode 100644 index 02beda50..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/ExchangeRequestNotFoundException.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.insight.service.domain.exception; - -import com.project.imdang.domain.valueobject.ExchangeRequestId; - -public class ExchangeRequestNotFoundException extends ExchangeDomainException { - - public ExchangeRequestNotFoundException(ExchangeRequestId exchangeRequestId) { - this(String.format("Could not find ExchangeRequest[id: %s]!", exchangeRequestId.getValue())); - } - - private ExchangeRequestNotFoundException(String message) { - super(message); - } - - private ExchangeRequestNotFoundException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/SnapshotDomainException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/SnapshotDomainException.java deleted file mode 100644 index af5079dc..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/SnapshotDomainException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.insight.service.domain.exception; - -import com.project.imdang.domain.exception.DomainException; - -public class SnapshotDomainException extends DomainException { - - public SnapshotDomainException(String message) { - super(message); - } - - public SnapshotDomainException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/SnapshotNotFoundException.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/SnapshotNotFoundException.java deleted file mode 100644 index f47dfca3..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/exception/SnapshotNotFoundException.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.project.imdang.insight.service.domain.exception; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; - -public class SnapshotNotFoundException extends SnapshotDomainException { - - public SnapshotNotFoundException(SnapshotId snapshotId) { - this(String.format("Could not find snapshot[id: %s]!", snapshotId.getValue())); - } - - public SnapshotNotFoundException(InsightId insightId) { - this(String.format("Could not find snapshot of insight[id: %s]!", insightId.getValue())); - } - - private SnapshotNotFoundException(String message) { - super(message); - } - - private SnapshotNotFoundException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/AccuseId.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/AccuseId.java deleted file mode 100644 index 3f99fa43..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/AccuseId.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -import com.project.imdang.domain.valueobject.BaseId; - -public class AccuseId extends BaseId { - public AccuseId(Long value) { - super(value); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ComplexFacility.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ComplexFacility.java deleted file mode 100644 index 19e0caf2..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ComplexFacility.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.Set; - -@Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ComplexFacility { - // 가족 - @Schema(description = "가족") - @NotNull - private Set familyFacilities; - // 다목적 - @Schema(description = "다목적") - @NotNull - private Set multipurposeFacilities; - // 여가(단지 내부) - @Schema(description = "여가(단지 내부)") - @NotNull - private Set leisureFacilities; - // 환경 - @Schema(description = "환경") - @NotNull - private Set surroundings; - private String text; - - // TODO - CHECK : DB - public enum FamilyFacility { - 해당_없음, 어린이집, 경로당 - } - - public enum MultipurposeFacility { - 해당_없음, 다목적실, 입주자_대표_회의실, 공용_세탁소, 공용_휴게실 - } - - public enum LeisureFacility { - 해당_없음, 피트니스_센터, 독서실, 사우나, 목욕탕, 스크린_골프장, 영화관, 도서관, 수영장, 공부방, 어린이집, 게스트하우스, 워터파크, 조식 - } - - public enum Surroundings { - 해당_없음, 잔디밭, 조형물, 벤치, 테이블_및_의자, 분수 - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ExchangeRequestStatus.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ExchangeRequestStatus.java deleted file mode 100644 index 9f41ac20..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/ExchangeRequestStatus.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -public enum ExchangeRequestStatus { - PENDING, REJECTED, ACCEPTED -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/FavorableNews.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/FavorableNews.java deleted file mode 100644 index 77e9b4e4..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/FavorableNews.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.Set; - -@Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class FavorableNews { - - // 교통 - @Schema(description = "교통") - @NotNull - private Set transportations; - // 개발 - @Schema(description = "개발") - @NotNull - private Set developments; - // 교육 - @Schema(description = "교육") - @NotNull - private Set educations; - // 자연환경 - @Schema(description = "자연 환경") - @NotNull - private Set environments; - // 문화 - @Schema(description = "문화") - @NotNull - private Set cultures; - // 산업 - @Schema(description = "산업") - @NotNull - private Set industries; - // 정책 - @Schema(description = "정책") - @NotNull - private Set policies; - private String text; - - public enum Transportation { - 잘_모르겠어요, 지하철_개통, 고속철도역_신설, 교통_허브_지정 - } - - public enum Development { - 잘_모르겠어요, 재개발, 재건축, 리모델링, 인근_신도시_개발, 복합_단지_개발, 대형_쇼핑몰, 백화점, 대형_오피스_단지 - } - - public enum Education { - 잘_모르겠어요, 초등학교_신설_예정, 고등학교_신설_예정, 특목고, 자사고, 국제학교, 대학_캠퍼스 - } - - public enum Environment { - 잘_모르겠어요, 대형_공원, 하천_복원, 호수_복원 - } - - public enum Culture { - 잘_모르겠어요, 대형_병원, 문화센터, 도서관, 공연장, 체육관 - } - - public enum Industry { - 잘_모르겠어요, 산업_단지, 기업_이전, 스타트업_단지 - } - - public enum Policy { - 잘_모르겠어요, 투기_과열_지구_해제, 규제_완화, 특구_지정, 일자리_창출_정책 - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/MemberInfo.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/MemberInfo.java deleted file mode 100644 index 4f8eac2f..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/MemberInfo.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -import com.project.imdang.domain.valueobject.MemberId; -import lombok.Builder; - -// TODO - CHECK : 위치 -@Builder -public record MemberInfo(MemberId memberId, - String nickname, - String birthDate, - String gender, - String deviceToken, - int accusedCount, - int exchangeCount, - int insightCount, - int rejectedCount) { -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/MemberSnapshotId.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/MemberSnapshotId.java deleted file mode 100644 index 6644f7e9..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/MemberSnapshotId.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -import com.project.imdang.domain.valueobject.BaseId; - -public class MemberSnapshotId extends BaseId { - public MemberSnapshotId(Long value) { - super(value); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/SnapshotId.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/SnapshotId.java deleted file mode 100644 index be392c11..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/SnapshotId.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -import com.project.imdang.domain.valueobject.BaseId; - -public class SnapshotId extends BaseId { - public SnapshotId(Long value) { - super(value); - } -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/VisitMethod.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/VisitMethod.java deleted file mode 100644 index 6f9ec648..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/VisitMethod.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -public enum VisitMethod { - 자차, 대중교통, 도보 -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/VisitTime.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/VisitTime.java deleted file mode 100644 index c4e0e836..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/service/domain/valueobject/VisitTime.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.project.imdang.insight.service.domain.valueobject; - -public enum VisitTime { - 아침, 점심, 저녁, 밤 -} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/resources/application.properties b/insight-service/insight-domain/insight-domain-core/src/main/resources/application.properties deleted file mode 100644 index 4853f327..00000000 --- a/insight-service/insight-domain/insight-domain-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=insight-domain-core diff --git a/insight-service/insight-messaging/build.gradle b/insight-service/insight-messaging/build.gradle index c049d055..e69de29b 100644 --- a/insight-service/insight-messaging/build.gradle +++ b/insight-service/insight-messaging/build.gradle @@ -1,6 +0,0 @@ -bootJar { - enabled = false -} -jar { - enabled = true -} diff --git a/insight-service/insight-messaging/listener/build.gradle b/insight-service/insight-messaging/listener/build.gradle new file mode 100644 index 00000000..a967d918 --- /dev/null +++ b/insight-service/insight-messaging/listener/build.gradle @@ -0,0 +1,7 @@ +dependencies { + implementation project(':insight-service:insight-domain:insight-application-service') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation project(':insight-service:insight-messaging:message') +} diff --git a/insight-service/insight-messaging/listener/src/test/java/com/project/imdang/insight/messaging/listener/ListenerApplicationTests.java b/insight-service/insight-messaging/listener/src/test/java/com/project/imdang/insight/messaging/listener/ListenerApplicationTests.java new file mode 100644 index 00000000..82963e06 --- /dev/null +++ b/insight-service/insight-messaging/listener/src/test/java/com/project/imdang/insight/messaging/listener/ListenerApplicationTests.java @@ -0,0 +1,13 @@ +package com.project.imdang.insight.messaging.listener; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ListenerApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/insight-service/insight-messaging/message/build.gradle b/insight-service/insight-messaging/message/build.gradle new file mode 100644 index 00000000..107c7086 --- /dev/null +++ b/insight-service/insight-messaging/message/build.gradle @@ -0,0 +1,3 @@ +dependencies { + implementation project(':common:common-domain:common-domain-core') +} diff --git a/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightAccusedEventMessage.java b/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightAccusedEventMessage.java new file mode 100644 index 00000000..ebe7adf2 --- /dev/null +++ b/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightAccusedEventMessage.java @@ -0,0 +1,10 @@ +package com.project.imdang.insight.messaging.message; + +import com.project.imdang.common.domain.event.DomainEventMessage; + +import java.util.UUID; + +public record InsightAccusedEventMessage( + UUID insightId, + UUID accusedMemberId) implements DomainEventMessage { +} diff --git a/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightCreatedEventMessage.java b/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightCreatedEventMessage.java new file mode 100644 index 00000000..84e941b1 --- /dev/null +++ b/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightCreatedEventMessage.java @@ -0,0 +1,10 @@ +package com.project.imdang.insight.messaging.message; + +import com.project.imdang.common.domain.event.DomainEventMessage; + +import java.util.UUID; + +public record InsightCreatedEventMessage( + UUID insightId, + UUID memberId) implements DomainEventMessage { +} diff --git a/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightDeletedEventMessage.java b/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightDeletedEventMessage.java new file mode 100644 index 00000000..dc00f469 --- /dev/null +++ b/insight-service/insight-messaging/message/src/main/java/com/project/imdang/insight/messaging/message/InsightDeletedEventMessage.java @@ -0,0 +1,10 @@ +package com.project.imdang.insight.messaging.message; + +import com.project.imdang.common.domain.event.DomainEventMessage; + +import java.util.UUID; + +public record InsightDeletedEventMessage( + UUID insightId, + UUID memberId) implements DomainEventMessage { +} diff --git a/insight-service/insight-messaging/message/src/test/java/com/project/imdang/insight/messaging/message/MessageApplicationTests.java b/insight-service/insight-messaging/message/src/test/java/com/project/imdang/insight/messaging/message/MessageApplicationTests.java new file mode 100644 index 00000000..4a53756a --- /dev/null +++ b/insight-service/insight-messaging/message/src/test/java/com/project/imdang/insight/messaging/message/MessageApplicationTests.java @@ -0,0 +1,13 @@ +package com.project.imdang.insight.messaging.message; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MessageApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/insight-service/insight-messaging/publisher/build.gradle b/insight-service/insight-messaging/publisher/build.gradle new file mode 100644 index 00000000..72082d89 --- /dev/null +++ b/insight-service/insight-messaging/publisher/build.gradle @@ -0,0 +1,9 @@ +dependencies { + implementation project(':insight-service:insight-domain:insight-application-service') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation project(':insight-service:insight-messaging:message') + + implementation 'org.springframework.boot:spring-boot-starter' +} diff --git a/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightAccusedEventMessagePublisherImpl.java b/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightAccusedEventMessagePublisherImpl.java new file mode 100644 index 00000000..9db6b431 --- /dev/null +++ b/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightAccusedEventMessagePublisherImpl.java @@ -0,0 +1,21 @@ +package com.project.imdang.insight.messaging.publisher; + +import com.project.imdang.insight.domain.ports.output.publisher.InsightAccusedEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightAccusedEventMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +@Slf4j +@RequiredArgsConstructor +@Component +public class InsightAccusedEventMessagePublisherImpl implements InsightAccusedEventMessagePublisher { + + private final ApplicationEventPublisher domainEventMessagePublisher; + + @Override + public void publish(InsightAccusedEventMessage insightAccusedEventMessage) { + domainEventMessagePublisher.publishEvent(insightAccusedEventMessage); + } +} diff --git a/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightCreatedEventMessagePublisherImpl.java b/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightCreatedEventMessagePublisherImpl.java new file mode 100644 index 00000000..f1d3f62c --- /dev/null +++ b/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightCreatedEventMessagePublisherImpl.java @@ -0,0 +1,21 @@ +package com.project.imdang.insight.messaging.publisher; + +import com.project.imdang.insight.domain.ports.output.publisher.InsightCreatedEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightCreatedEventMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +@Slf4j +@RequiredArgsConstructor +@Component +public class InsightCreatedEventMessagePublisherImpl implements InsightCreatedEventMessagePublisher { + + private final ApplicationEventPublisher domainEventMessagePublisher; + + @Override + public void publish(InsightCreatedEventMessage insightCreatedEventMessage) { + domainEventMessagePublisher.publishEvent(insightCreatedEventMessage); + } +} diff --git a/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightDeletedEventMessagePublisherImpl.java b/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightDeletedEventMessagePublisherImpl.java new file mode 100644 index 00000000..02ae8571 --- /dev/null +++ b/insight-service/insight-messaging/publisher/src/main/java/com/project/imdang/insight/messaging/publisher/InsightDeletedEventMessagePublisherImpl.java @@ -0,0 +1,21 @@ +package com.project.imdang.insight.messaging.publisher; + +import com.project.imdang.insight.domain.ports.output.publisher.InsightDeletedEventMessagePublisher; +import com.project.imdang.insight.messaging.message.InsightDeletedEventMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +@Slf4j +@RequiredArgsConstructor +@Component +public class InsightDeletedEventMessagePublisherImpl implements InsightDeletedEventMessagePublisher { + + private final ApplicationEventPublisher domainEventMessagePublisher; + + @Override + public void publish(InsightDeletedEventMessage insightDeletedEventMessage) { + domainEventMessagePublisher.publishEvent(insightDeletedEventMessage); + } +} diff --git a/insight-service/insight-messaging/publisher/src/test/java/com/project/imdang/insight/messaging/publisher/PublisherApplicationTests.java b/insight-service/insight-messaging/publisher/src/test/java/com/project/imdang/insight/messaging/publisher/PublisherApplicationTests.java new file mode 100644 index 00000000..3304c015 --- /dev/null +++ b/insight-service/insight-messaging/publisher/src/test/java/com/project/imdang/insight/messaging/publisher/PublisherApplicationTests.java @@ -0,0 +1,13 @@ +package com.project.imdang.insight.messaging.publisher; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class PublisherApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/insight-service/insight-messaging/src/main/resources/application.properties b/insight-service/insight-messaging/src/main/resources/application.properties deleted file mode 100644 index 505c2dff..00000000 --- a/insight-service/insight-messaging/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=insight-messaging diff --git a/insight-service/insight-persistence/build.gradle b/insight-service/insight-persistence/build.gradle index c049d055..7dbe7c5c 100644 --- a/insight-service/insight-persistence/build.gradle +++ b/insight-service/insight-persistence/build.gradle @@ -1,6 +1,14 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':insight-service:insight-domain:insight-application-service') + implementation project(':insight-service:insight-domain:insight-domain-core') + implementation project(':common:common-domain:common-domain-core') + implementation project(':member-service:member-service-client:member-service-client-api') + implementation project(':member-service:member-service-client:member-service-client-api-impl') + + implementation project(':infrastructure:aws:s3') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.mysql:mysql-connector-j' } diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/AccuseRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/AccuseRepositoryImpl.java similarity index 62% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/AccuseRepositoryImpl.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/AccuseRepositoryImpl.java index f2704843..27d8ecbc 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/AccuseRepositoryImpl.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/AccuseRepositoryImpl.java @@ -1,12 +1,12 @@ -package com.project.imdang.insight.service.persistence.adapter; +package com.project.imdang.insight.persistence.adapter; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Accuse; -import com.project.imdang.insight.service.domain.ports.output.repository.AccuseRepository; -import com.project.imdang.insight.service.persistence.entity.AccuseEntity; -import com.project.imdang.insight.service.persistence.mapper.AccusePersistenceMapper; -import com.project.imdang.insight.service.persistence.repository.AccuseJpaRepository; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Accuse; +import com.project.imdang.insight.domain.ports.output.repository.AccuseRepository; +import com.project.imdang.insight.persistence.repository.AccuseJpaRepository; +import com.project.imdang.insight.persistence.entity.AccuseEntity; +import com.project.imdang.insight.persistence.mapper.AccusePersistenceMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/DistrictRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/DistrictRepositoryImpl.java similarity index 80% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/DistrictRepositoryImpl.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/DistrictRepositoryImpl.java index 95ebaf7f..a2d906e7 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/DistrictRepositoryImpl.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/DistrictRepositoryImpl.java @@ -1,8 +1,8 @@ -package com.project.imdang.insight.service.persistence.adapter; +package com.project.imdang.insight.persistence.adapter; -import com.project.imdang.insight.service.domain.ports.output.repository.DistrictRepository; -import com.project.imdang.insight.service.domain.valueobject.District; -import com.project.imdang.insight.service.persistence.repository.DistrictJpaRepository; +import com.project.imdang.insight.domain.ports.output.repository.DistrictRepository; +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.insight.persistence.repository.DistrictJpaRepository; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/FileServiceImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/FileServiceImpl.java new file mode 100644 index 00000000..0100b963 --- /dev/null +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/FileServiceImpl.java @@ -0,0 +1,21 @@ +package com.project.imdang.insight.persistence.adapter; + +import com.project.imdang.aws.s3.S3Service; +import com.project.imdang.common.domain.valueobject.File; +import com.project.imdang.insight.domain.ports.output.file.FileService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@RequiredArgsConstructor +@Component +public class FileServiceImpl implements FileService { + + private final S3Service s3Service; + + @Override + public String upload(File file) throws IOException { + return s3Service.upload(file.size(), file.contentType(), file.inputStream()); + } +} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/InsightRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightRepositoryImpl.java similarity index 80% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/InsightRepositoryImpl.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightRepositoryImpl.java index 1c27a6d6..a8a8d3e4 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/InsightRepositoryImpl.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightRepositoryImpl.java @@ -1,16 +1,16 @@ -package com.project.imdang.insight.service.persistence.adapter; +package com.project.imdang.insight.persistence.adapter; -import com.project.imdang.domain.valueobject.BaseId; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.domain.ports.output.repository.InsightRepository; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.District; -import com.project.imdang.insight.service.persistence.entity.InsightEntity; -import com.project.imdang.insight.service.persistence.mapper.InsightPersistenceMapper; -import com.project.imdang.insight.service.persistence.repository.InsightJpaRepository; -import com.project.imdang.insight.service.persistence.repository.InsightSpecification; +import com.project.imdang.common.domain.valueobject.BaseId; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.insight.persistence.repository.InsightJpaRepository; +import com.project.imdang.insight.persistence.repository.InsightSpecification; +import com.project.imdang.insight.persistence.entity.InsightEntity; +import com.project.imdang.insight.persistence.mapper.InsightPersistenceMapper; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/RecommendRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/RecommendRepositoryImpl.java similarity index 64% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/RecommendRepositoryImpl.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/RecommendRepositoryImpl.java index 52d68597..45fa83aa 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/RecommendRepositoryImpl.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/RecommendRepositoryImpl.java @@ -1,12 +1,12 @@ -package com.project.imdang.insight.service.persistence.adapter; +package com.project.imdang.insight.persistence.adapter; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Recommend; -import com.project.imdang.insight.service.domain.ports.output.repository.RecommendRepository; -import com.project.imdang.insight.service.persistence.entity.RecommendEntity; -import com.project.imdang.insight.service.persistence.mapper.RecommendPersistenceMapper; -import com.project.imdang.insight.service.persistence.repository.RecommendJpaRepository; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Recommend; +import com.project.imdang.insight.domain.ports.output.repository.RecommendRepository; +import com.project.imdang.insight.persistence.repository.RecommendJpaRepository; +import com.project.imdang.insight.persistence.entity.RecommendEntity; +import com.project.imdang.insight.persistence.mapper.RecommendPersistenceMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/client/ApartmentComplexApiRestClient.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/client/ApartmentComplexApiRestClient.java new file mode 100644 index 00000000..5dca0bd8 --- /dev/null +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/client/ApartmentComplexApiRestClient.java @@ -0,0 +1,17 @@ +package com.project.imdang.insight.persistence.client; + +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.service.annotation.GetExchange; +import org.springframework.web.service.annotation.HttpExchange; + +@HttpExchange +@Component +public interface ApartmentComplexApiRestClient { + + @GetExchange("/AptIdInfoSvc/v1/getAptInfo") + ApartmentComplexApiResult getApartmentInfoList(@RequestParam(name = "page", defaultValue = "0") Integer page, + @RequestParam(name = "perPage", defaultValue = "10") Integer perPage, + @RequestParam(name = "serviceKey") String serviceKey, + @RequestParam(name = "cond[ADRES::LIKE]") String address); +} diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ApartmentComplexApiResponse.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/client/ApartmentComplexApiResult.java similarity index 85% rename from insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ApartmentComplexApiResponse.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/client/ApartmentComplexApiResult.java index 99d7e912..8b17df69 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/service/application/client/ApartmentComplexApiResponse.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/client/ApartmentComplexApiResult.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.application.client; +package com.project.imdang.insight.persistence.client; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; @@ -8,7 +8,7 @@ @Getter @NoArgsConstructor -public class ApartmentComplexApiResponse { +public class ApartmentComplexApiResult { private Integer page; private Integer perPage; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/ComplexEnvironmentConverter.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/ComplexEnvironmentConverter.java similarity index 60% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/ComplexEnvironmentConverter.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/ComplexEnvironmentConverter.java index 704c6e4c..4b7bb3bc 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/ComplexEnvironmentConverter.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/ComplexEnvironmentConverter.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.persistence.converter; +package com.project.imdang.insight.persistence.converter; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; import jakarta.persistence.Converter; @Converter diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/EnumSetConverter.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/EnumSetConverter.java similarity index 94% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/EnumSetConverter.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/EnumSetConverter.java index ed230d72..0b544ede 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/EnumSetConverter.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/EnumSetConverter.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.persistence.converter; +package com.project.imdang.insight.persistence.converter; import jakarta.persistence.AttributeConverter; import org.apache.logging.log4j.util.Strings; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/InfraConverter.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/InfraConverter.java similarity index 56% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/InfraConverter.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/InfraConverter.java index d2e87d4e..deaddc3b 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/InfraConverter.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/InfraConverter.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.persistence.converter; +package com.project.imdang.insight.persistence.converter; -import com.project.imdang.insight.service.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.Infra; import jakarta.persistence.Converter; @Converter diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/JsonConverter.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/JsonConverter.java similarity index 95% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/JsonConverter.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/JsonConverter.java index 7f4de69b..8afd93bf 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/JsonConverter.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/JsonConverter.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.persistence.converter; +package com.project.imdang.insight.persistence.converter; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/VisitMethodSetConverter.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/VisitMethodSetConverter.java similarity index 62% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/VisitMethodSetConverter.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/VisitMethodSetConverter.java index b36c18bf..bc833d1c 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/VisitMethodSetConverter.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/VisitMethodSetConverter.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.persistence.converter; +package com.project.imdang.insight.persistence.converter; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitMethod; import jakarta.persistence.Converter; @Converter(autoApply = true) diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/VisitTimeSetConverter.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/VisitTimeSetConverter.java similarity index 61% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/VisitTimeSetConverter.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/VisitTimeSetConverter.java index 48ceb4a3..528cedb0 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/VisitTimeSetConverter.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/converter/VisitTimeSetConverter.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.persistence.converter; +package com.project.imdang.insight.persistence.converter; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; +import com.project.imdang.common.domain.valueobject.VisitTime; import jakarta.persistence.Converter; @Converter(autoApply = true) diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/AccuseEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/AccuseEntity.java similarity index 94% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/AccuseEntity.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/AccuseEntity.java index da6ddbe1..f03ffe8c 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/AccuseEntity.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/AccuseEntity.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.persistence.entity; +package com.project.imdang.insight.persistence.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/DistrictEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/DistrictEntity.java similarity index 91% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/DistrictEntity.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/DistrictEntity.java index f8d6bf4c..dc455e7a 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/DistrictEntity.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/DistrictEntity.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.persistence.entity; +package com.project.imdang.insight.persistence.entity; import jakarta.persistence.Entity; import jakarta.persistence.Id; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/InsightEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightEntity.java similarity index 66% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/InsightEntity.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightEntity.java index 06928c73..02ab6695 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/InsightEntity.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightEntity.java @@ -1,20 +1,16 @@ -package com.project.imdang.insight.service.persistence.entity; - -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; -import com.project.imdang.insight.service.persistence.converter.ComplexEnvironmentConverter; -import com.project.imdang.insight.service.persistence.converter.ComplexFacilityConverter; -import com.project.imdang.insight.service.persistence.converter.FavorableNewsConverter; -import com.project.imdang.insight.service.persistence.converter.InfraConverter; -import com.project.imdang.insight.service.persistence.converter.VisitMethodSetConverter; -import com.project.imdang.insight.service.persistence.converter.VisitTimeSetConverter; +package com.project.imdang.insight.persistence.entity; + +import com.project.imdang.common.domain.valueobject.Access; +import com.project.imdang.common.domain.valueobject.Address; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.ComplexEnvironment; +import com.project.imdang.common.domain.valueobject.Infra; +import com.project.imdang.common.domain.valueobject.VisitMethod; +import com.project.imdang.common.domain.valueobject.VisitTime; +import com.project.imdang.insight.persistence.converter.ComplexEnvironmentConverter; +import com.project.imdang.insight.persistence.converter.InfraConverter; +import com.project.imdang.insight.persistence.converter.VisitMethodSetConverter; +import com.project.imdang.insight.persistence.converter.VisitTimeSetConverter; import jakarta.persistence.AttributeOverride; import jakarta.persistence.AttributeOverrides; import jakarta.persistence.Column; @@ -99,14 +95,6 @@ public class InsightEntity { @Column(columnDefinition = "json") private ComplexEnvironment complexEnvironment; - @Convert(converter = ComplexFacilityConverter.class) - @Column(columnDefinition = "json") - private ComplexFacility complexFacility; - - @Convert(converter = FavorableNewsConverter.class) - @Column(columnDefinition = "json") - private FavorableNews favorableNews; - private int recommendedCount; private int accusedCount; private int viewCount; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/RecommendEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/RecommendEntity.java similarity index 94% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/RecommendEntity.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/RecommendEntity.java index 4fac93b6..050ed197 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/RecommendEntity.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/RecommendEntity.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.persistence.entity; +package com.project.imdang.insight.persistence.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/AccusePersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/AccusePersistenceMapper.java similarity index 74% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/AccusePersistenceMapper.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/AccusePersistenceMapper.java index 5fde50bf..015aaa66 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/AccusePersistenceMapper.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/AccusePersistenceMapper.java @@ -1,10 +1,10 @@ -package com.project.imdang.insight.service.persistence.mapper; +package com.project.imdang.insight.persistence.mapper; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Accuse; -import com.project.imdang.insight.service.domain.valueobject.AccuseId; -import com.project.imdang.insight.service.persistence.entity.AccuseEntity; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Accuse; +import com.project.imdang.insight.domain.valueobject.AccuseId; +import com.project.imdang.insight.persistence.entity.AccuseEntity; import org.springframework.stereotype.Component; import java.util.Objects; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/InsightPersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java similarity index 80% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/InsightPersistenceMapper.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java index 1c7f7970..b1b429a1 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/InsightPersistenceMapper.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java @@ -1,9 +1,9 @@ -package com.project.imdang.insight.service.persistence.mapper; +package com.project.imdang.insight.persistence.mapper; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Insight; -import com.project.imdang.insight.service.persistence.entity.InsightEntity; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.persistence.entity.InsightEntity; import org.springframework.stereotype.Component; @Component @@ -24,8 +24,6 @@ public InsightEntity insightToInsightEntity(Insight insight) { .summary(insight.getSummary()) .infra(insight.getInfra()) .complexEnvironment(insight.getComplexEnvironment()) - .complexFacility(insight.getComplexFacility()) - .favorableNews(insight.getFavorableNews()) .recommendedCount(insight.getRecommendedCount()) .accusedCount(insight.getAccusedCount()) .viewCount(insight.getViewCount()) @@ -49,8 +47,6 @@ public Insight insightEntityToInsight(InsightEntity insightEntity) { .summary(insightEntity.getSummary()) .infra(insightEntity.getInfra()) .complexEnvironment(insightEntity.getComplexEnvironment()) - .complexFacility(insightEntity.getComplexFacility()) - .favorableNews(insightEntity.getFavorableNews()) .recommendedCount(insightEntity.getRecommendedCount()) .accusedCount(insightEntity.getAccusedCount()) .viewCount(insightEntity.getViewCount()) diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/RecommendPersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/RecommendPersistenceMapper.java similarity index 75% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/RecommendPersistenceMapper.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/RecommendPersistenceMapper.java index 6fe4c3d3..ac5a3726 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/RecommendPersistenceMapper.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/RecommendPersistenceMapper.java @@ -1,10 +1,10 @@ -package com.project.imdang.insight.service.persistence.mapper; +package com.project.imdang.insight.persistence.mapper; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Recommend; -import com.project.imdang.insight.service.domain.valueobject.RecommendId; -import com.project.imdang.insight.service.persistence.entity.RecommendEntity; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Recommend; +import com.project.imdang.insight.domain.valueobject.RecommendId; +import com.project.imdang.insight.persistence.entity.RecommendEntity; import org.springframework.stereotype.Component; import java.util.Objects; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/AccuseJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/AccuseJpaRepository.java similarity index 69% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/AccuseJpaRepository.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/AccuseJpaRepository.java index 4237232f..e04120de 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/AccuseJpaRepository.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/AccuseJpaRepository.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.persistence.repository; +package com.project.imdang.insight.persistence.repository; -import com.project.imdang.insight.service.persistence.entity.AccuseEntity; +import com.project.imdang.insight.persistence.entity.AccuseEntity; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/DistrictJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/DistrictJpaRepository.java similarity index 85% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/DistrictJpaRepository.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/DistrictJpaRepository.java index 1c6c32dc..2b70081a 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/DistrictJpaRepository.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/DistrictJpaRepository.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.persistence.repository; +package com.project.imdang.insight.persistence.repository; -import com.project.imdang.insight.service.persistence.entity.DistrictEntity; +import com.project.imdang.insight.persistence.entity.DistrictEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/InsightJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightJpaRepository.java similarity index 82% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/InsightJpaRepository.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightJpaRepository.java index 273e6b16..e84f16c7 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/InsightJpaRepository.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightJpaRepository.java @@ -1,7 +1,7 @@ -package com.project.imdang.insight.service.persistence.repository; +package com.project.imdang.insight.persistence.repository; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.persistence.entity.InsightEntity; +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.insight.persistence.entity.InsightEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/InsightSpecification.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightSpecification.java similarity index 94% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/InsightSpecification.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightSpecification.java index ad359034..1fb25be2 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/InsightSpecification.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightSpecification.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.persistence.repository; +package com.project.imdang.insight.persistence.repository; -import com.project.imdang.insight.service.persistence.entity.InsightEntity; +import com.project.imdang.insight.persistence.entity.InsightEntity; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/RecommendJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/RecommendJpaRepository.java similarity index 69% rename from insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/RecommendJpaRepository.java rename to insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/RecommendJpaRepository.java index 7f424662..dafe542c 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/RecommendJpaRepository.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/RecommendJpaRepository.java @@ -1,6 +1,6 @@ -package com.project.imdang.insight.service.persistence.repository; +package com.project.imdang.insight.persistence.repository; -import com.project.imdang.insight.service.persistence.entity.RecommendEntity; +import com.project.imdang.insight.persistence.entity.RecommendEntity; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/ExchangeRequestRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/ExchangeRequestRepositoryImpl.java deleted file mode 100644 index 9ca5ef04..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/ExchangeRequestRepositoryImpl.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.project.imdang.insight.service.persistence.adapter; - -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.ports.output.repository.ExchangeRequestRepository; -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import com.project.imdang.insight.service.persistence.entity.ExchangeRequestEntity; -import com.project.imdang.insight.service.persistence.mapper.ExchangeRequestPersistenceMapper; -import com.project.imdang.insight.service.persistence.repository.ExchangeRequestJpaRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -@RequiredArgsConstructor -@Slf4j -@Component -public class ExchangeRequestRepositoryImpl implements ExchangeRequestRepository { - - private final ExchangeRequestJpaRepository exchangeRequestJpaRepository; - private final ExchangeRequestPersistenceMapper exchangeRequestPersistenceMapper; - - @Transactional - @Override - public ExchangeRequest save(ExchangeRequest exchangeRequest) { - ExchangeRequestEntity exchangeRequestEntity = exchangeRequestPersistenceMapper.exchangeRequestToExchangeRequestEntity(exchangeRequest); - ExchangeRequestEntity saved = exchangeRequestJpaRepository.save(exchangeRequestEntity); - return exchangeRequestPersistenceMapper.exchangeRequestEntityToExchangeRequest(saved); - } - - @Transactional(readOnly = true) - @Override - public Optional findById(ExchangeRequestId exchangeRequestId) { - return exchangeRequestJpaRepository.findById(exchangeRequestId.getValue()) - .map(exchangeRequestPersistenceMapper::exchangeRequestEntityToExchangeRequest); - } - - @Override - public List findByRequestMemberIdAndRequestedInsightId(MemberId requestMemberId, InsightId requestedInsightId) { - return exchangeRequestJpaRepository.findByRequestMemberIdAndRequestedInsightId(requestMemberId.getValue(), requestedInsightId.getValue()).stream() - .map(exchangeRequestPersistenceMapper::exchangeRequestEntityToExchangeRequest) - .collect(Collectors.toList()); - } - - @Override - public List findByRequestedMemberIdAndMemberCouponIdAndRequestMemberInsightId(MemberId requestedMemberId, MemberCouponId memberCouponId, InsightId requestMemberInsightId) { - return exchangeRequestJpaRepository.findByRequestedMemberIdAndMemberCouponIdAndRequestMemberInsightId( - requestedMemberId.getValue(), - memberCouponId != null ? memberCouponId.getValue() : null, - requestMemberInsightId != null ? requestMemberInsightId.getValue() : null).stream() - .map(exchangeRequestPersistenceMapper::exchangeRequestEntityToExchangeRequest) - .collect(Collectors.toList()); - } - - @Override - public List findByRequestMemberInsightIdAndRequestedInsightId(InsightId requestMemberInsightId, InsightId requestedInsightId) { - return exchangeRequestJpaRepository.findByRequestMemberInsightIdAndRequestedInsightId(requestMemberInsightId.getValue(), requestedInsightId.getValue()).stream() - .map(exchangeRequestPersistenceMapper::exchangeRequestEntityToExchangeRequest) - .collect(Collectors.toList()); - } - - @Override - public List findByRequestMemberIdAndRequestedInsightIdAndMemberCouponIsNotNull(MemberId requestMemberId, InsightId requestedInsightId) { - return exchangeRequestJpaRepository.findByRequestMemberIdAndRequestedInsightIdAndMemberCouponIsNotNull(requestMemberId.getValue(), requestedInsightId.getValue()).stream() - .map(exchangeRequestPersistenceMapper::exchangeRequestEntityToExchangeRequest) - .collect(Collectors.toList()); - } - - @Override - public List findByRequestedMemberIdAndRequestMemberInsightId(MemberId requestedMemberId, InsightId requestMemberInsightId) { - return exchangeRequestJpaRepository.findByRequestedMemberIdAndRequestMemberInsightId(requestedMemberId.getValue(), requestMemberInsightId.getValue()).stream() - .map(exchangeRequestPersistenceMapper::exchangeRequestEntityToExchangeRequest) - .collect(Collectors.toList()); - } - - @Override - public Page findAllByRequestMemberIdAndExchangeRequestStatus(MemberId requestMemberId, ExchangeRequestStatus exchangeRequestStatus, PageRequest pageRequest) { - return exchangeRequestJpaRepository.findAllByRequestMemberIdAndStatus(requestMemberId.getValue(), exchangeRequestStatus, pageRequest) - .map(exchangeRequestPersistenceMapper::exchangeRequestEntityToExchangeRequest); - } - - @Override - public Page findAllByRequestedMemberIdAndExchangeRequestStatus(MemberId requestedMemberId, ExchangeRequestStatus exchangeRequestStatus, PageRequest pageRequest) { - return exchangeRequestJpaRepository.findAllByRequestedMemberIdAndStatus(requestedMemberId.getValue(), exchangeRequestStatus, pageRequest) - .map(exchangeRequestPersistenceMapper::exchangeRequestEntityToExchangeRequest); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/FileServiceImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/FileServiceImpl.java deleted file mode 100644 index 04f86739..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/FileServiceImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.project.imdang.insight.service.persistence.adapter; - -import com.project.imdang.aws.s3.S3Service; -import com.project.imdang.insight.service.domain.ports.output.file.FileService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; - -@RequiredArgsConstructor -@Component -public class FileServiceImpl implements FileService { - - private final S3Service s3Service; - - @Override - public String upload(String directory, MultipartFile file) throws IOException { - return s3Service.uploadFile(directory, file); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/InsightMemberLookupImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/InsightMemberLookupImpl.java deleted file mode 100644 index f2a6e14b..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/InsightMemberLookupImpl.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.project.imdang.insight.service.persistence.adapter; - -import com.project.imdang.domain.valueobject.BaseId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.feign.MemberFeignClient; -import com.project.imdang.feign.MemberInfoResponse; -import com.project.imdang.insight.service.domain.ports.output.lookup.InsightMemberLookup; -import com.project.imdang.insight.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpEntity; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; - -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -@RequiredArgsConstructor -@Component -public class InsightMemberLookupImpl implements InsightMemberLookup { - - private final MemberFeignClient memberFeignClient; - - @Override - public Optional lookupByMemberId(MemberId _memberId) { - UUID memberId = _memberId.getValue(); - try { - ResponseEntity responseEntity = memberFeignClient.getMemberInfo(memberId); - return Optional.ofNullable(responseEntity) - .map(HttpEntity::getBody) - .map(memberInfoResponse -> MemberInfo.builder() - .memberId(new MemberId(memberInfoResponse.getMemberId())) - .nickname(memberInfoResponse.getNickname()) - .birthDate(memberInfoResponse.getBirthDate()) - .gender(memberInfoResponse.getGender()) - .deviceToken(memberInfoResponse.getDeviceToken()) - .accusedCount(memberInfoResponse.getAccusedCount()) - .exchangeCount(memberInfoResponse.getExchangeCount()) - .insightCount(memberInfoResponse.getInsightCount()) - .rejectedCount(memberInfoResponse.getRejectedCount()) - .build()); - } catch (Exception e) { - // TODO - 예외 처리 - throw new RuntimeException(e.getMessage()); - } - } - - @Override - public List lookupByMemberIds(List _memberIds) { - List memberIds = _memberIds.stream() - .map(BaseId::getValue) - .toList(); - try { - List memberInfoResponses = memberFeignClient.listMemberInfo(memberIds).getBody(); - if (memberInfoResponses == null) { - return Collections.emptyList(); - } - return memberInfoResponses.stream() - .map(memberInfoResponse -> MemberInfo.builder() - .memberId(new MemberId(memberInfoResponse.getMemberId())) - .nickname(memberInfoResponse.getNickname()) - .birthDate(memberInfoResponse.getBirthDate()) - .gender(memberInfoResponse.getGender()) - .deviceToken(memberInfoResponse.getDeviceToken()) - .accusedCount(memberInfoResponse.getAccusedCount()) - .exchangeCount(memberInfoResponse.getExchangeCount()) - .insightCount(memberInfoResponse.getInsightCount()) - .rejectedCount(memberInfoResponse.getRejectedCount()) - .build()) - .toList(); - } catch (Exception e) { - // TODO - 예외 처리 - throw new RuntimeException(e.getMessage()); - } - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/MemberSnapshotRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/MemberSnapshotRepositoryImpl.java deleted file mode 100644 index 9a00052c..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/MemberSnapshotRepositoryImpl.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.project.imdang.insight.service.persistence.adapter; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.MemberSnapshot; -import com.project.imdang.insight.service.domain.ports.output.repository.MemberSnapshotRepository; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.District; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import com.project.imdang.insight.service.persistence.entity.MemberSnapshotEntity; -import com.project.imdang.insight.service.persistence.mapper.MemberSnapshotPersistenceMapper; -import com.project.imdang.insight.service.persistence.repository.MemberSnapshotJpaRepository; -import jakarta.persistence.Tuple; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Optional; - -@RequiredArgsConstructor -@Component -public class MemberSnapshotRepositoryImpl implements MemberSnapshotRepository { - - private final MemberSnapshotJpaRepository memberSnapshotJpaRepository; - private final MemberSnapshotPersistenceMapper memberSnapshotPersistenceMapper; - - @Override - public Optional findByMemberIdAndInsightId(MemberId memberId, InsightId insightId) { - return memberSnapshotJpaRepository.findByMemberIdAndInsightId(memberId.getValue(), insightId.getValue()) - .map(memberSnapshotPersistenceMapper::memberSnapshotEntityToMemberSnapshot); - } - - @Override - public Page findAllByMemberIdAndDistrict(MemberId memberId, District district, PageRequest pageRequest) { - return memberSnapshotJpaRepository.findAllByMemberIdAndDistrict( - memberId.getValue().toString(), district.getSiDo(), district.getSiGunGu(), district.getEupMyeonDong(), pageRequest) - .map(memberSnapshotPersistenceMapper::memberSnapshotEntityToMemberSnapshot); - } - - @Override - public Page findAllByMemberIdAndApartmentComplex(MemberId memberId, ApartmentComplex apartmentComplex, PageRequest pageRequest) { - return memberSnapshotJpaRepository.findAllByMemberIdAndApartmentComplexName(memberId.getValue().toString(), apartmentComplex.getName(), pageRequest) - .map(memberSnapshotPersistenceMapper::memberSnapshotEntityToMemberSnapshot); - } - - @Override - public Page findAllByMemberIdAndSnapshotMemberId(MemberId memberId, MemberId snapshotMemberId, PageRequest pageRequest) { - return memberSnapshotJpaRepository.findAllByMemberIdAndSnapshotMemberId(memberId.getValue().toString(), snapshotMemberId.getValue().toString(), pageRequest) - .map(memberSnapshotPersistenceMapper::memberSnapshotEntityToMemberSnapshot); - } - - @Override - public Page findAllByMemberIdAndDistrictAndSnapshotMemberId(MemberId memberId, District district, MemberId snapshotMemberId, PageRequest pageRequest) { - return memberSnapshotJpaRepository.findAllByMemberIdAndDistrictAndSnapshotMemberId( - memberId.getValue().toString(), district.getSiDo(), district.getSiGunGu(), district.getEupMyeonDong(), snapshotMemberId.getValue().toString(), pageRequest) - .map(memberSnapshotPersistenceMapper::memberSnapshotEntityToMemberSnapshot); - } - - @Override - public Page findAllByMemberIdAndApartmentComplexAndSnapshotMemberId(MemberId memberId, ApartmentComplex apartmentComplex, MemberId snapshotMemberId, PageRequest pageRequest) { - return memberSnapshotJpaRepository.findAllByMemberIdAndApartmentComplexNameAndSnapshotMemberId(memberId.getValue().toString(), apartmentComplex.getName(), snapshotMemberId.getValue().toString(), pageRequest) - .map(memberSnapshotPersistenceMapper::memberSnapshotEntityToMemberSnapshot); - } - - @Override - public List findAllDistinctDistrictByMemberId(MemberId memberId) { - return memberSnapshotJpaRepository.findAllDistinctDistrictByMemberId(memberId.getValue().toString()); - } - - @Override - public List findAllDistinctApartmentComplexAndInsightCountByMemberIdAndDistrict(MemberId memberId, District district) { - return memberSnapshotJpaRepository.findAllDistinctApartmentComplexAndInsightCountByMemberIdAndDistrict(memberId.getValue().toString(), district.getSiDo(), district.getSiGunGu(), district.getEupMyeonDong()); - } - - @Override - public Long[] countAllByMemberIdAndDistrict(MemberId memberId, District district) { - Tuple tuple = memberSnapshotJpaRepository.countAllByMemberIdAndDistrict(memberId.getValue().toString(), district.getSiDo(), district.getSiGunGu(), district.getEupMyeonDong()); - Long apartmentComplexCount = tuple.get("apartment_complex_count", Long.class); - Long insightCount = tuple.get("insight_count", Long.class); - return new Long[]{apartmentComplexCount, insightCount}; - } - - @Override - public MemberSnapshot save(MemberSnapshot memberSnapshot) { - MemberSnapshotEntity memberSnapshotEntity = memberSnapshotPersistenceMapper.memberSnapshotToMemberSnapshotEntity(memberSnapshot); - MemberSnapshotEntity saved = memberSnapshotJpaRepository.save(memberSnapshotEntity); - return memberSnapshotPersistenceMapper.memberSnapshotEntityToMemberSnapshot(saved); - } - - @Override - public void updateSnapshotIdByMemberIdAndInsightId(SnapshotId snapshotId, MemberId memberId, InsightId insightId) { - MemberSnapshotEntity memberSnapshotEntity = memberSnapshotJpaRepository.findByMemberIdAndInsightId(memberId.getValue(), insightId.getValue()) - // TODO - 예외 처리 - .orElseThrow(RuntimeException::new); - memberSnapshotEntity.setSnapshotId(snapshotId.getValue()); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/SnapshotRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/SnapshotRepositoryImpl.java deleted file mode 100644 index 6a3dd78f..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/adapter/SnapshotRepositoryImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.project.imdang.insight.service.persistence.adapter; - -import com.project.imdang.domain.valueobject.BaseId; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.ports.output.repository.SnapshotRepository; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import com.project.imdang.insight.service.persistence.entity.SnapshotEntity; -import com.project.imdang.insight.service.persistence.mapper.SnapshotPersistenceMapper; -import com.project.imdang.insight.service.persistence.repository.SnapshotJpaRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Optional; - -@RequiredArgsConstructor -@Component -public class SnapshotRepositoryImpl implements SnapshotRepository { - - private final SnapshotJpaRepository snapshotJpaRepository; - private final SnapshotPersistenceMapper snapshotPersistenceMapper; - - @Override - public Snapshot save(Snapshot snapshot) { - SnapshotEntity snapshotEntity = snapshotPersistenceMapper.snapshotToSnapshotEntity(snapshot); - SnapshotEntity saved = snapshotJpaRepository.save(snapshotEntity); - return snapshotPersistenceMapper.snapshotEntityToSnapshot(saved); - } - - @Override - public Optional findById(SnapshotId snapshotId) { - return snapshotJpaRepository.findById(snapshotId.getValue()) - .map(snapshotPersistenceMapper::snapshotEntityToSnapshot); - } - - @Override - public Optional findLatestByInsightId(InsightId insightId) { - return snapshotJpaRepository.findTopByInsightIdEqualsOrderByIdDesc(insightId.getValue()) - .map(snapshotPersistenceMapper::snapshotEntityToSnapshot); - } - - @Override - public List findAllByIds(List snapshotIds) { - List ids = snapshotIds.stream().map(BaseId::getValue).toList(); - return snapshotJpaRepository.findAllById(ids).stream() - .map(snapshotPersistenceMapper::snapshotEntityToSnapshot) - .toList(); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/ComplexFacilityConverter.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/ComplexFacilityConverter.java deleted file mode 100644 index 42b19127..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/ComplexFacilityConverter.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.persistence.converter; - -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import jakarta.persistence.Converter; - -@Converter -public class ComplexFacilityConverter extends JsonConverter { - - public ComplexFacilityConverter() { - super(ComplexFacility.class); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/FavorableNewsConverter.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/FavorableNewsConverter.java deleted file mode 100644 index 3709555b..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/converter/FavorableNewsConverter.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.insight.service.persistence.converter; - -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import jakarta.persistence.Converter; - -@Converter -public class FavorableNewsConverter extends JsonConverter { - - public FavorableNewsConverter() { - super(FavorableNews.class); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/ExchangeRequestEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/ExchangeRequestEntity.java deleted file mode 100644 index 240d0056..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/ExchangeRequestEntity.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.project.imdang.insight.service.persistence.entity; - -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; - -import java.time.ZonedDateTime; -import java.util.UUID; - -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter -@Table(name = "exchange_request") -@Entity -public class ExchangeRequestEntity { - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - @Id - private UUID id; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID requestMemberId; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID requestMemberInsightId; - private Long requestMemberSnapshotId; - // OR - private Long memberCouponId; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID requestedInsightId; - private Long requestedSnapshotId; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID requestedMemberId; - - private ZonedDateTime requestedAt; - private ZonedDateTime respondedAt; - - @Enumerated(EnumType.STRING) - private ExchangeRequestStatus status; -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/MemberSnapshotEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/MemberSnapshotEntity.java deleted file mode 100644 index 00703c94..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/MemberSnapshotEntity.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.project.imdang.insight.service.persistence.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; - -import java.time.ZonedDateTime; -import java.util.UUID; - -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter @Setter -@Table(name = "member_snapshot") -@Entity -public class MemberSnapshotEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - // TODO - CHECK : 복합키 - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID memberId; - private Long snapshotId; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID insightId; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID exchangeRequestId; - - private ZonedDateTime createdAt; -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/SnapshotEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/SnapshotEntity.java deleted file mode 100644 index 9ebadd71..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/entity/SnapshotEntity.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.project.imdang.insight.service.persistence.entity; - -import com.project.imdang.insight.service.domain.valueobject.Access; -import com.project.imdang.insight.service.domain.valueobject.Address; -import com.project.imdang.insight.service.domain.valueobject.ApartmentComplex; -import com.project.imdang.insight.service.domain.valueobject.ComplexEnvironment; -import com.project.imdang.insight.service.domain.valueobject.ComplexFacility; -import com.project.imdang.insight.service.domain.valueobject.FavorableNews; -import com.project.imdang.insight.service.domain.valueobject.Infra; -import com.project.imdang.insight.service.domain.valueobject.VisitMethod; -import com.project.imdang.insight.service.domain.valueobject.VisitTime; -import com.project.imdang.insight.service.persistence.converter.ComplexFacilityConverter; -import com.project.imdang.insight.service.persistence.converter.FavorableNewsConverter; -import com.project.imdang.insight.service.persistence.converter.InfraConverter; -import com.project.imdang.insight.service.persistence.converter.VisitMethodSetConverter; -import com.project.imdang.insight.service.persistence.converter.VisitTimeSetConverter; -import com.project.imdang.insight.service.persistence.converter.ComplexEnvironmentConverter; -import jakarta.persistence.AttributeOverride; -import jakarta.persistence.AttributeOverrides; -import jakarta.persistence.Column; -import jakarta.persistence.Convert; -import jakarta.persistence.Embedded; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; - -import java.time.LocalDate; -import java.util.Set; -import java.util.UUID; - -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter @Setter -@Table(name = "snapshot") -@Entity -public class SnapshotEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID insightId; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID memberId; - - private String mainImage; - private String title; - - @Embedded - @AttributeOverrides({ - @AttributeOverride(name = "siDo", column = @Column(name = "address_si_do")), - @AttributeOverride(name = "siGunGu", column = @Column(name = "address_si_gun_gu")), - @AttributeOverride(name = "eupMyeonDong", column = @Column(name = "address_eup_myeon_dong")), - @AttributeOverride(name = "roadName", column = @Column(name = "address_road_name")), - @AttributeOverride(name = "buildingNumber", column = @Column(name = "address_building_number")), - @AttributeOverride(name = "detail", column = @Column(name = "address_detail")), - @AttributeOverride(name = "latitude", column = @Column(name = "address_latitude")), - @AttributeOverride(name = "longitude", column = @Column(name = "address_longitude")) - }) - private Address address; - - @Embedded - @AttributeOverrides({ - @AttributeOverride(name = "name", column = @Column(name = "complex_name")), - }) - private ApartmentComplex apartmentComplex; - - private LocalDate visitAt; - - @Convert(converter = VisitTimeSetConverter.class) - private Set visitTimes; - @Convert(converter = VisitMethodSetConverter.class) - private Set visitMethods; - @Enumerated(EnumType.STRING) - private Access access; - - private String summary; - - // TODO - CHECK : 한번에 Convert? - @Convert(converter = InfraConverter.class) - @Column(columnDefinition = "json") - private Infra infra; - - @Convert(converter = ComplexEnvironmentConverter.class) - @Column(columnDefinition = "json") - private ComplexEnvironment complexEnvironment; - - @Convert(converter = ComplexFacilityConverter.class) - @Column(columnDefinition = "json") - private ComplexFacility complexFacility; - - @Convert(converter = FavorableNewsConverter.class) - @Column(columnDefinition = "json") - private FavorableNews favorableNews; -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/exception/ExchangeRequestPersistenceException.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/exception/ExchangeRequestPersistenceException.java deleted file mode 100644 index 95ae3a4c..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/exception/ExchangeRequestPersistenceException.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.project.imdang.insight.service.persistence.exception; - -public class ExchangeRequestPersistenceException extends RuntimeException { -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/ExchangeRequestPersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/ExchangeRequestPersistenceMapper.java deleted file mode 100644 index 8ac5bc2f..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/ExchangeRequestPersistenceMapper.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.project.imdang.insight.service.persistence.mapper; - -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.ExchangeRequest; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import com.project.imdang.insight.service.persistence.entity.ExchangeRequestEntity; -import org.springframework.stereotype.Component; - -@Component -public class ExchangeRequestPersistenceMapper { - - public ExchangeRequestEntity exchangeRequestToExchangeRequestEntity(ExchangeRequest exchangeRequest) { - return ExchangeRequestEntity.builder() - .id(exchangeRequest.getId().getValue()) - .requestMemberId(exchangeRequest.getRequestMemberId().getValue()) - .requestMemberInsightId( - exchangeRequest.getRequestMemberInsightId() != null ? - exchangeRequest.getRequestMemberInsightId().getValue() : null) - .requestMemberSnapshotId( - exchangeRequest.getRequestMemberSnapshotId() != null ? - exchangeRequest.getRequestMemberSnapshotId().getValue() : null) - .memberCouponId( - exchangeRequest.getMemberCouponId() != null ? - exchangeRequest.getMemberCouponId().getValue() : null) - .requestedInsightId(exchangeRequest.getRequestedInsightId().getValue()) - .requestedSnapshotId(exchangeRequest.getRequestedSnapshotId().getValue()) - .requestedMemberId(exchangeRequest.getRequestedMemberId().getValue()) - .requestedAt(exchangeRequest.getRequestedAt()) - .respondedAt(exchangeRequest.getRespondedAt()) - .status(exchangeRequest.getStatus()) - .build(); - } - - public ExchangeRequest exchangeRequestEntityToExchangeRequest(ExchangeRequestEntity exchangeRequestEntity) { - return ExchangeRequest.builder() - .id(new ExchangeRequestId(exchangeRequestEntity.getId())) - .requestMemberId(new MemberId(exchangeRequestEntity.getRequestMemberId())) - .requestMemberInsightId( - exchangeRequestEntity.getRequestMemberInsightId() != null ? - new InsightId(exchangeRequestEntity.getRequestMemberInsightId()) : null) - .requestMemberSnapshotId( - exchangeRequestEntity.getRequestMemberSnapshotId() != null ? - new SnapshotId(exchangeRequestEntity.getRequestMemberSnapshotId()) : null) - .memberCouponId( - exchangeRequestEntity.getMemberCouponId() != null ? - new MemberCouponId(exchangeRequestEntity.getMemberCouponId()) : null) - .requestedInsightId(new InsightId(exchangeRequestEntity.getRequestedInsightId())) - .requestedSnapshotId(new SnapshotId(exchangeRequestEntity.getRequestedSnapshotId())) - .requestedMemberId(new MemberId(exchangeRequestEntity.getRequestedMemberId())) - .requestedAt(exchangeRequestEntity.getRequestedAt()) - .respondedAt(exchangeRequestEntity.getRespondedAt()) - .status(exchangeRequestEntity.getStatus()) - .build(); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/MemberSnapshotPersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/MemberSnapshotPersistenceMapper.java deleted file mode 100644 index 269161c5..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/MemberSnapshotPersistenceMapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.project.imdang.insight.service.persistence.mapper; - -import com.project.imdang.domain.valueobject.ExchangeRequestId; -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.MemberSnapshot; -import com.project.imdang.insight.service.domain.valueobject.MemberSnapshotId; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import com.project.imdang.insight.service.persistence.entity.MemberSnapshotEntity; -import org.springframework.stereotype.Component; - -@Component -public class MemberSnapshotPersistenceMapper { - - public MemberSnapshotEntity memberSnapshotToMemberSnapshotEntity(MemberSnapshot memberSnapshot) { - return MemberSnapshotEntity.builder() - .id(memberSnapshot.getId() != null ? - memberSnapshot.getId().getValue() : null) - .memberId(memberSnapshot.getMemberId().getValue()) - .snapshotId(memberSnapshot.getSnapshotId().getValue()) - .insightId(memberSnapshot.getInsightId().getValue()) - .exchangeRequestId(memberSnapshot.getExchangeRequestId() != null ? - memberSnapshot.getExchangeRequestId().getValue() : null) - .createdAt(memberSnapshot.getCreatedAt()) - .build(); - } - - public MemberSnapshot memberSnapshotEntityToMemberSnapshot(MemberSnapshotEntity memberSnapshotEntity) { - return MemberSnapshot.builder() - .id(new MemberSnapshotId(memberSnapshotEntity.getId())) - .memberId(new MemberId(memberSnapshotEntity.getMemberId())) - .snapshotId(new SnapshotId(memberSnapshotEntity.getSnapshotId())) - .insightId(new InsightId(memberSnapshotEntity.getInsightId())) - .exchangeRequestId(memberSnapshotEntity.getExchangeRequestId() != null ? - new ExchangeRequestId(memberSnapshotEntity.getExchangeRequestId()) : null) - .createdAt(memberSnapshotEntity.getCreatedAt()) - .build(); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/SnapshotPersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/SnapshotPersistenceMapper.java deleted file mode 100644 index 0ec38a2c..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/mapper/SnapshotPersistenceMapper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.project.imdang.insight.service.persistence.mapper; - -import com.project.imdang.domain.valueobject.InsightId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.insight.service.domain.entity.Snapshot; -import com.project.imdang.insight.service.domain.valueobject.SnapshotId; -import com.project.imdang.insight.service.persistence.entity.SnapshotEntity; -import org.springframework.stereotype.Component; - -import java.util.Objects; - -@Component -public class SnapshotPersistenceMapper { - - public SnapshotEntity snapshotToSnapshotEntity(Snapshot snapshot) { - return SnapshotEntity.builder() - .id(!Objects.isNull(snapshot.getId()) ? snapshot.getId().getValue() : null) - .insightId(snapshot.getInsightId().getValue()) - .memberId(snapshot.getMemberId().getValue()) - .mainImage(snapshot.getMainImage()) - .title(snapshot.getTitle()) - .address(snapshot.getAddress()) - .apartmentComplex(snapshot.getApartmentComplex()) - .visitAt(snapshot.getVisitAt()) - .visitTimes(snapshot.getVisitTimes()) - .visitMethods(snapshot.getVisitMethods()) - .access(snapshot.getAccess()) - .summary(snapshot.getSummary()) - .infra(snapshot.getInfra()) - .complexEnvironment(snapshot.getComplexEnvironment()) - .complexFacility(snapshot.getComplexFacility()) - .favorableNews(snapshot.getFavorableNews()) - .build(); - } - - public Snapshot snapshotEntityToSnapshot(SnapshotEntity snapshotEntity) { - return Snapshot.builder() - .id(new SnapshotId(snapshotEntity.getId())) - .insightId(new InsightId(snapshotEntity.getInsightId())) - .memberId(new MemberId(snapshotEntity.getMemberId())) - .mainImage(snapshotEntity.getMainImage()) - .title(snapshotEntity.getTitle()) - .address(snapshotEntity.getAddress()) - .apartmentComplex(snapshotEntity.getApartmentComplex()) - .visitAt(snapshotEntity.getVisitAt()) - .visitTimes(snapshotEntity.getVisitTimes()) - .visitMethods(snapshotEntity.getVisitMethods()) - .access(snapshotEntity.getAccess()) - .summary(snapshotEntity.getSummary()) - .infra(snapshotEntity.getInfra()) - .complexEnvironment(snapshotEntity.getComplexEnvironment()) - .complexFacility(snapshotEntity.getComplexFacility()) - .favorableNews(snapshotEntity.getFavorableNews()) - .build(); - } -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/ExchangeRequestJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/ExchangeRequestJpaRepository.java deleted file mode 100644 index 2bb3e8b2..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/ExchangeRequestJpaRepository.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.insight.service.persistence.repository; - -import com.project.imdang.insight.service.domain.valueobject.ExchangeRequestStatus; -import com.project.imdang.insight.service.persistence.entity.ExchangeRequestEntity; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.UUID; - -@Repository -public interface ExchangeRequestJpaRepository extends JpaRepository { - List findByRequestMemberIdAndRequestedInsightId(UUID requestMemberId, UUID requestedInsightId); - List findByRequestedMemberIdAndMemberCouponIdAndRequestMemberInsightId(UUID requestedMemberId, Long memberCouponId, UUID requestMemberInsightId); - List findByRequestMemberInsightIdAndRequestedInsightId(UUID requestMemberInsightId, UUID requestedInsightId); - - @Query("select er from ExchangeRequestEntity er where er.requestMemberId = :requestMemberId and er.requestedInsightId = :requestedInsightId and er.memberCouponId is not null") - List findByRequestMemberIdAndRequestedInsightIdAndMemberCouponIsNotNull(UUID requestMemberId, UUID requestedInsightId); - List findByRequestedMemberIdAndRequestMemberInsightId(UUID requestedMemberId, UUID requestMemberInsightId); - - Page findAllByRequestMemberIdAndStatus(UUID requestMemberId, ExchangeRequestStatus status, Pageable pageable); - Page findAllByRequestedMemberIdAndStatus(UUID requestedMemberId, ExchangeRequestStatus status, Pageable pageable); -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/MemberSnapshotJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/MemberSnapshotJpaRepository.java deleted file mode 100644 index 655e8897..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/MemberSnapshotJpaRepository.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.project.imdang.insight.service.persistence.repository; - -import com.project.imdang.insight.service.persistence.entity.MemberSnapshotEntity; -import jakarta.persistence.Tuple; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface MemberSnapshotJpaRepository extends JpaRepository { - - Optional findByMemberIdAndInsightId(UUID memberId, UUID insightId); - - @Query(value = "select ms.* from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.address_si_do = :siDo and s.address_si_gun_gu = :siGunGu and s.address_eup_myeon_dong = :eupMyeonDong \n-- #pageRequest\n", - countQuery = "select count(*) from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.address_si_do = :siDo and s.address_si_gun_gu = :siGunGu and s.address_eup_myeon_dong = :eupMyeonDong", - nativeQuery = true) - Page findAllByMemberIdAndDistrict(String memberId, String siDo, String siGunGu, String eupMyeonDong, Pageable pageable); - - @Query(value = "select ms.* from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.complex_name = :apartmentComplexName \n-- #pageRequest\n", - countQuery = "select count(*) from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.complex_name = :apartmentComplexName", - nativeQuery = true) - Page findAllByMemberIdAndApartmentComplexName(String memberId, String apartmentComplexName, PageRequest pageRequest); - - @Query(value = "select ms.* from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.member_id = :snapshotMemberId \n-- #pageRequest\n", - countQuery = "select count(*) from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.member_id = :snapshotMemberId", - nativeQuery = true) - Page findAllByMemberIdAndSnapshotMemberId(String memberId, String snapshotMemberId, Pageable pageable); - - @Query(value = "select ms.* from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.address_si_do = :siDo and s.address_si_gun_gu = :siGunGu and s.address_eup_myeon_dong = :eupMyeonDong " + - "and s.member_id = :snapshotMemberId \n-- #pageRequest\n", - countQuery = "select count(*) from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.address_si_do = :siDo and s.address_si_gun_gu = :siGunGu and s.address_eup_myeon_dong = :eupMyeonDong " + - "and s.member_id = :snapshotMemberId ", - nativeQuery = true) - Page findAllByMemberIdAndDistrictAndSnapshotMemberId(String memberId, String siDo, String siGunGu, String eupMyeonDong, String snapshotMemberId, Pageable pageable); - - @Query(value = "select ms.* from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.complex_name = :apartmentComplexName and s.member_id = :snapshotMemberId \n-- #pageRequest\n", - countQuery = "select count(*) from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.complex_name = :apartmentComplexName and s.member_id = :snapshotMemberId", - nativeQuery = true) - Page findAllByMemberIdAndApartmentComplexNameAndSnapshotMemberId(String memberId, String apartmentComplexName, String snapshotMemberId, PageRequest pageRequest); - - @Query(value = "select distinct s.address_si_do, s.address_si_gun_gu, s.address_eup_myeon_dong " + - "from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id where ms.member_id = :memberId", - nativeQuery = true) - List findAllDistinctDistrictByMemberId(String memberId); - - @Query(value = "select s.complex_name, count(*) from member_snapshot ms inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.address_si_do = :siDo and s.address_si_gun_gu = :siGunGu and s.address_eup_myeon_dong = :eupMyeonDong " + - "group by s.complex_name", - nativeQuery = true) - List findAllDistinctApartmentComplexAndInsightCountByMemberIdAndDistrict(String memberId, String siDo, String siGunGu, String eupMyeonDong); - - @Query(value = "select count(distinct s.complex_name) as apartment_complex_count, count(*) as insight_count from member_snapshot ms " + - "inner join snapshot s on ms.snapshot_id = s.id " + - "where ms.member_id = :memberId and s.address_si_do = :siDo and s.address_si_gun_gu = :siGunGu and s.address_eup_myeon_dong = :eupMyeonDong ", - nativeQuery = true) - Tuple countAllByMemberIdAndDistrict(String memberId, String siDo, String siGunGu, String eupMyeonDong); -} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/SnapshotJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/SnapshotJpaRepository.java deleted file mode 100644 index a8c24b3f..00000000 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/service/persistence/repository/SnapshotJpaRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.imdang.insight.service.persistence.repository; - -import com.project.imdang.insight.service.persistence.entity.SnapshotEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; -import java.util.UUID; - -@Repository -public interface SnapshotJpaRepository extends JpaRepository { - Optional findTopByInsightIdEqualsOrderByIdDesc(UUID insightId); -} diff --git a/member-service/member-application/build.gradle b/member-service/member-application/build.gradle index c049d055..d48df206 100644 --- a/member-service/member-application/build.gradle +++ b/member-service/member-application/build.gradle @@ -1,6 +1,13 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':member-service:member-domain:member-application-service') + implementation project(':common:common-application') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.data:spring-data-commons' + implementation 'org.springframework.boot:spring-boot-starter-security' + + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' } diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/AppleLoginRequest.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/AppleLoginRequest.java new file mode 100644 index 00000000..80cd7abb --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/AppleLoginRequest.java @@ -0,0 +1,6 @@ +package com.project.imdang.member.application.dto.auth; + +public record AppleLoginRequest( + String authorizationCode +) { +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/GoogleLoginRequest.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/GoogleLoginRequest.java new file mode 100644 index 00000000..c20cada9 --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/GoogleLoginRequest.java @@ -0,0 +1,6 @@ +package com.project.imdang.member.application.dto.auth; + +public record GoogleLoginRequest( + String accessToken +) { +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/JoinMemberRequest.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/JoinMemberRequest.java new file mode 100644 index 00000000..8156eca6 --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/JoinMemberRequest.java @@ -0,0 +1,11 @@ +package com.project.imdang.member.application.dto.auth; + +import com.project.imdang.common.domain.valueobject.Gender; + +public record JoinMemberRequest( + String nickname, + String birthDate, + Gender gender, + String deviceToken +) { +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/KakaoLoginRequest.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/KakaoLoginRequest.java new file mode 100644 index 00000000..98c49c47 --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/KakaoLoginRequest.java @@ -0,0 +1,6 @@ +package com.project.imdang.member.application.dto.auth; + +public record KakaoLoginRequest( + String accessToken +) { +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/MockLoginRequest.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/MockLoginRequest.java new file mode 100644 index 00000000..76dbf6a1 --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/MockLoginRequest.java @@ -0,0 +1,6 @@ +package com.project.imdang.member.application.dto.auth; + +public record MockLoginRequest( + String id +) { +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/ReissueTokenRequest.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/ReissueTokenRequest.java new file mode 100644 index 00000000..e3ddd310 --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/auth/ReissueTokenRequest.java @@ -0,0 +1,6 @@ +package com.project.imdang.member.application.dto.auth; + +import java.util.UUID; + +public record ReissueTokenRequest(UUID memberId, String refreshToken) { +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/member/OAuthWithdrawRequest.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/member/OAuthWithdrawRequest.java new file mode 100644 index 00000000..e40f7cbb --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/dto/member/OAuthWithdrawRequest.java @@ -0,0 +1,6 @@ +package com.project.imdang.member.application.dto.member; + +public record OAuthWithdrawRequest( + String token +) { +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/rest/AuthController.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/rest/AuthController.java new file mode 100644 index 00000000..0822adb2 --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/rest/AuthController.java @@ -0,0 +1,137 @@ +package com.project.imdang.member.application.rest; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.application.dto.auth.AppleLoginRequest; +import com.project.imdang.member.application.dto.auth.GoogleLoginRequest; +import com.project.imdang.member.application.dto.auth.JoinMemberRequest; +import com.project.imdang.member.application.dto.auth.KakaoLoginRequest; +import com.project.imdang.member.application.dto.auth.MockLoginRequest; +import com.project.imdang.member.application.dto.auth.ReissueTokenRequest; +import com.project.imdang.member.domain.dto.auth.JoinMemberCommand; +import com.project.imdang.member.domain.dto.auth.LoginResult; +import com.project.imdang.member.domain.dto.auth.ReissueTokenCommand; +import com.project.imdang.member.domain.dto.auth.ReissueTokenResult; +import com.project.imdang.member.domain.dto.auth.TokenResult; +import com.project.imdang.member.domain.dto.auth.apple.AppleLoginCommand; +import com.project.imdang.member.domain.dto.auth.google.GoogleLoginCommand; +import com.project.imdang.member.domain.dto.auth.kakao.KakaoLoginCommand; +import com.project.imdang.member.domain.dto.auth.mock.MockLoginCommand; +import com.project.imdang.member.domain.ports.input.service.AuthApplicationService; +import io.swagger.v3.oas.annotations.Operation; +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 jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.UUID; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/auth") +@Tag(name = "AuthController", description = "로그인 및 온보딩 API") +public class AuthController { + + private final AuthApplicationService authApplicationService; + + /** + * 카카오 로그인 + */ + @Operation(description = "카카오 로그인 API") + @ApiResponse(responseCode = "200", description = "카카오 로그인에 성공하였습니다.", + content = @Content(schema = @Schema(implementation = LoginResult.class))) + @PostMapping("/kakao") + public ResponseEntity login(@RequestBody KakaoLoginRequest kakaoLoginRequest) { + KakaoLoginCommand kakaoLoginCommand = KakaoLoginCommand.builder() + .accessToken(kakaoLoginRequest.accessToken()) + .build(); + LoginResult loginResult = authApplicationService.login(kakaoLoginCommand); + return ResponseEntity.ok(loginResult); + } + + /** + * 애플 로그인 + */ + @Operation(description = "애플 로그인 API") + @ApiResponse(responseCode = "200", description = "애플 로그인에 성공하였습니다.", + content = @Content(schema = @Schema(implementation = LoginResult.class))) + @PostMapping("/apple") + public ResponseEntity login(@RequestBody AppleLoginRequest appleLoginRequest) { + AppleLoginCommand appleLoginCommand = AppleLoginCommand.builder() + .authorizationCode(appleLoginRequest.authorizationCode()) + .build(); + LoginResult loginResult = authApplicationService.login(appleLoginCommand); + return ResponseEntity.ok(loginResult); + } + + /** + * 구글 로그인 + */ + @Operation(description = "구글 로그인 API") + @ApiResponse(responseCode = "200", description = "구글 로그인에 성공하였습니다.", + content = @Content(schema = @Schema(implementation = LoginResult.class))) + @PostMapping("/google") + public ResponseEntity login(@RequestBody GoogleLoginRequest googleLoginRequest) { + GoogleLoginCommand googleLoginCommand = GoogleLoginCommand.builder() + .accessToken(googleLoginRequest.accessToken()) + .build(); + LoginResult loginResult = authApplicationService.login(googleLoginCommand); + return ResponseEntity.ok(loginResult); + } + + @PostMapping("/mock") + public ResponseEntity login(@RequestBody MockLoginRequest mockLoginRequest) { + MockLoginCommand mockLoginCommand = MockLoginCommand.builder() + .id(mockLoginRequest.id()) + .build(); + LoginResult loginResult = authApplicationService.login(mockLoginCommand); + return ResponseEntity.ok(loginResult); + } + + /** + * 회원가입 + */ + @Operation(description = "온보딩 API") + @ApiResponse(responseCode = "200", description = "온보딩이 완료되었습니다.") + @PutMapping("/join") + public ResponseEntity join(@AuthenticationPrincipal UUID memberId, + @RequestBody @Valid JoinMemberRequest joinMemberRequest) { + JoinMemberCommand joinMemberCommand = JoinMemberCommand.builder() + .memberId(new MemberId(memberId)) + .nickname(joinMemberRequest.nickname()) + .birthDate(joinMemberRequest.birthDate()) + .gender(joinMemberRequest.gender()) + .deviceToken(joinMemberRequest.deviceToken()) + .build(); + authApplicationService.join(joinMemberCommand); + return ResponseEntity.ok().build(); + } + + /** + * 토큰 재발급 + */ + @Operation(description = "토큰 재발급 API") + @ApiResponse(responseCode = "200", description = "토큰 재발급 완료") + @PostMapping("/reissue") + public ResponseEntity reissue(@RequestBody @Valid ReissueTokenRequest reissueTokenRequest) { + ReissueTokenCommand reissueTokenCommand = ReissueTokenCommand.builder() + .memberId(new MemberId(reissueTokenRequest.memberId())) + .refreshToken(reissueTokenRequest.refreshToken()) + .build(); + TokenResult tokenResult = authApplicationService.reissue(reissueTokenCommand); + ReissueTokenResult response = ReissueTokenResult.builder() + .accessToken(tokenResult.getAccessToken()) + .refreshToken(tokenResult.getRefreshToken()) + .expiresIn(tokenResult.getExpiresIn()) + .build(); + return ResponseEntity.ok(response); + } +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/application/rest/MemberController.java b/member-service/member-application/src/main/java/com/project/imdang/member/application/rest/MemberController.java new file mode 100644 index 00000000..2cfa14ff --- /dev/null +++ b/member-service/member-application/src/main/java/com/project/imdang/member/application/rest/MemberController.java @@ -0,0 +1,127 @@ +package com.project.imdang.member.application.rest; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.application.dto.member.OAuthWithdrawRequest; +import com.project.imdang.member.domain.dto.member.MemberResult; +import com.project.imdang.member.domain.dto.member.MyPageInfoResult; +import com.project.imdang.member.domain.dto.member.apple.AppleWithdrawCommand; +import com.project.imdang.member.domain.dto.member.google.GoogleWithdrawCommand; +import com.project.imdang.member.domain.dto.member.kakao.KakaoWithdrawCommand; +import com.project.imdang.member.domain.ports.input.service.MemberApplicationService; +import io.swagger.v3.oas.annotations.Operation; +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 jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.UUID; + +@RestController +@RequiredArgsConstructor +@Slf4j +@Tag(name = "MemberController", description = "마이페이지 API") +@RequestMapping("/members") +public class MemberController { + + private final MemberApplicationService memberApplicationService; + + @Operation(description = "마이페이지 API") + @ApiResponse(responseCode = "200", description = "마이페이지 조회 성공", + content = @Content(schema = @Schema(implementation = MyPageInfoResult.class))) + @GetMapping("/detail") + public ResponseEntity detail(@AuthenticationPrincipal UUID memberId) { + MyPageInfoResult myPageInfoResult = memberApplicationService.detailMyPage(new MemberId(memberId)); + log.info("MyPage of Member[id : {}] is viewed.", memberId); + return ResponseEntity.ok(myPageInfoResult); + } + + @GetMapping("/info") + public ResponseEntity info(@RequestParam UUID memberId) { + MemberResult memberResult = memberApplicationService.detailMember(new MemberId(memberId)); + log.info("Member[id :{}] is retrieved.", memberId); + return ResponseEntity.ok(memberResult); + } + + @GetMapping + public ResponseEntity> list(@RequestParam List memberIds) { + List ids = memberIds.stream() + .map(MemberId::new) + .toList(); + List memberResults = memberApplicationService.listMember(ids); + return ResponseEntity.ok(memberResults); + } + + /** + * 로그아웃 + */ + @Operation(description = "로그아웃 API") + @ApiResponse(responseCode = "200", description = "로그아웃 완료") + @PostMapping("/logout") + public ResponseEntity logout(@AuthenticationPrincipal UUID memberId) { + memberApplicationService.logout(new MemberId(memberId)); + return ResponseEntity.ok().build(); + } + + // TODO - API 통합 +/* + @Operation(description = "회원 탈퇴 API") + @ApiResponse(responseCode = "200", description = "탈퇴 완료") + @PostMapping("/withdraw") + public ResponseEntity withdraw(@AuthenticationPrincipal UUID memberId, @RequestBody @Valid OAuthWithdrawCommand_ oAuthWithdrawCommand) { + memberApplicationService.withdraw(memberId, oAuthWithdrawCommand); + return ResponseEntity.ok().build(); + }*/ + //회원 탈퇴 + @Operation(description = "카카오 회원 탈퇴 API") + @ApiResponse(responseCode = "200", description = "탈퇴 완료") + @PostMapping("/withdrawal/kakao") + public ResponseEntity withdrawKakao(@AuthenticationPrincipal UUID memberId, + @RequestBody @Valid OAuthWithdrawRequest oAuthWithdrawRequest) { + KakaoWithdrawCommand kakaoWithdrawCommand = KakaoWithdrawCommand.builder() + .memberId(new MemberId(memberId)) + .token(oAuthWithdrawRequest.token()) + .build(); + memberApplicationService.withdraw(kakaoWithdrawCommand); + return ResponseEntity.ok().build(); + } + + //회원 탈퇴 + @Operation(description = "구글 회원 탈퇴 API") + @ApiResponse(responseCode = "200", description = "탈퇴 완료") + @PostMapping("/withdrawal/google") + public ResponseEntity withdrawGoogle(@AuthenticationPrincipal UUID memberId, + @RequestBody @Valid OAuthWithdrawRequest oAuthWithdrawRequest) { + GoogleWithdrawCommand googleWithdrawCommand = GoogleWithdrawCommand.builder() + .memberId(new MemberId(memberId)) + .token(oAuthWithdrawRequest.token()) + .build(); + memberApplicationService.withdraw(googleWithdrawCommand); + return ResponseEntity.ok().build(); + } + + //회원 탈퇴 + @Operation(description = "애플 회원 탈퇴 API") + @ApiResponse(responseCode = "200", description = "탈퇴 완료") + @PostMapping("/withdrawal/apple") + public ResponseEntity withdrawApple(@AuthenticationPrincipal UUID memberId, + @RequestBody @Valid OAuthWithdrawRequest oAuthWithdrawRequest) { + AppleWithdrawCommand appleWithdrawCommand = AppleWithdrawCommand.builder() + .memberId(new MemberId(memberId)) + .token(oAuthWithdrawRequest.token()) + .build(); + memberApplicationService.withdraw(appleWithdrawCommand); + return ResponseEntity.ok().build(); + } +} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/CouponGlobalExceptionHandler.java b/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/CouponGlobalExceptionHandler.java deleted file mode 100644 index 3b29e700..00000000 --- a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/CouponGlobalExceptionHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.project.imdang.member.service.application.exception.handler; - -import com.project.imdang.application.handler.ErrorDTO; -import com.project.imdang.member.service.domain.exception.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Slf4j -@ControllerAdvice -public class CouponGlobalExceptionHandler extends GlobalExceptionHandler { - - @ResponseBody - @ExceptionHandler(value = {CouponDomainException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(CouponDomainException couponDomainException) { - String message = couponDomainException.getMessage(); - log.error(message, couponDomainException); - return ErrorDTO.of(HttpStatus.BAD_REQUEST, message); - } - - - @ResponseBody - @ExceptionHandler(value = {CouponNotFoundException.class}) - @ResponseStatus(HttpStatus.NOT_FOUND) - public ErrorDTO handleException(CouponNotFoundException couponNotFoundException) { - String message = couponNotFoundException.getMessage(); - log.error(message, couponNotFoundException); - return ErrorDTO.of(HttpStatus.NOT_FOUND, message); - } - -} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/GlobalExceptionHandler.java b/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/GlobalExceptionHandler.java deleted file mode 100644 index 846701a2..00000000 --- a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/GlobalExceptionHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.project.imdang.member.service.application.exception.handler; - -import com.project.imdang.application.handler.ErrorDTO; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; -import jakarta.validation.ValidationException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import java.util.stream.Collectors; - -@Slf4j -@ControllerAdvice -@Component("MemberGlobalExceptionHandler") -public class GlobalExceptionHandler { - - @ResponseBody - @ExceptionHandler(value = {Exception.class}) - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public ErrorDTO handleException(Exception exception) { - log.error(exception.getMessage(), exception); - return ErrorDTO.of(HttpStatus.INTERNAL_SERVER_ERROR, "Unexpected Error!"); - } - - @ResponseBody - @ExceptionHandler(value = {ValidationException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(ValidationException validationException) { - ErrorDTO errorDTO; - if (validationException instanceof ConstraintViolationException) { - String violations = extractViolationsFromException((ConstraintViolationException) validationException); - log.error(violations, validationException); - - errorDTO = ErrorDTO.of(HttpStatus.BAD_REQUEST, violations); - - } else { - String exceptionMessage = validationException.getMessage(); - log.error(exceptionMessage, validationException); - errorDTO = ErrorDTO.of(HttpStatus.BAD_REQUEST, exceptionMessage); - } - return errorDTO; - } - - private String extractViolationsFromException(ConstraintViolationException validationException) { - return validationException.getConstraintViolations() - .stream() - .map(ConstraintViolation::getMessage) - .collect(Collectors.joining("--")); - } - - @ResponseBody - @ExceptionHandler(value = {MethodArgumentNotValidException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(MethodArgumentNotValidException methodArgumentNotValidException) { - log.error(methodArgumentNotValidException.getMessage(), methodArgumentNotValidException); - return ErrorDTO.of(HttpStatus.BAD_REQUEST, "Please input " + methodArgumentNotValidException.getParameter().getParameterName()); - } -} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/MemberCouponGlobalExceptionHandler.java b/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/MemberCouponGlobalExceptionHandler.java deleted file mode 100644 index 62f267b1..00000000 --- a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/MemberCouponGlobalExceptionHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.project.imdang.member.service.application.exception.handler; - -import com.project.imdang.application.handler.ErrorDTO; -import com.project.imdang.member.service.domain.exception.MemberCouponDomainException; -import com.project.imdang.member.service.domain.exception.MemberCouponNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Slf4j -@ControllerAdvice -public class MemberCouponGlobalExceptionHandler extends GlobalExceptionHandler { - - @ResponseBody - @ExceptionHandler(value = {MemberCouponDomainException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(MemberCouponDomainException memberCouponDomainException) { - String message = memberCouponDomainException.getMessage(); - log.error(message, memberCouponDomainException); - return ErrorDTO.of(HttpStatus.BAD_REQUEST, message); - } - - @ResponseBody - @ExceptionHandler(value = {MemberCouponNotFoundException.class}) - @ResponseStatus(HttpStatus.NOT_FOUND) - public ErrorDTO handleException(MemberCouponNotFoundException memberCouponNotFoundException) { - String message = memberCouponNotFoundException.getMessage(); - log.error(message, memberCouponNotFoundException); - return ErrorDTO.of(HttpStatus.NOT_FOUND, message); - } -} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/MemberGlobalExceptionHandler.java b/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/MemberGlobalExceptionHandler.java deleted file mode 100644 index 3563170a..00000000 --- a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/exception/handler/MemberGlobalExceptionHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.project.imdang.member.service.application.exception.handler; - -import com.project.imdang.application.handler.ErrorDTO; -import com.project.imdang.member.service.domain.exception.MemberCouponNotFoundException; -import com.project.imdang.member.service.domain.exception.MemberDomainException; -import com.project.imdang.member.service.domain.exception.MemberNotFoundException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -@Slf4j -@ControllerAdvice -public class MemberGlobalExceptionHandler extends GlobalExceptionHandler { - - @ResponseBody - @ExceptionHandler(value = {MemberDomainException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(MemberDomainException memberDomainException) { - String message = memberDomainException.getMessage(); - log.error(message, memberDomainException); - return ErrorDTO.of(HttpStatus.BAD_REQUEST, message); - } - - @ResponseBody - @ExceptionHandler(value = {MemberCouponNotFoundException.class}) - @ResponseStatus(HttpStatus.NOT_FOUND) - public ErrorDTO handleException(MemberNotFoundException memberNotFoundException) { - String message = memberNotFoundException.getMessage(); - log.error(message, memberNotFoundException); - return ErrorDTO.of(HttpStatus.NOT_FOUND, message); - } -} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/AuthController.java b/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/AuthController.java deleted file mode 100644 index 531a827f..00000000 --- a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/AuthController.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.project.imdang.member.service.application.rest; - -import com.project.imdang.member.service.domain.dto.JoinCommand; -import com.project.imdang.member.service.domain.dto.LoginResponse; -import com.project.imdang.member.service.domain.dto.TokenReissueCommand; -import com.project.imdang.member.service.domain.dto.TokenResponse; -import com.project.imdang.member.service.domain.dto.oauth.apple.AppleLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.google.GoogleLoginCommand; -import com.project.imdang.member.service.domain.handler.auth.MockLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.kakao.KakaoLoginCommand; -import com.project.imdang.member.service.domain.ports.input.service.MemberApplicationService; -import io.swagger.v3.oas.annotations.Operation; -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 jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.UUID; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/auth") -@Tag(name = "AuthController", description = "로그인 및 온보딩 API") -public class AuthController { - - private final MemberApplicationService memberApplicationService; - - /** - * 카카오 로그인 - */ - @Operation(description = "카카오 로그인 API") - @ApiResponse(responseCode = "200", description = "카카오 로그인이 성공하였습니다.", - content = @Content(schema = @Schema(implementation = LoginResponse.class))) - @PostMapping("/kakao") - public ResponseEntity login(@RequestBody KakaoLoginCommand kakaoLoginCommand) { - LoginResponse response = memberApplicationService.login(kakaoLoginCommand); - return ResponseEntity.ok(response); - } - - /** - * 애플 로그인 - */ - @Operation(description = "애플 로그인 API") - @ApiResponse(responseCode = "200", description = "애플 로그인이 성공하였습니다.", - content = @Content(schema = @Schema(implementation = LoginResponse.class))) - @PostMapping("/apple") - public ResponseEntity login(@RequestBody AppleLoginCommand appleLoginCommand) { - LoginResponse response = memberApplicationService.login(appleLoginCommand); - return ResponseEntity.ok(response); - } - - /** - * 구글 로그인 - */ - @Operation(description = "구글 로그인 API") - @ApiResponse(responseCode = "200", description = "구글 로그인이 성공하였습니다.", - content = @Content(schema = @Schema(implementation = LoginResponse.class))) - @PostMapping("/google") - public ResponseEntity login(@RequestBody GoogleLoginCommand googleLoginCommand) { - LoginResponse response = memberApplicationService.login(googleLoginCommand); - return ResponseEntity.ok(response); - } - - @PostMapping("/mock") - public ResponseEntity login(@RequestBody MockLoginCommand mockLoginCommand) { - LoginResponse response = memberApplicationService.login(mockLoginCommand); - return ResponseEntity.ok(response); - } - - /** - * 회원가입 - */ - @Operation(description = "온보딩 API") - @ApiResponse(responseCode = "200", description = "온보딩이 완료되었습니다.") - @PutMapping("/join") - public ResponseEntity join(@AuthenticationPrincipal UUID memberId, @RequestBody @Valid JoinCommand joinCommand) { - memberApplicationService.join(memberId, joinCommand); - return ResponseEntity.ok().build(); - } - - /** - * 토큰 재발급 - */ - @Operation(description = "토큰 재발급 API") - @ApiResponse(responseCode = "200", description = "토큰 재발급 완료") - @PostMapping("/reissue") - public ResponseEntity reissue(@RequestBody @Valid TokenReissueCommand tokenReissueCommand) { - TokenResponse tokenResponse = memberApplicationService.reissue(tokenReissueCommand); - return ResponseEntity.ok(tokenResponse); - } -} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/CouponController.java b/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/CouponController.java deleted file mode 100644 index a2f7b52b..00000000 --- a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/CouponController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.project.imdang.member.service.application.rest; - -import com.project.imdang.member.service.domain.dto.coupon.IssueMemberCouponCommand; -import com.project.imdang.member.service.domain.ports.input.service.MemberCouponApplicationService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -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 java.util.UUID; - -@RestController -@RequiredArgsConstructor -@Tag(name = "CouponController", description = "쿠폰 API") -@RequestMapping("/coupons") -@Slf4j -public class CouponController { - - private final MemberCouponApplicationService memberCouponApplicationService; - - @Operation(description = "쿠폰 발행 API") - @ApiResponse(responseCode = "200", description = "쿠폰 발행 성공") - @PostMapping("/issue") - public ResponseEntity issue(@AuthenticationPrincipal UUID memberId) { - memberCouponApplicationService.issueMemberCoupon(new IssueMemberCouponCommand(memberId, "Welcome")); - return ResponseEntity.ok().build(); - } -} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/MemberController.java b/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/MemberController.java deleted file mode 100644 index 063fca42..00000000 --- a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/MemberController.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.project.imdang.member.service.application.rest; - -import com.project.imdang.member.service.domain.dto.DetailMyPageQuery; -import com.project.imdang.member.service.domain.dto.DetailMyPageResponse; -import com.project.imdang.member.service.domain.dto.MemberResponse; -import com.project.imdang.member.service.domain.dto.oauth.apple.AppleWithdrawCommand; -import com.project.imdang.member.service.domain.dto.oauth.google.GoogleWithdrawCommand; -import com.project.imdang.member.service.domain.dto.oauth.kakao.KakaoWithdrawCommand; -import com.project.imdang.member.service.domain.ports.input.service.MemberApplicationService; -import io.swagger.v3.oas.annotations.Operation; -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 jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; -import java.util.UUID; - -@RestController -@RequiredArgsConstructor -@Slf4j -@Tag(name = "MemberController", description = "마이페이지 API") -@RequestMapping("/members") -public class MemberController { - private final MemberApplicationService memberApplicationService; - - @Operation(description = "마이페이지 API") - @ApiResponse(responseCode = "200", description = "마이페이지 조회 성공", - content = @Content(schema = @Schema(implementation = DetailMyPageResponse.class))) - @GetMapping("/detail") - public ResponseEntity detail(@AuthenticationPrincipal UUID memberId) { - DetailMyPageQuery detailMyPageQuery = new DetailMyPageQuery(memberId); - DetailMyPageResponse detailMyPageResponse = memberApplicationService.detailMyPage(detailMyPageQuery); - log.info("MyPage of Member[id : {}] is viewed.", memberId); - return ResponseEntity.ok(detailMyPageResponse); - } - - @GetMapping("/info") - public ResponseEntity info(@RequestParam UUID memberId) { - MemberResponse memberResponse = memberApplicationService.detailMember(memberId); - log.info("Member[id :{}] is retrieved.", memberId); - return ResponseEntity.ok(memberResponse); - } - - @GetMapping - public ResponseEntity> list(@RequestParam List memberIds) { - List memberResponses = memberApplicationService.listMember(memberIds); - return ResponseEntity.ok(memberResponses); - } - - /** - * 로그아웃 - */ - @Operation(description = "로그아웃 API") - @ApiResponse(responseCode = "200", description = "로그아웃 완료") - @PostMapping("/logout") - public ResponseEntity logout(@AuthenticationPrincipal UUID memberId) { - memberApplicationService.logout(memberId); - return ResponseEntity.ok().build(); - } -/* - @Operation(description = "회원 탈퇴 API") - @ApiResponse(responseCode = "200", description = "탈퇴 완료") - @PostMapping("/withdraw") - public ResponseEntity withdraw(@AuthenticationPrincipal UUID memberId, @RequestBody @Valid OAuthWithdrawCommand_ oAuthWithdrawCommand) { - memberApplicationService.withdraw(memberId, oAuthWithdrawCommand); - return ResponseEntity.ok().build(); - }*/ - - //회원 탈퇴 - @Operation(description = "카카오 회원 탈퇴 API") - @ApiResponse(responseCode = "200", description = "탈퇴 완료") - @PostMapping("/withdrawal/kakao") - public ResponseEntity withdraw(@AuthenticationPrincipal UUID memberId, @RequestBody @Valid KakaoWithdrawCommand kakaoWithdrawCommand) { - memberApplicationService.withdraw(memberId, kakaoWithdrawCommand); - return ResponseEntity.ok().build(); - } - - //회원 탈퇴 - @Operation(description = "구글 회원 탈퇴 API") - @ApiResponse(responseCode = "200", description = "탈퇴 완료") - @PostMapping("/withdrawal/google") - public ResponseEntity withdraw(@AuthenticationPrincipal UUID memberId,@RequestBody @Valid GoogleWithdrawCommand googleWithdrawCommand) { - memberApplicationService.withdraw(memberId, googleWithdrawCommand); - return ResponseEntity.ok().build(); - } - - //회원 탈퇴 - @Operation(description = "애플 회원 탈퇴 API") - @ApiResponse(responseCode = "200", description = "탈퇴 완료") - @PostMapping("/withdrawal/apple") - public ResponseEntity withdraw(@AuthenticationPrincipal UUID memberId, @RequestBody @Valid AppleWithdrawCommand appleWithdrawCommand) { - memberApplicationService.withdraw(memberId, appleWithdrawCommand); - return ResponseEntity.ok().build(); - } -} diff --git a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/MyCouponController.java b/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/MyCouponController.java deleted file mode 100644 index def685af..00000000 --- a/member-service/member-application/src/main/java/com/project/imdang/member/service/application/rest/MyCouponController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.project.imdang.member.service.application.rest; - -import com.project.imdang.member.service.domain.dto.coupon.DetailMyCouponResponse; -import com.project.imdang.member.service.domain.ports.input.service.MemberCouponApplicationService; -import io.swagger.v3.oas.annotations.Operation; -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 lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.UUID; - -@RestController -@RequiredArgsConstructor -@Tag(name = "CouponController", description = "쿠폰 API") -@RequestMapping("/my-coupons") -@Slf4j -public class MyCouponController { - - private final MemberCouponApplicationService memberCouponApplicationService; - - @Operation(description = "쿠폰 개수 조회 API") - @ApiResponse(responseCode = "200", description = "쿠폰 개수 조회 성공", - content = @Content(schema = @Schema(implementation = DetailMyCouponResponse.class))) - @GetMapping("/detail") - public ResponseEntity detail(@AuthenticationPrincipal UUID memberId) { - DetailMyCouponResponse detailMyCouponResponse = memberCouponApplicationService.detailMyCoupon(memberId); - return ResponseEntity.ok(detailMyCouponResponse); - } -} diff --git a/member-service/member-application/src/main/resources/application.properties b/member-service/member-application/src/main/resources/application.properties deleted file mode 100644 index c500eb63..00000000 --- a/member-service/member-application/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=member-application diff --git a/member-service/member-container/build.gradle b/member-service/member-container/build.gradle deleted file mode 100644 index efc77647..00000000 --- a/member-service/member-container/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -bootJar { - enabled = false -} -jar { - enabled = true -} \ No newline at end of file diff --git a/member-service/member-container/src/main/java/com/project/imdang/member/service/BeanConfiguration.java b/member-service/member-container/src/main/java/com/project/imdang/member/service/BeanConfiguration.java deleted file mode 100644 index 34197f83..00000000 --- a/member-service/member-container/src/main/java/com/project/imdang/member/service/BeanConfiguration.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.project.imdang.member.service; - -import com.project.imdang.member.service.domain.MemberCouponDomainService; -import com.project.imdang.member.service.domain.MemberCouponDomainServiceImpl; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.MemberDomainServiceImpl; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestTemplate; - -@Configuration("memberBeanConfiguration") -public class BeanConfiguration { - @Bean - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - @Bean - public MemberDomainService memberDomainService() { - return new MemberDomainServiceImpl(); - } - - @Bean - public MemberCouponDomainService memberCouponDomainService() { - return new MemberCouponDomainServiceImpl(); - } -} diff --git a/member-service/member-container/src/test/java/rest/CouponControllerTest.java b/member-service/member-container/src/test/java/rest/CouponControllerTest.java deleted file mode 100644 index 8b1f4489..00000000 --- a/member-service/member-container/src/test/java/rest/CouponControllerTest.java +++ /dev/null @@ -1,220 +0,0 @@ -package rest; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.domain.jwt.JwtTokenProvider; -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.dto.coupon.IssueMemberCouponCommand; -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import com.project.imdang.member.service.domain.ports.output.CouponRepository; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.transaction.annotation.Transactional; - -import java.time.ZonedDateTime; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import static rest.TestData.accessToken; -import static rest.TestData.firstCoupon; -import static rest.TestData.member; -import static rest.TestData.member_2; -import static rest.TestData.member_3; -import static rest.TestData.member_4; -import static rest.TestData.secondCoupon; -import static rest.TestData.thirdCoupon; -import static rest.TestData.welcomeCoupon; - -@AutoConfigureMockMvc -@SpringBootTest(classes = TestConfiguration.class) -class CouponControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private CouponRepository couponRepository; - - @MockBean - private MemberRepository memberRepository; - - @MockBean - private JwtTokenProvider jwtTokenProvider; - @Autowired - private ObjectMapper objectMapper; - @Autowired - private MemberCouponRepository memberCouponRepository; - - - static final UUID memberId = UUID.randomUUID(); - - @BeforeEach - void initialize() { - Mockito.when(jwtTokenProvider.verifyToken(accessToken)) - .thenReturn(true); - - Mockito.when(jwtTokenProvider.extractSubject(accessToken)) - .thenReturn(String.valueOf(memberId)); - } - - - @Transactional - @Test - void list() throws Exception{ - //given - memberCouponRepository.saveAll(IntStream.range(0, 3) - .mapToObj(i -> MemberCoupon.builder() - .couponId(new CouponId(UUID.randomUUID())) - .used(Boolean.FALSE) - .memberId(new MemberId(memberId)) - .createdAt(ZonedDateTime.now()).build()) - .collect(Collectors.toList())); - //when - //then - mockMvc.perform(get("/coupons/{memberId}", memberId) - .header("Authorization", "Bearer " + accessToken) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.couponCount").value(3)) - .andDo(print()) - .andReturn(); - } - - @Transactional - @Test - void issueCouponWelcome() throws Exception { - //given - when(couponRepository.findByName("Welcome")).thenReturn(Optional.ofNullable(welcomeCoupon)); - when(memberRepository.findById(new MemberId(memberId))).thenReturn(Optional.ofNullable(member)); - - IssueMemberCouponCommand issueMemberCouponCommand = new IssueMemberCouponCommand(memberId, "Welcome"); - - //when - //then - mockMvc.perform(post("/coupons/issue") - .header("Authorization", "Bearer " + accessToken) - .content(objectMapper.writeValueAsString(issueMemberCouponCommand)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(print()) - .andReturn(); - } - - @Transactional - @Test - void issueCouponFirstCheerUp() throws Exception { - //given - when(couponRepository.findByName("FirstCheerUp")).thenReturn(Optional.ofNullable(firstCoupon)); - when(memberRepository.findById(new MemberId(memberId))).thenReturn(Optional.ofNullable(member_2)); - IssueMemberCouponCommand issueMemberCouponCommand = new IssueMemberCouponCommand(memberId, "FirstCheerUp"); - - //when - //then - mockMvc.perform(post("/coupons/issue") - .header("Authorization", "Bearer " + accessToken) - .content(objectMapper.writeValueAsString(issueMemberCouponCommand)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(print()) - .andReturn(); - } - - @Transactional - @Test - void issueCouponSecondCheerUp() throws Exception { - //given - when(couponRepository.findByName("SecondCheerUp")).thenReturn(Optional.ofNullable(secondCoupon)); - when(memberRepository.findById(new MemberId(memberId))).thenReturn(Optional.ofNullable(member_3)); - IssueMemberCouponCommand issueMemberCouponCommand = new IssueMemberCouponCommand(memberId, "SecondCheerUp"); - - //when - //then - mockMvc.perform(post("/coupons/issue") - .header("Authorization", "Bearer " + accessToken) - .content(objectMapper.writeValueAsString(issueMemberCouponCommand)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(print()) - .andReturn(); - } - - @Transactional - @Test - void issueCouponThirdCheerUp() throws Exception { - //given - when(couponRepository.findByName("ThirdCheerUp")).thenReturn(Optional.ofNullable(thirdCoupon)); - when(memberRepository.findById(new MemberId(memberId))).thenReturn(Optional.ofNullable(member_4)); - IssueMemberCouponCommand issueMemberCouponCommand = new IssueMemberCouponCommand(memberId, "ThirdCheerUp"); - - //when - //then - mockMvc.perform(post("/coupons/issue") - .header("Authorization", "Bearer " + accessToken) - .content(objectMapper.writeValueAsString(issueMemberCouponCommand)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(print()) - .andReturn(); - } - -// @Test -// @Transactional -// void useCoupon() throws Exception{ -// //given -// -// -// UseMemberCouponCommand useMemberCouponCommand = new UseMemberCouponCommand(memberId); -// -// //when -// //then -// mockMvc.perform(post("/coupons/use") -// .content(objectMapper.writeValueAsString(useMemberCouponCommand)) -// .contentType(MediaType.APPLICATION_JSON)) -// .andExpect(status().isOk()) -// .andExpect(jsonPath("$.memberCouponId").value(1)) -// .andDo(print()) -// .andReturn(); -// } - -// @Test -// @Transactional -// void useCouponErrorCase() throws Exception{ -// //given -// memberCouponRepository.saveAll(IntStream.range(0, 3) -// .mapToObj(i -> { -// return MemberCoupon.builder() -// .couponId(new CouponId(UUID.randomUUID())) -// .used(Boolean.TRUE) -// .memberId(new MemberId(memberId)) -// .createdAt(ZonedDateTime.now()).build(); -// }).collect(Collectors.toList())); -// -// UseMemberCouponCommand useMemberCouponCommand = new UseMemberCouponCommand(memberId); -// -// //when -// //then -// mockMvc.perform(post("/coupons/use") -// .content(objectMapper.writeValueAsString(useMemberCouponCommand)) -// .contentType(MediaType.APPLICATION_JSON)) -// .andExpect(status().isBadRequest()) -// .andDo(print()) -// .andReturn(); -// } -} diff --git a/member-service/member-container/src/test/java/rest/CouponEventTest.java b/member-service/member-container/src/test/java/rest/CouponEventTest.java deleted file mode 100644 index ee1ea69c..00000000 --- a/member-service/member-container/src/test/java/rest/CouponEventTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package rest; - -import com.project.imdang.domain.message.ExchangeRequestRejectedCountRequestMessage; -import com.project.imdang.member.service.domain.handler.ExchangeRequestRejectedCountMessageListenerImpl; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.ApplicationContext; - -import static org.mockito.Mockito.*; -import static rest.TestData.*; - -@AutoConfigureMockMvc -@SpringBootTest(classes = TestConfiguration.class) -public class CouponEventTest { - - @Autowired - private ApplicationContext applicationContext; - - @MockBean - private ExchangeRequestRejectedCountMessageListenerImpl listener; - - - @Test - @DisplayName("이벤트가 호출되는지 확인") - void exchangeRequestRejectedCountMessageEventListener() { - // Given - ExchangeRequestRejectedCountRequestMessage message = new ExchangeRequestRejectedCountRequestMessage(memberId); - // When - applicationContext.publishEvent(message); - // Then - verify(listener).handle(message); - } -} diff --git a/member-service/member-container/src/test/java/rest/TestConfiguration.java b/member-service/member-container/src/test/java/rest/TestConfiguration.java deleted file mode 100644 index ee25f7d6..00000000 --- a/member-service/member-container/src/test/java/rest/TestConfiguration.java +++ /dev/null @@ -1,11 +0,0 @@ -package rest; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -@SpringBootApplication(scanBasePackages = "com.project.imdang") -@EnableJpaRepositories(basePackages = "com.project.imdang.member.service.persistence") -@EntityScan(basePackages = "com.project.imdang.member.service.persistence") -public class TestConfiguration { -} diff --git a/member-service/member-container/src/test/java/rest/TestData.java b/member-service/member-container/src/test/java/rest/TestData.java deleted file mode 100644 index 3f8525a3..00000000 --- a/member-service/member-container/src/test/java/rest/TestData.java +++ /dev/null @@ -1,75 +0,0 @@ -package rest; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.valueobject.Gender; - -import java.util.UUID; - -public final class TestData { - static UUID memberId = UUID.fromString("8a1e1c3d-74ef-42c8-9239-a33455b02eda"); - static UUID couponId = UUID.fromString("597f5ac7-e3ae-4d34-b1c2-990a3ace5160"); - static String fcmToken = "fcm-token"; - static String accessToken = "access-token"; - static Member member = Member.builder() - .id(new MemberId(memberId)) - .nickname("imdang") - .birthDate("2024-12-31") - .gender(Gender.MALE) - .deviceToken(fcmToken) - .insightCount(1) - .exchangeCount(2) - .rejectedCount(3) - .build(); - - static Member member_2 = Member.builder() - .id(new MemberId(memberId)) - .nickname("imdang") - .birthDate("2024-12-31") - .gender(Gender.MALE) - .deviceToken(fcmToken) - .insightCount(1) - .exchangeCount(2) - .rejectedCount(5) - .build(); - - static Member member_3 = Member.builder() - .id(new MemberId(memberId)) - .nickname("imdang") - .birthDate("2024-12-31") - .gender(Gender.MALE) - .deviceToken(fcmToken) - .insightCount(1) - .exchangeCount(2) - .rejectedCount(10) - .build(); - - static Member member_4 = Member.builder() - .id(new MemberId(memberId)) - .nickname("imdang") - .birthDate("2024-12-31") - .gender(Gender.MALE) - .deviceToken(fcmToken) - .insightCount(1) - .exchangeCount(2) - .rejectedCount(10) - .build(); - - static Coupon welcomeCoupon = Coupon.builder() - .id(new CouponId(couponId)) - .name("Welcome").build(); - - static Coupon firstCoupon = Coupon.builder() - .id(new CouponId(couponId)) - .name("FirstCheerup").build(); - - static Coupon secondCoupon = Coupon.builder() - .id(new CouponId(couponId)) - .name("SecondCheerup").build(); - - static Coupon thirdCoupon = Coupon.builder() - .id(new CouponId(couponId)) - .name("ThirdCheerup").build(); -} diff --git a/member-service/member-domain/member-application-service/build.gradle b/member-service/member-domain/member-application-service/build.gradle index c049d055..a912533d 100644 --- a/member-service/member-domain/member-application-service/build.gradle +++ b/member-service/member-domain/member-application-service/build.gradle @@ -1,6 +1,10 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':member-service:member-domain:member-domain-core') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation 'org.springframework.boot:spring-boot-starter' + // TODO - CHECK + implementation 'org.springframework:spring-tx' + implementation 'org.springframework.data:spring-data-commons' } diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/AccusePenaltyPolicyImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/AccusePenaltyPolicyImpl.java new file mode 100644 index 00000000..76240eae --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/AccusePenaltyPolicyImpl.java @@ -0,0 +1,32 @@ +package com.project.imdang.member.domain; + +import com.project.imdang.common.domain.valueobject.Penalty; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.valueobject.AccusePenaltyPolicy; +import org.springframework.stereotype.Component; + +import static com.project.imdang.common.domain.valueobject.Penalty.PERMANENT_BANNED; +import static com.project.imdang.common.domain.valueobject.Penalty.TEMPORARY_BANNED; + +@Component +public class AccusePenaltyPolicyImpl implements AccusePenaltyPolicy { + + @Override + public void apply(Member member) { + int accusedCount = member.getAccusedCount(); + Penalty penalty = getPenalty(accusedCount); + if (penalty != null) { + member.applyPenalty(penalty); + } + } + + private Penalty getPenalty(int accusedCount) { + Penalty penalty = null; + if (accusedCount == 30) { + penalty = TEMPORARY_BANNED; + } else if (accusedCount == 50) { + penalty = PERMANENT_BANNED; + } + return penalty; + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/AuthApplicationServiceImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/AuthApplicationServiceImpl.java new file mode 100644 index 00000000..308aa019 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/AuthApplicationServiceImpl.java @@ -0,0 +1,39 @@ +package com.project.imdang.member.domain; + +import com.project.imdang.member.domain.dto.auth.JoinMemberCommand; +import com.project.imdang.member.domain.dto.auth.LoginResult; +import com.project.imdang.member.domain.dto.auth.ReissueTokenCommand; +import com.project.imdang.member.domain.dto.auth.TokenResult; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.member.domain.handler.auth.JoinCommandHandler; +import com.project.imdang.member.domain.handler.auth.OAuthLoginCommandHandler; +import com.project.imdang.member.domain.handler.auth.ReissueTokenCommandHandler; +import com.project.imdang.member.domain.ports.input.service.AuthApplicationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AuthApplicationServiceImpl implements AuthApplicationService { + + private final OAuthLoginCommandHandler oAuthLoginCommandHandler; + private final JoinCommandHandler joinCommandHandler; + private final ReissueTokenCommandHandler reissueTokenCommandHandler; + + @Override + public LoginResult login(OAuthLoginCommand loginCommand) { + return oAuthLoginCommandHandler.login(loginCommand); + } + + @Override + public void join(JoinMemberCommand joinMemberCommand) { + joinCommandHandler.join(joinMemberCommand); + } + + @Override + public TokenResult reissue(ReissueTokenCommand reissueTokenCommand) { + return reissueTokenCommandHandler.reissue(reissueTokenCommand); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/MemberApplicationServiceImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/MemberApplicationServiceImpl.java new file mode 100644 index 00000000..0eab1980 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/MemberApplicationServiceImpl.java @@ -0,0 +1,75 @@ +package com.project.imdang.member.domain; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.dto.member.MemberResult; +import com.project.imdang.member.domain.dto.member.MyPageInfoResult; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import com.project.imdang.member.domain.handler.auth.LogoutCommandHandler; +import com.project.imdang.member.domain.handler.auth.WithdrawCommandHandler; +import com.project.imdang.member.domain.handler.member.AccuseMemberCommandHandler; +import com.project.imdang.member.domain.handler.member.DetailMemberQueryHandler; +import com.project.imdang.member.domain.handler.member.DetailMyPageInfoQueryHandler; +import com.project.imdang.member.domain.handler.member.ListMemberQueryHandler; +import com.project.imdang.member.domain.handler.member.UpdateInsightCountCommandHandler; +import com.project.imdang.member.domain.ports.input.service.MemberApplicationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class MemberApplicationServiceImpl implements MemberApplicationService { + + private final LogoutCommandHandler logoutCommandHandler; + private final WithdrawCommandHandler withdrawCommandHandler; + + private final ListMemberQueryHandler listMemberQueryHandler; + private final DetailMemberQueryHandler detailMemberQueryHandler; + private final DetailMyPageInfoQueryHandler detailMyPageInfoQueryHandler; + + private final AccuseMemberCommandHandler accuseMemberCommandHandler; + private final UpdateInsightCountCommandHandler updateInsightCountCommandHandler; + + @Override + public void logout(MemberId memberId) { + logoutCommandHandler.logout(memberId); + } + + @Override + public void withdraw(OAuthWithdrawCommand withdrawCommand) { + withdrawCommandHandler.withdraw(withdrawCommand); + } + + @Override + public List listMember(List memberIds) { + return listMemberQueryHandler.listMember(memberIds); + } + + @Override + public MemberResult detailMember(MemberId memberId) { + return detailMemberQueryHandler.detailMember(memberId); + } + + @Override + public MyPageInfoResult detailMyPage(MemberId memberId) { + return detailMyPageInfoQueryHandler.detailMyPage(memberId); + } + + @Override + public void accuseMember(MemberId memberId) { + accuseMemberCommandHandler.accuse(memberId); + } + + @Override + public void increaseInsightCount(MemberId memberId) { + updateInsightCountCommandHandler.increaseInsightCount(memberId); + } + + @Override + public void decreaseInsightCount(MemberId memberId) { + updateInsightCountCommandHandler.decreaseInsightCount(memberId); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/JoinCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/JoinMemberCommand.java similarity index 53% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/JoinCommand.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/JoinMemberCommand.java index 0e1fc7d5..681140fd 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/JoinCommand.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/JoinMemberCommand.java @@ -1,9 +1,7 @@ -package com.project.imdang.member.service.domain.dto; +package com.project.imdang.member.domain.dto.auth; -import com.project.imdang.member.service.domain.valueobject.Gender; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Pattern; +import com.project.imdang.common.domain.valueobject.Gender; +import com.project.imdang.common.domain.valueobject.MemberId; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -14,8 +12,8 @@ @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class JoinCommand { - @NotBlank +public class JoinMemberCommand { + private MemberId memberId; private String nickname; private String birthDate; private Gender gender; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/LoginResult.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/LoginResult.java new file mode 100644 index 00000000..71ac041b --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/LoginResult.java @@ -0,0 +1,25 @@ +package com.project.imdang.member.domain.dto.auth; + +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LoginResult { + private String accessToken; + private String refreshToken; + private Long expiresIn; + private boolean isJoined; + private MemberId memberId; + private String appleRefreshToken; + + public static LoginResult from(TokenResult response, boolean isJoined, MemberId memberId, String refreshToken) { + return new LoginResult(response.getAccessToken(), response.getRefreshToken(), response.getExpiresIn(), isJoined, memberId, refreshToken); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthLoginCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/OAuthLoginCommand.java similarity index 55% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthLoginCommand.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/OAuthLoginCommand.java index 267899a7..4912648e 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthLoginCommand.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/OAuthLoginCommand.java @@ -1,6 +1,6 @@ -package com.project.imdang.member.service.domain.dto.oauth; +package com.project.imdang.member.domain.dto.auth; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.OAuthType; import org.springframework.util.MultiValueMap; public interface OAuthLoginCommand { diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthLoginResponse.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/OAuthLoginResponse.java similarity index 56% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthLoginResponse.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/OAuthLoginResponse.java index 3abac740..7776ce06 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthLoginResponse.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/OAuthLoginResponse.java @@ -1,6 +1,6 @@ -package com.project.imdang.member.service.domain.dto.oauth; +package com.project.imdang.member.domain.dto.auth; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.OAuthType; public interface OAuthLoginResponse { String getNickname(); diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/reject/RejectExchangeRequestResponse.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/ReissueTokenCommand.java similarity index 51% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/reject/RejectExchangeRequestResponse.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/ReissueTokenCommand.java index 0240d3d2..35552ea7 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/exchange/reject/RejectExchangeRequestResponse.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/ReissueTokenCommand.java @@ -1,17 +1,17 @@ -package com.project.imdang.insight.service.domain.dto.exchange.reject; +package com.project.imdang.member.domain.dto.auth; +import com.project.imdang.common.domain.valueobject.MemberId; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.UUID; - -@Builder -@AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class RejectExchangeRequestResponse { - private UUID exchangeRequestId; +@AllArgsConstructor +@Builder +public class ReissueTokenCommand { + private MemberId memberId; + private String refreshToken; } diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/TokenResponse.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/ReissueTokenResult.java similarity index 79% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/TokenResponse.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/ReissueTokenResult.java index 0b03f6b1..74009c6b 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/TokenResponse.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/ReissueTokenResult.java @@ -1,4 +1,4 @@ -package com.project.imdang.member.service.domain.dto; +package com.project.imdang.member.domain.dto.auth; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -10,7 +10,7 @@ @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class TokenResponse { +public class ReissueTokenResult { private String accessToken; private String refreshToken; private Long expiresIn; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/TokenResult.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/TokenResult.java new file mode 100644 index 00000000..ce0ab0db --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/TokenResult.java @@ -0,0 +1,15 @@ +package com.project.imdang.member.domain.dto.auth; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class TokenResult { + private String accessToken; + private String refreshToken; + private Long expiresIn; +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleLoginCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/apple/AppleLoginCommand.java similarity index 77% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleLoginCommand.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/apple/AppleLoginCommand.java index 12741343..4a76ae56 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleLoginCommand.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/apple/AppleLoginCommand.java @@ -1,7 +1,7 @@ -package com.project.imdang.member.service.domain.dto.oauth.apple; +package com.project.imdang.member.domain.dto.auth.apple; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleLoginCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/google/GoogleLoginCommand.java similarity index 77% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleLoginCommand.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/google/GoogleLoginCommand.java index ea163f3d..82c8b270 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleLoginCommand.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/google/GoogleLoginCommand.java @@ -1,7 +1,7 @@ -package com.project.imdang.member.service.domain.dto.oauth.google; +package com.project.imdang.member.domain.dto.auth.google; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoLoginCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/kakao/KakaoLoginCommand.java similarity index 77% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoLoginCommand.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/kakao/KakaoLoginCommand.java index d0fcff20..b7f59974 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoLoginCommand.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/kakao/KakaoLoginCommand.java @@ -1,7 +1,7 @@ -package com.project.imdang.member.service.domain.dto.oauth.kakao; +package com.project.imdang.member.domain.dto.auth.kakao; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -16,6 +16,7 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class KakaoLoginCommand implements OAuthLoginCommand { private String accessToken; + @Override public OAuthType oAuthType() { return OAuthType.KAKAO; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/MockLoginCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/mock/MockLoginCommand.java similarity index 76% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/MockLoginCommand.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/mock/MockLoginCommand.java index 3460f59d..3b76389c 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/MockLoginCommand.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/auth/mock/MockLoginCommand.java @@ -1,7 +1,7 @@ -package com.project.imdang.member.service.domain.handler.auth; +package com.project.imdang.member.domain.dto.auth.mock; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/MemberResult.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/MemberResult.java new file mode 100644 index 00000000..87fa4e9c --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/MemberResult.java @@ -0,0 +1,21 @@ +package com.project.imdang.member.domain.dto.member; + +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor +@Builder +public class MemberResult { + private MemberId memberId; + private String nickname; + private String birthDate; + private String gender; + private String deviceToken; + private int insightCount; +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/MyPageInfoResult.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/MyPageInfoResult.java new file mode 100644 index 00000000..a168eb82 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/MyPageInfoResult.java @@ -0,0 +1,15 @@ +package com.project.imdang.member.domain.dto.member; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class MyPageInfoResult { + private String nickname; + private Integer insightCount; + private Integer requestCount; +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/OAuthWithdrawCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/OAuthWithdrawCommand.java new file mode 100644 index 00000000..6e249d85 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/OAuthWithdrawCommand.java @@ -0,0 +1,11 @@ +package com.project.imdang.member.domain.dto.member; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.OAuthType; +import org.springframework.util.MultiValueMap; + +public interface OAuthWithdrawCommand { + MemberId getMemberId(); + OAuthType getOAuthType(); + MultiValueMap getBody(); +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthWithdrawCommand_.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/OAuthWithdrawCommand_.java similarity index 83% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthWithdrawCommand_.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/OAuthWithdrawCommand_.java index aa75e6fb..3c87aca5 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthWithdrawCommand_.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/OAuthWithdrawCommand_.java @@ -1,6 +1,6 @@ -package com.project.imdang.member.service.domain.dto.oauth; +package com.project.imdang.member.domain.dto.member; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/apple/AppleWithdrawCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/apple/AppleWithdrawCommand.java new file mode 100644 index 00000000..2cf1e473 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/apple/AppleWithdrawCommand.java @@ -0,0 +1,34 @@ +package com.project.imdang.member.domain.dto.member.apple; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class AppleWithdrawCommand implements OAuthWithdrawCommand { + + private MemberId memberId; + private String token; + + @Override + public OAuthType getOAuthType() { + return OAuthType.APPLE; + } + + @Override + public MultiValueMap getBody() { + MultiValueMap body = new LinkedMultiValueMap<>(); + body.add("token", token); + return body; + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/google/GoogleWithdrawCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/google/GoogleWithdrawCommand.java new file mode 100644 index 00000000..d8a0b5f7 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/google/GoogleWithdrawCommand.java @@ -0,0 +1,34 @@ +package com.project.imdang.member.domain.dto.member.google; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class GoogleWithdrawCommand implements OAuthWithdrawCommand { + + private MemberId memberId; + private String token; + + @Override + public OAuthType getOAuthType() { + return OAuthType.GOOGLE; + } + + @Override + public MultiValueMap getBody() { + MultiValueMap body = new LinkedMultiValueMap<>(); + body.add("token", token); + return body; + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoWithdrawCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/kakao/KakaoWithdrawCommand.java similarity index 62% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoWithdrawCommand.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/kakao/KakaoWithdrawCommand.java index ae4d36a0..808f23fe 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoWithdrawCommand.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/dto/member/kakao/KakaoWithdrawCommand.java @@ -1,7 +1,8 @@ -package com.project.imdang.member.service.domain.dto.oauth.kakao; +package com.project.imdang.member.domain.dto.member.kakao; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -15,14 +16,17 @@ @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class KakaoWithdrawCommand implements OAuthWithdrawCommand { + + private MemberId memberId; private String token; + @Override - public OAuthType oAuthType() { + public OAuthType getOAuthType() { return OAuthType.KAKAO; } @Override - public MultiValueMap makeBody() { + public MultiValueMap getBody() { MultiValueMap body = new LinkedMultiValueMap<>(); body.add("token", token); return body; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/MemberHelper.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/MemberHelper.java similarity index 74% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/MemberHelper.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/MemberHelper.java index ee1b8383..596c0804 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/MemberHelper.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/MemberHelper.java @@ -1,11 +1,11 @@ -package com.project.imdang.member.service.domain.handler; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberDomainException; -import com.project.imdang.member.service.domain.exception.MemberNotFoundException; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +package com.project.imdang.member.domain.handler; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.exception.MemberDomainException; +import com.project.imdang.member.domain.exception.MemberNotFoundException; +import com.project.imdang.member.domain.ports.output.repository.MemberRepository; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/JoinCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/JoinCommandHandler.java new file mode 100644 index 00000000..83c0ae1e --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/JoinCommandHandler.java @@ -0,0 +1,42 @@ +package com.project.imdang.member.domain.handler.auth; + +import com.project.imdang.common.domain.exception.DomainException; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.MemberDomainService; +import com.project.imdang.member.domain.dto.auth.JoinMemberCommand; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.handler.MemberHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@Slf4j +@RequiredArgsConstructor +public class JoinCommandHandler { + + private final MemberDomainService memberDomainService; + private final MemberHelper memberHelper; + + @Transactional + public void join(JoinMemberCommand joinMemberCommand) { + // 1. 토큰에서 유저 정보 추출 후 검증 + MemberId memberId = joinMemberCommand.getMemberId(); + Member member = memberHelper.get(memberId); + // 2. 닉네임 중복검사 + checkDuplicateNickname(joinMemberCommand.getNickname()); + // 3. 회원가입 (입력 정보 업데이트) + Member updatedMember = memberDomainService.join(member, joinMemberCommand.getNickname(), joinMemberCommand.getBirthDate(), joinMemberCommand.getGender(), joinMemberCommand.getDeviceToken()); + // 4. 저장 + memberHelper.save(updatedMember); + } + + private void checkDuplicateNickname(String nickname) { + if (memberHelper.getByNickname(nickname).isPresent()) { + String errorMessage = "Nickname is already used!"; + log.error(errorMessage); + throw new DomainException(errorMessage); + } + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/LogoutCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/LogoutCommandHandler.java similarity index 58% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/LogoutCommandHandler.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/LogoutCommandHandler.java index f3304a1d..b2ffa295 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/LogoutCommandHandler.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/LogoutCommandHandler.java @@ -1,16 +1,14 @@ -package com.project.imdang.member.service.domain.handler.member; +package com.project.imdang.member.domain.handler.auth; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.handler.MemberHelper; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.MemberDomainService; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.handler.MemberHelper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import java.util.UUID; - @Component @RequiredArgsConstructor @Slf4j @@ -19,11 +17,8 @@ public class LogoutCommandHandler { private final MemberHelper memberHelper; @Transactional - public void logout(UUID _memberId) { - - MemberId memberId = new MemberId(_memberId); + public void logout(MemberId memberId) { Member member = memberHelper.get(memberId); - Member logout = memberDomainService.logout(member); Member saved = memberHelper.save(logout); log.info("Member[id: {}] is logout.", saved.getId().getValue()); diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/OAuthLoginCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/OAuthLoginCommandHandler.java similarity index 60% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/OAuthLoginCommandHandler.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/OAuthLoginCommandHandler.java index 41fd57e0..505fe925 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/OAuthLoginCommandHandler.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/OAuthLoginCommandHandler.java @@ -1,13 +1,14 @@ -package com.project.imdang.member.service.domain.handler.auth; +package com.project.imdang.member.domain.handler.auth; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.dto.LoginResponse; -import com.project.imdang.member.service.domain.dto.TokenResponse; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.handler.MemberHelper; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.MemberDomainService; +import com.project.imdang.member.domain.dto.auth.LoginResult; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.member.domain.dto.auth.TokenResult; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.handler.MemberHelper; +import com.project.imdang.member.domain.ports.output.client.OAuthApiClientHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -21,16 +22,16 @@ @Component @Slf4j public class OAuthLoginCommandHandler { - private final TokenRequestHandler tokenRequestHandler; + private final TokenHandler tokenHandler; private final Map apiClients; private final MemberDomainService memberDomainService; private final MemberHelper memberHelper; - public OAuthLoginCommandHandler(TokenRequestHandler tokenRequestHandler, + public OAuthLoginCommandHandler(TokenHandler tokenHandler, List apiClients, MemberDomainService memberDomainService, MemberHelper memberHelper) { - this.tokenRequestHandler = tokenRequestHandler; + this.tokenHandler = tokenHandler; this.apiClients = apiClients.stream() .collect(Collectors.toUnmodifiableMap(OAuthApiClientHandler::oAuthType, Function.identity())); this.memberDomainService = memberDomainService; @@ -38,7 +39,7 @@ public OAuthLoginCommandHandler(TokenRequestHandler tokenRequestHandler, } @Transactional - public LoginResponse login(OAuthLoginCommand loginCommand) { + public LoginResult login(OAuthLoginCommand loginCommand) { OAuthApiClientHandler client = apiClients.get(loginCommand.oAuthType()); OAuthLoginResponse oAuthInfo = client.getOAuthInfo(loginCommand); @@ -53,12 +54,13 @@ public LoginResponse login(OAuthLoginCommand loginCommand) { member = optional.get(); isJoined = (member.getNickname() != null); } + // 2. 토큰 생성 - TokenResponse tokenResponse = tokenRequestHandler.generate(member); + TokenResult tokenResult = tokenHandler.generateToken(member.getId()); + // 3. RefreshToken 저장 - memberDomainService.storeRefreshToken(member, tokenResponse.getRefreshToken()); + memberDomainService.storeRefreshToken(member, tokenResult.getRefreshToken()); memberHelper.save(member); - return LoginResponse.from(tokenResponse, isJoined, member.getIsCouponReceived(), member.getId().getValue(), oAuthInfo.getRefreshToken()); - + return LoginResult.from(tokenResult, isJoined, member.getId(), oAuthInfo.getRefreshToken()); } } diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/ReissueTokenCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/ReissueTokenCommandHandler.java new file mode 100644 index 00000000..9d3379f6 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/ReissueTokenCommandHandler.java @@ -0,0 +1,41 @@ +package com.project.imdang.member.domain.handler.auth; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.MemberDomainService; +import com.project.imdang.member.domain.dto.auth.ReissueTokenCommand; +import com.project.imdang.member.domain.dto.auth.TokenResult; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.exception.MemberDomainException; +import com.project.imdang.member.domain.handler.MemberHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@Slf4j +@RequiredArgsConstructor +public class ReissueTokenCommandHandler { + private final MemberDomainService memberDomainService; + private final MemberHelper memberHelper; + private final TokenHandler tokenHandler; + + @Transactional + public TokenResult reissue(ReissueTokenCommand reissueTokenCommand) { + + final MemberId memberId = reissueTokenCommand.getMemberId(); + Member member = memberHelper.get(memberId); + + String refreshToken = reissueTokenCommand.getRefreshToken(); + boolean validated = tokenHandler.validateToken(refreshToken); + if (validated || + (!member.getRefreshToken().equals(refreshToken))){ + throw new MemberDomainException("Invalid Token"); + } + + TokenResult tokenResult = tokenHandler.generateToken(memberId); + log.info("Member[id: {}] token is reissued.", member.getId().getValue()); + memberHelper.save(memberDomainService.storeRefreshToken(member, tokenResult.getRefreshToken())); + return tokenResult; + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/TokenHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/TokenHandler.java new file mode 100644 index 00000000..3693ba64 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/TokenHandler.java @@ -0,0 +1,44 @@ +package com.project.imdang.member.domain.handler.auth; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.dto.auth.TokenResult; +import com.project.imdang.member.domain.ports.output.provider.TokenProvider; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Component +@Slf4j +@RequiredArgsConstructor +public class TokenHandler { + + private static final long ACCESS_TOKEN_EXPIRE_TIME = 1000 * 60 * 60 * 5; // 5시간 + private static final long REFRESH_TOKEN_EXPIRE_TIME = 1000 * 60 * 60 * 24 * 7; // 7일 + + private final TokenProvider tokenProvider; + + public TokenResult generateToken(MemberId memberId) { + long current = System.currentTimeMillis(); + final Date accessTokenExpiredAt = new Date(current + ACCESS_TOKEN_EXPIRE_TIME); + final Date refreshTokenExpiredAt = new Date(current + REFRESH_TOKEN_EXPIRE_TIME); + + String subject = memberId.getValue().toString(); + String accessToken = tokenProvider.generateAccessToken(subject, accessTokenExpiredAt); + log.info("AccessToken of member[id : {}] is generated : {}.", memberId.getValue(), accessToken); + + String refreshToken = tokenProvider.generateRefreshToken(refreshTokenExpiredAt); + log.info("RefreshToken of member[id : {}] is generated : {}.", memberId.getValue(), refreshToken); + + return TokenResult.builder() + .accessToken(accessToken) + .refreshToken(refreshToken) + .expiresIn(ACCESS_TOKEN_EXPIRE_TIME / 1000L) + .build(); + } + + public boolean validateToken(String token) { + return tokenProvider.verifyToken(token); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/WithdrawCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/WithdrawCommandHandler.java similarity index 66% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/WithdrawCommandHandler.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/WithdrawCommandHandler.java index d22c82a6..e9137b2a 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/WithdrawCommandHandler.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/auth/WithdrawCommandHandler.java @@ -1,19 +1,18 @@ -package com.project.imdang.member.service.domain.handler.member; +package com.project.imdang.member.domain.handler.auth; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.handler.MemberHelper; -import com.project.imdang.member.service.domain.handler.auth.OAuthApiClientHandler; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.MemberDomainService; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.handler.MemberHelper; +import com.project.imdang.member.domain.ports.output.client.OAuthApiClientHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; -import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; @@ -34,12 +33,12 @@ public WithdrawCommandHandler(List apiClients, } @Transactional - public void withdraw(UUID _memberId, OAuthWithdrawCommand oAuthWithdrawCommand) { + public void withdraw(OAuthWithdrawCommand oAuthWithdrawCommand) { // 1. 멤버 찾기 - MemberId memberId = new MemberId(_memberId); + MemberId memberId = oAuthWithdrawCommand.getMemberId(); Member member = memberHelper.getByIdAndIsDeleted(memberId); // 2. 탈퇴 처리 - OAuthApiClientHandler withdrawHandler = apiClients.get(oAuthWithdrawCommand.oAuthType()); + OAuthApiClientHandler withdrawHandler = apiClients.get(oAuthWithdrawCommand.getOAuthType()); withdrawHandler.withdraw(oAuthWithdrawCommand); // 3. 사용자 삭제 및 토큰 만료 Member withdrew = memberDomainService.withdraw(member); diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/AccuseMemberCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/AccuseMemberCommandHandler.java new file mode 100644 index 00000000..9e30ce9e --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/AccuseMemberCommandHandler.java @@ -0,0 +1,28 @@ +package com.project.imdang.member.domain.handler.member; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.MemberDomainService; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.handler.MemberHelper; +import com.project.imdang.member.domain.valueobject.AccusePenaltyPolicy; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@Slf4j +@RequiredArgsConstructor +public class AccuseMemberCommandHandler { + + private final AccusePenaltyPolicy accusePenaltyPolicy; + private final MemberDomainService memberDomainService; + private final MemberHelper memberHelper; + + @Transactional + public void accuse(MemberId memberId) { + Member member = memberHelper.get(memberId); + Member accusedMember = memberDomainService.accuseMember(member, accusePenaltyPolicy); + memberHelper.save(accusedMember); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/DetailMemberQueryHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/DetailMemberQueryHandler.java new file mode 100644 index 00000000..09968d24 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/DetailMemberQueryHandler.java @@ -0,0 +1,26 @@ +package com.project.imdang.member.domain.handler.member; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.dto.member.MemberResult; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.handler.MemberHelper; +import com.project.imdang.member.domain.mapper.MemberDataMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@RequiredArgsConstructor +@Slf4j +public class DetailMemberQueryHandler { + + private final MemberDataMapper memberDataMapper; + private final MemberHelper memberHelper; + + @Transactional(readOnly = true) + public MemberResult detailMember(MemberId memberId) { + Member member = memberHelper.get(memberId); + return memberDataMapper.memberToDetailMemberResponse(member); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/DetailMyPageInfoQueryHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/DetailMyPageInfoQueryHandler.java new file mode 100644 index 00000000..396d7352 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/DetailMyPageInfoQueryHandler.java @@ -0,0 +1,27 @@ +package com.project.imdang.member.domain.handler.member; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.dto.member.MyPageInfoResult; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.handler.MemberHelper; +import com.project.imdang.member.domain.mapper.MemberDataMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@RequiredArgsConstructor +@Slf4j +public class DetailMyPageInfoQueryHandler { + + private final MemberHelper memberHelper; + private final MemberDataMapper memberDataMapper; + + @Transactional(readOnly = true) + public MyPageInfoResult detailMyPage(MemberId memberId) { + Member member = memberHelper.get(memberId); + log.info("MyPage of Member[id : {}] is viewed.", member.getId().getValue()); + return memberDataMapper.memberToDetailMyPageResponse(member); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/ListMemberCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/ListMemberQueryHandler.java similarity index 51% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/ListMemberCommandHandler.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/ListMemberQueryHandler.java index e1723234..60475ffb 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/ListMemberCommandHandler.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/ListMemberQueryHandler.java @@ -1,31 +1,27 @@ -package com.project.imdang.member.service.domain.handler.member; +package com.project.imdang.member.domain.handler.member; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.dto.MemberResponse; -import com.project.imdang.member.service.domain.mapper.MemberDataMapper; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.dto.member.MemberResult; +import com.project.imdang.member.domain.mapper.MemberDataMapper; +import com.project.imdang.member.domain.ports.output.repository.MemberRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.UUID; import java.util.stream.Collectors; @Component @RequiredArgsConstructor @Slf4j -public class ListMemberCommandHandler { +public class ListMemberQueryHandler { private final MemberDataMapper memberDataMapper; private final MemberRepository memberRepository; @Transactional(readOnly = true) - public List listMember(List _memberIds) { - List memberIds = _memberIds.stream() - .map(MemberId::new) - .toList(); + public List listMember(List memberIds) { return memberRepository.findAllByIds(memberIds).stream() .map(memberDataMapper::memberToDetailMemberResponse) .collect(Collectors.toList()); diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/UpdateInsightCountCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/UpdateInsightCountCommandHandler.java new file mode 100644 index 00000000..23adab4c --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/handler/member/UpdateInsightCountCommandHandler.java @@ -0,0 +1,31 @@ +package com.project.imdang.member.domain.handler.member; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.MemberDomainService; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.handler.MemberHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Slf4j +@RequiredArgsConstructor +@Component +public class UpdateInsightCountCommandHandler { + + private final MemberDomainService memberDomainService; + private final MemberHelper memberHelper; + + @Transactional + public void increaseInsightCount(MemberId memberId) { + Member member = memberHelper.get(memberId); + Member accusedMember = memberDomainService.increaseInsightCount(member); + memberHelper.save(accusedMember); + } + + @Transactional + public void decreaseInsightCount(MemberId memberId) { + throw new RuntimeException(); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/mapper/MemberDataMapper.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/mapper/MemberDataMapper.java new file mode 100644 index 00000000..85aa660e --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/mapper/MemberDataMapper.java @@ -0,0 +1,28 @@ +package com.project.imdang.member.domain.mapper; + +import com.project.imdang.member.domain.dto.member.MemberResult; +import com.project.imdang.member.domain.dto.member.MyPageInfoResult; +import com.project.imdang.member.domain.entity.Member; +import org.springframework.stereotype.Component; + +@Component +public class MemberDataMapper { + + public MyPageInfoResult memberToDetailMyPageResponse(Member member) { + return MyPageInfoResult.builder() + .nickname(member.getNickname()) + .insightCount(member.getInsightCount()) + .build(); + } + + public MemberResult memberToDetailMemberResponse(Member member){ + return MemberResult.builder() + .memberId(member.getId()) + .nickname(member.getNickname()) + .birthDate(member.getBirthDate()) + .gender(member.getGender() != null ? member.getGender().name() : null) + .deviceToken(member.getDeviceToken()) + .insightCount(member.getInsightCount()) + .build(); + } +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/input/service/AuthApplicationService.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/input/service/AuthApplicationService.java new file mode 100644 index 00000000..4d495aa7 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/input/service/AuthApplicationService.java @@ -0,0 +1,13 @@ +package com.project.imdang.member.domain.ports.input.service; + +import com.project.imdang.member.domain.dto.auth.JoinMemberCommand; +import com.project.imdang.member.domain.dto.auth.LoginResult; +import com.project.imdang.member.domain.dto.auth.ReissueTokenCommand; +import com.project.imdang.member.domain.dto.auth.TokenResult; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; + +public interface AuthApplicationService { + LoginResult login(OAuthLoginCommand loginCommand); + void join(JoinMemberCommand joinMemberCommand); + TokenResult reissue(ReissueTokenCommand reissueTokenCommand); +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/input/service/MemberApplicationService.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/input/service/MemberApplicationService.java new file mode 100644 index 00000000..1dc8c3e0 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/input/service/MemberApplicationService.java @@ -0,0 +1,25 @@ +package com.project.imdang.member.domain.ports.input.service; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.dto.member.MemberResult; +import com.project.imdang.member.domain.dto.member.MyPageInfoResult; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import org.springframework.scheduling.annotation.Async; + +import java.util.List; + +public interface MemberApplicationService { + + void logout(MemberId memberId); + void withdraw(OAuthWithdrawCommand withdrawCommand); + + List listMember(List memberIds); + MemberResult detailMember(MemberId memberId); + MyPageInfoResult detailMyPage(MemberId memberId); + + void accuseMember(MemberId memberId); + + @Async + void increaseInsightCount(MemberId memberId); + void decreaseInsightCount(MemberId memberId); +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/client/OAuthApiClientHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/client/OAuthApiClientHandler.java new file mode 100644 index 00000000..27587ec0 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/client/OAuthApiClientHandler.java @@ -0,0 +1,12 @@ +package com.project.imdang.member.domain.ports.output.client; + +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import com.project.imdang.common.domain.valueobject.OAuthType; + +public interface OAuthApiClientHandler { + OAuthType oAuthType(); + OAuthLoginResponse getOAuthInfo(OAuthLoginCommand loginCommand); + void withdraw(OAuthWithdrawCommand withdrawCommand); +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/provider/TokenProvider.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/provider/TokenProvider.java new file mode 100644 index 00000000..87662d77 --- /dev/null +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/provider/TokenProvider.java @@ -0,0 +1,21 @@ +package com.project.imdang.member.domain.ports.output.provider; + +import java.util.Date; + +public interface TokenProvider { + + /** + * AccessToken 생성 함수 + */ + String generateAccessToken(String subject, Date expiredAt); + + /** + * RefreshToken 생성 함수 + */ + String generateRefreshToken(Date expiredAt); + + /** + * 토큰 유효성 검증 + */ + boolean verifyToken(String token); +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/MemberRepository.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/repository/MemberRepository.java similarity index 64% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/MemberRepository.java rename to member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/repository/MemberRepository.java index 48b94886..f5cb99e6 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/MemberRepository.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/repository/MemberRepository.java @@ -1,8 +1,8 @@ -package com.project.imdang.member.service.domain.ports.output; +package com.project.imdang.member.domain.ports.output.repository; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.common.domain.valueobject.OAuthType; import java.util.List; import java.util.Optional; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/MemberApplicationServiceImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/MemberApplicationServiceImpl.java deleted file mode 100644 index 902265ce..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/MemberApplicationServiceImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.project.imdang.member.service.domain; - -import com.project.imdang.member.service.domain.dto.*; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.handler.auth.JoinCommandHandler; -import com.project.imdang.member.service.domain.handler.auth.OAuthLoginCommandHandler; -import com.project.imdang.member.service.domain.handler.auth.ReissueCommandHandler; -import com.project.imdang.member.service.domain.handler.member.DetailMemberCommandHandler; -import com.project.imdang.member.service.domain.handler.member.DetailMyPageCommandHandler; -import com.project.imdang.member.service.domain.handler.member.ListMemberCommandHandler; -import com.project.imdang.member.service.domain.handler.member.LogoutCommandHandler; -import com.project.imdang.member.service.domain.handler.member.WithdrawCommandHandler; -import com.project.imdang.member.service.domain.ports.input.service.MemberApplicationService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.UUID; - -@Slf4j -@Service -@RequiredArgsConstructor -public class MemberApplicationServiceImpl implements MemberApplicationService { - - private final OAuthLoginCommandHandler oAuthLoginCommandHandler; - private final JoinCommandHandler joinCommandHandler; - private final DetailMyPageCommandHandler detailMyPageCommandHandler; - private final DetailMemberCommandHandler detailMemberCommandHandler; - private final ListMemberCommandHandler listMemberCommandHandler; - - private final LogoutCommandHandler logoutCommandHandler; - private final WithdrawCommandHandler withdrawCommandHandler; - private final ReissueCommandHandler reissueCommandHandler; - - @Override - public LoginResponse login(OAuthLoginCommand loginCommand) { - return oAuthLoginCommandHandler.login(loginCommand); - } - - @Override - public void join(UUID memberId, JoinCommand joinCommand) { - joinCommandHandler.join(memberId, joinCommand); - } - - @Override - public MemberResponse detailMember(UUID memberId) { - return detailMemberCommandHandler.detailMember(memberId); - } - - @Override - public List listMember(List memberIds) { - return listMemberCommandHandler.listMember(memberIds); - } - - @Override - public DetailMyPageResponse detailMyPage(DetailMyPageQuery detailMyPageQuery) { - return detailMyPageCommandHandler.detailMyPage(detailMyPageQuery); - } - - @Override - public void logout(UUID memberId) { - logoutCommandHandler.logout(memberId); - } - - @Override - public void withdraw(UUID memberId, OAuthWithdrawCommand withdrawCommand) { - withdrawCommandHandler.withdraw(memberId, withdrawCommand); - } - - @Override - public TokenResponse reissue(TokenReissueCommand tokenReissueCommand) { - return reissueCommandHandler.reissue(tokenReissueCommand); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/MemberCouponApplicationServiceImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/MemberCouponApplicationServiceImpl.java deleted file mode 100644 index af4a9435..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/MemberCouponApplicationServiceImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.project.imdang.member.service.domain; - -import com.project.imdang.member.service.domain.dto.coupon.IssueMemberCouponCommand; -import com.project.imdang.member.service.domain.dto.coupon.DetailMyCouponResponse; -import com.project.imdang.member.service.domain.handler.coupon.IssueMemberCouponCommandHandler; -import com.project.imdang.member.service.domain.handler.coupon.DetailMyCouponHandler; -import com.project.imdang.member.service.domain.ports.input.service.MemberCouponApplicationService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.UUID; - -@Service -@RequiredArgsConstructor -public class MemberCouponApplicationServiceImpl implements MemberCouponApplicationService { - - private final IssueMemberCouponCommandHandler issueMemberCouponCommandHandler; - private final DetailMyCouponHandler detailMyCouponHandler; - - @Override - public DetailMyCouponResponse detailMyCoupon(UUID memberId) { - return detailMyCouponHandler.detailMyCoupon(memberId); - } - - @Override - public void issueMemberCoupon(IssueMemberCouponCommand issueMemberCouponCommand) { - issueMemberCouponCommandHandler.issue(issueMemberCouponCommand); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/DetailMyPageQuery.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/DetailMyPageQuery.java deleted file mode 100644 index add8f8f7..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/DetailMyPageQuery.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.member.service.domain.dto; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Getter -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DetailMyPageQuery { - private UUID memberId; -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/DetailMyPageResponse.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/DetailMyPageResponse.java deleted file mode 100644 index d4ce0ee8..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/DetailMyPageResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.imdang.member.service.domain.dto; - -import lombok.*; - -@Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DetailMyPageResponse { - private String nickname; - private Integer insightCount; - private Integer requestCount; -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/LoginResponse.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/LoginResponse.java deleted file mode 100644 index 8d1f31d9..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/LoginResponse.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.project.imdang.member.service.domain.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@Schema(description = "로그인 응답") -public class LoginResponse { - private String accessToken; - private String refreshToken; - private Long expiresIn; - @Schema(description = "온보딩 여부") - private boolean isJoined; - private boolean isCouponReceived; - private UUID memberId; - private String appleRefreshToken; - - public static LoginResponse from(TokenResponse response, boolean isJoined, boolean isCouponReceived, UUID memberId, String refreshToken) { - return new LoginResponse(response.getAccessToken(), response.getRefreshToken(), response.getExpiresIn(), isJoined, isCouponReceived, memberId, refreshToken); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/MemberResponse.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/MemberResponse.java deleted file mode 100644 index 60f164b0..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/MemberResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.project.imdang.member.service.domain.dto; - -import lombok.*; - -import java.util.UUID; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -@Builder -public class MemberResponse { - private UUID memberId; - private String nickname; - private String birthDate; - private String gender; - private String deviceToken; - - private int exchangeCount; - private int insightCount; - private int rejectedCount; -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/TokenReissueCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/TokenReissueCommand.java deleted file mode 100644 index b2eb52b8..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/TokenReissueCommand.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.member.service.domain.dto; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.*; - -import java.util.UUID; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -@Builder -public class TokenReissueCommand { - @NotNull - private UUID memberId; - @NotBlank - private String refreshToken; -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/coupon/DetailMyCouponResponse.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/coupon/DetailMyCouponResponse.java deleted file mode 100644 index 8422a84d..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/coupon/DetailMyCouponResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.project.imdang.member.service.domain.dto.coupon; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DetailMyCouponResponse { - @Schema(description = "보유한 쿠폰 갯수") - private Integer couponCount; - private Long memberCouponId; -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/coupon/IssueMemberCouponCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/coupon/IssueMemberCouponCommand.java deleted file mode 100644 index d0e71582..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/coupon/IssueMemberCouponCommand.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.project.imdang.member.service.domain.dto.coupon; - -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.UUID; - -@Getter -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class IssueMemberCouponCommand { - @Setter - private UUID memberId; - @NotNull - private String name; -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthWithdrawCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthWithdrawCommand.java deleted file mode 100644 index 0d74a217..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/OAuthWithdrawCommand.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.member.service.domain.dto.oauth; - -import com.project.imdang.member.service.domain.valueobject.OAuthType; -import org.springframework.util.MultiValueMap; - -public interface OAuthWithdrawCommand { - OAuthType oAuthType(); - MultiValueMap makeBody(); -} \ No newline at end of file diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleWithdrawCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleWithdrawCommand.java deleted file mode 100644 index db02e358..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleWithdrawCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.member.service.domain.dto.oauth.apple; - -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; -import lombok.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class AppleWithdrawCommand implements OAuthWithdrawCommand { - private String token; - @Override - public OAuthType oAuthType() { - return OAuthType.APPLE; - } - - @Override - public MultiValueMap makeBody() { - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("token", token); - return body; - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleWithdrawCommand.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleWithdrawCommand.java deleted file mode 100644 index 6cc97732..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleWithdrawCommand.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.member.service.domain.dto.oauth.google; - -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; -import lombok.*; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class GoogleWithdrawCommand implements OAuthWithdrawCommand { - private String token; - @Override - public OAuthType oAuthType() { - return OAuthType.GOOGLE; - } - - @Override - public MultiValueMap makeBody() { - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("token", token); - return body; - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestAcceptedCountMessageListenerImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestAcceptedCountMessageListenerImpl.java deleted file mode 100644 index 5e36a975..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestAcceptedCountMessageListenerImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.project.imdang.member.service.domain.handler; - -import com.project.imdang.domain.message.ExchangeRequestAcceptedCountRequestMessage; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberNotFoundException; -import com.project.imdang.member.service.domain.ports.input.listener.ExchangeRequestAcceptedCountMessageListener; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class ExchangeRequestAcceptedCountMessageListenerImpl implements ExchangeRequestAcceptedCountMessageListener { - - private final MemberRepository memberRepository; - private final MemberDomainService memberDomainService; - - - @Override - public void handle(ExchangeRequestAcceptedCountRequestMessage exchangeRequestCountRequestMessage) { - MemberId memberId = new MemberId(exchangeRequestCountRequestMessage.getMemberId()); - Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberNotFoundException(memberId)); - - member = memberDomainService.updateExchangeRequestAcceptedCount(member); - memberRepository.save(member); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestCreatedRequestMessageListenerImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestCreatedRequestMessageListenerImpl.java deleted file mode 100644 index f71fdc4b..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestCreatedRequestMessageListenerImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.project.imdang.member.service.domain.handler; - -import com.project.imdang.domain.message.ExchangeRequestCreatedRequestMessage; -import com.project.imdang.domain.message.MemberCouponUsedResponseMessage; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.member.service.domain.MemberCouponDomainService; -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import com.project.imdang.member.service.domain.exception.MemberCouponNotFoundException; -import com.project.imdang.member.service.domain.ports.input.listener.ExchangeRequestCreatedRequestMessageListener; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@RequiredArgsConstructor -@Component -public class ExchangeRequestCreatedRequestMessageListenerImpl implements ExchangeRequestCreatedRequestMessageListener { - - private final ApplicationEventPublisher applicationEventPublisher; - private final MemberCouponRepository memberCouponRepository; - - private final MemberCouponDomainService memberCouponDomainService; - - // TODO - vs TransactionalEventListener - @EventListener - @Transactional - public void handle(ExchangeRequestCreatedRequestMessage exchangeRequestCreatedRequestMessage) { - - MemberCouponId memberCouponId = new MemberCouponId(exchangeRequestCreatedRequestMessage.getMemberCouponId()); - MemberCoupon memberCoupon = memberCouponRepository.findById(memberCouponId) - .orElseThrow(() -> new MemberCouponNotFoundException(memberCouponId)); - memberCoupon = memberCouponDomainService.use(memberCoupon); - memberCouponRepository.save(memberCoupon); - - // update - MemberCouponUsedResponseMessage memberCouponUsedResponseMessage - = new MemberCouponUsedResponseMessage(true, memberCoupon.getId().getValue()); - applicationEventPublisher.publishEvent(memberCouponUsedResponseMessage); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestRejectedCountMessageListenerImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestRejectedCountMessageListenerImpl.java deleted file mode 100644 index 3f25c32d..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestRejectedCountMessageListenerImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.project.imdang.member.service.domain.handler; - -import com.project.imdang.domain.message.ExchangeRequestRejectedCountRequestMessage; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.dto.coupon.IssueMemberCouponCommand; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberNotFoundException; -import com.project.imdang.member.service.domain.handler.coupon.IssueMemberCouponCommandHandler; -import com.project.imdang.member.service.domain.ports.input.listener.ExchangeRequestRejectedCountMessageListener; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class ExchangeRequestRejectedCountMessageListenerImpl implements ExchangeRequestRejectedCountMessageListener { - - private final static String FIRST_CHEERUP = "FirstCheerup"; - private final static String SECOND_CHEERUP = "SecondCheerup"; - private final static String THIRD_CHEERUP = "ThirdCheerup"; - - private final MemberRepository memberRepository; - private final MemberDomainService memberDomainService; - private final IssueMemberCouponCommandHandler issueMemberCouponCommandHandler; - - // TODO - vs TransactionalEventListener - @Override - @Async - @EventListener - public void handle(ExchangeRequestRejectedCountRequestMessage exchangeRequestRejectedCountRequestMessage) { - // 1. 받은 사용자 아이디로 유저 찾기 - MemberId memberId = new MemberId(exchangeRequestRejectedCountRequestMessage.getMemberId()); - Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberNotFoundException(memberId)); - // 2. 유저의 거절 횟수++ - member = memberDomainService.updateRejectedCount(member); - // 3. 만약 카운트가 된다면? -> 쿠폰 발급! - checkRejectedCountAndIssueCoupon(member); - } - - private void checkRejectedCountAndIssueCoupon(Member member) { - switch (member.getRejectedCount()) { - case 5 -> - issueMemberCouponCommandHandler.issue(new IssueMemberCouponCommand(member.getId().getValue(), FIRST_CHEERUP)); - case 10 -> - issueMemberCouponCommandHandler.issue(new IssueMemberCouponCommand(member.getId().getValue(), SECOND_CHEERUP)); - case 20 -> - issueMemberCouponCommandHandler.issue(new IssueMemberCouponCommand(member.getId().getValue(), THIRD_CHEERUP)); - } - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestRejectedRequestMessageListenerImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestRejectedRequestMessageListenerImpl.java deleted file mode 100644 index 4fb8eace..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/ExchangeRequestRejectedRequestMessageListenerImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.project.imdang.member.service.domain.handler; - -import com.project.imdang.domain.message.ExchangeRequestRejectedRequestMessage; -import com.project.imdang.domain.message.MemberCouponCancelledResponseMessage; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.member.service.domain.MemberCouponDomainService; -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import com.project.imdang.member.service.domain.exception.MemberCouponNotFoundException; -import com.project.imdang.member.service.domain.ports.input.listener.ExchangeRequestRejectedRequestMessageListener; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class ExchangeRequestRejectedRequestMessageListenerImpl implements ExchangeRequestRejectedRequestMessageListener { - - private final ApplicationEventPublisher applicationEventPublisher; - - private final MemberCouponRepository memberCouponRepository; - private final MemberCouponDomainService memberCouponDomainService; - - // TODO - vs TransactionalEventListener - @EventListener - public void handle(ExchangeRequestRejectedRequestMessage exchangeRequestRejectedRequestMessage) { - - MemberCouponId memberCouponId = new MemberCouponId(exchangeRequestRejectedRequestMessage.getMemberCouponId()); - MemberCoupon memberCoupon = memberCouponRepository.findById(memberCouponId) - .orElseThrow(() -> new MemberCouponNotFoundException(memberCouponId)); - memberCouponDomainService.cancel(memberCoupon); - memberCouponRepository.save(memberCoupon); - - // update - MemberCouponCancelledResponseMessage memberCouponCancelledResponseMessage = new MemberCouponCancelledResponseMessage( - true, - memberCoupon.getId().getValue()); - applicationEventPublisher.publishEvent(memberCouponCancelledResponseMessage); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/InsightAccusedRequestMessageListenerImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/InsightAccusedRequestMessageListenerImpl.java deleted file mode 100644 index 52c19396..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/InsightAccusedRequestMessageListenerImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.project.imdang.member.service.domain.handler; - -import com.project.imdang.domain.message.InsightAccusedRequestMessage; -import com.project.imdang.domain.message.MemberAccusedResponseMessage; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberNotFoundException; -import com.project.imdang.member.service.domain.ports.input.listener.InsightAccusedRequestMessageListener; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; -import com.project.imdang.member.service.domain.valueobject.AccusePenaltyPolicy; -import lombok.RequiredArgsConstructor; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class InsightAccusedRequestMessageListenerImpl implements InsightAccusedRequestMessageListener { - - private final ApplicationEventPublisher applicationEventPublisher; - private final MemberRepository memberRepository; - private final AccusePenaltyPolicy accusePenaltyPolicy; - - // TODO - vs TransactionalEventListener - @EventListener - public void handle(InsightAccusedRequestMessage insightAccusedRequestMessage) { - - MemberId accusedMemberId = new MemberId(insightAccusedRequestMessage.getAccusedMemberId()); - Member accusedMember = memberRepository.findById(accusedMemberId) - .orElseThrow(() -> new MemberNotFoundException(accusedMemberId)); - // TODO - CHECK - accusedMember.increaseAccusedCount(accusePenaltyPolicy); - memberRepository.save(accusedMember); - - MemberAccusedResponseMessage memberAccusedResponseMessage = new MemberAccusedResponseMessage(true, accusedMemberId.getValue()); - applicationEventPublisher.publishEvent(memberAccusedResponseMessage); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/InsightCreatedCountMessageListenerImpl.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/InsightCreatedCountMessageListenerImpl.java deleted file mode 100644 index f1f7ec64..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/InsightCreatedCountMessageListenerImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.project.imdang.member.service.domain.handler; - -import com.project.imdang.domain.message.InsightCreatedCountRequestMessage; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberNotFoundException; -import com.project.imdang.member.service.domain.ports.input.listener.InsightCreatedCountMessageListener; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class InsightCreatedCountMessageListenerImpl implements InsightCreatedCountMessageListener { - - private final MemberRepository memberRepository; - private final MemberDomainService memberDomainService; - - @Override - @Async - @EventListener - public void handle(InsightCreatedCountRequestMessage insightCreatedCountRequestMessage) { - MemberId memberId = new MemberId(insightCreatedCountRequestMessage.getMemberId()); - Member member = memberRepository.findById(memberId) - .orElseThrow(() -> new MemberNotFoundException(memberId)); - - member = memberDomainService.updateInsightCreatedCount(member); - memberRepository.save(member); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/JoinCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/JoinCommandHandler.java deleted file mode 100644 index b598f82e..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/JoinCommandHandler.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.project.imdang.member.service.domain.handler.auth; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.dto.JoinCommand; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.handler.MemberHelper; -import jakarta.validation.ConstraintViolationException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.UUID; - -@Component -@Slf4j -@RequiredArgsConstructor -public class JoinCommandHandler { - - private final MemberDomainService memberDomainService; - private final MemberHelper memberHelper; - - @Transactional - public void join(UUID memberId, JoinCommand joinCommand) { - // 1. 토큰에서 유저 정보 추출 후 검증 - Member member = checkMember(memberId); - // 2. 닉네임 중복검사 - checkDuplicateNickname(joinCommand.getNickname()); - // 3. 회원가입 (입력 정보 업데이트) - Member updatedMember = memberDomainService.join(member, joinCommand.getNickname(), joinCommand.getBirthDate(), joinCommand.getGender(), joinCommand.getDeviceToken()); - // 4. 저장 - memberHelper.save(updatedMember); - } - - private Member checkMember(UUID _memberId) { - MemberId memberId = new MemberId(_memberId); - Member member = memberHelper.get(memberId); - log.info("Member[id : {}] logged in.", member.getId().getValue()); - return member; - } - - private void checkDuplicateNickname(String nickname) { - if (memberHelper.getByNickname(nickname).isPresent()) { - String errorMessage = "Nickname is already used!"; - log.error(errorMessage); - throw new ConstraintViolationException(errorMessage, null); - } - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/OAuthApiClientHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/OAuthApiClientHandler.java deleted file mode 100644 index 47774514..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/OAuthApiClientHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.member.service.domain.handler.auth; - -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; - -public interface OAuthApiClientHandler { - OAuthType oAuthType(); - OAuthLoginResponse getOAuthInfo(OAuthLoginCommand loginCommand); - void withdraw(OAuthWithdrawCommand withdrawCommand); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/ReissueCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/ReissueCommandHandler.java deleted file mode 100644 index e6338574..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/ReissueCommandHandler.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.project.imdang.member.service.domain.handler.auth; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.MemberDomainService; -import com.project.imdang.member.service.domain.dto.TokenReissueCommand; -import com.project.imdang.member.service.domain.dto.TokenResponse; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberDomainException; -import com.project.imdang.member.service.domain.handler.MemberHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.UUID; - -@Component -@Slf4j -@RequiredArgsConstructor -public class ReissueCommandHandler { - private final MemberDomainService memberDomainService; - private final MemberHelper memberHelper; - private final TokenRequestHandler tokenRequestHandler; - - @Transactional - public TokenResponse reissue(TokenReissueCommand tokenReissueCommand) { - Member member = check(tokenReissueCommand.getMemberId()); - validate(tokenReissueCommand.getRefreshToken(), member); - TokenResponse tokenResponse = tokenRequestHandler.generate(member); - log.info("Member[id: {}] token is reissued.", member.getId().getValue()); - memberHelper.save(memberDomainService.storeRefreshToken(member, tokenResponse.getRefreshToken())); - return tokenResponse; - } - - private void validate(String refreshToken, Member member) { - // 1. 유효한 리프레쉬인지 - tokenRequestHandler.validateRefreshToken(refreshToken); - // 2. 일치하는 리프레쉬토큰인지 - if (!member.getRefreshToken().equals(refreshToken)) { - //TODO : 보완 - throw new MemberDomainException("Invalid Token"); - } - } - - private Member check(UUID _memberId) { - MemberId memberId = new MemberId(_memberId); - return memberHelper.get(memberId); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/TokenRequestHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/TokenRequestHandler.java deleted file mode 100644 index 88568802..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/TokenRequestHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.project.imdang.member.service.domain.handler.auth; - -import com.project.imdang.domain.jwt.JwtTokenProvider; -import com.project.imdang.member.service.domain.dto.TokenResponse; -import com.project.imdang.member.service.domain.entity.Member; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Date; - -@Component -@Slf4j -@RequiredArgsConstructor -public class TokenRequestHandler { - - private final JwtTokenProvider jwtTokenProvider; - - private static final String BEARER_TYPE = "Bearer"; - private static final long ACCESS_TOKEN_EXPIRE_TIME = 1000 * 60 * 60 * 5; // 5시간 - private static final long REFRESH_TOKEN_EXPIRE_TIME = 1000 * 60 * 60 * 24 * 7; // 7일 - - public TokenResponse generate(Member member) { - Date accessTokenExpiredAt = new Date(System.currentTimeMillis() + ACCESS_TOKEN_EXPIRE_TIME); - Date refreshTokenExpiredAt = new Date(System.currentTimeMillis() + REFRESH_TOKEN_EXPIRE_TIME); - - String subject = member.getId().getValue().toString(); - String accessToken = jwtTokenProvider.generateAccessToken(subject, accessTokenExpiredAt); - log.info("AccessToken of member[id : {}] is generated : {}.", member.getId().getValue(), accessToken); - - String refreshToken = jwtTokenProvider.generateRefreshToken(refreshTokenExpiredAt); - log.info("RefreshToken of member[id : {}] is generated : {}.", member.getId().getValue(), refreshToken); - - return new TokenResponse(accessToken, refreshToken,ACCESS_TOKEN_EXPIRE_TIME / 1000L); - } - - public void validateRefreshToken(String refreshToken) { - jwtTokenProvider.verifyToken(refreshToken); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/DetailMyCouponHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/DetailMyCouponHandler.java deleted file mode 100644 index ba9b01d7..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/DetailMyCouponHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.project.imdang.member.service.domain.handler.coupon; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.dto.coupon.DetailMyCouponResponse; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import com.project.imdang.member.service.domain.handler.MemberHelper; -import com.project.imdang.member.service.domain.mapper.MemberCouponDataMapper; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.UUID; - -@Component -@Slf4j -@RequiredArgsConstructor -public class DetailMyCouponHandler { - - private final MemberHelper memberHelper; - private final MemberCouponRepository memberCouponRepository; - private final MemberCouponDataMapper memberCouponDataMapper; - - @Transactional(readOnly = true) - public DetailMyCouponResponse detailMyCoupon(UUID _memberId) { - - MemberId memberId = new MemberId(_memberId); - Member member = memberHelper.get(memberId); - // MemberCoupon 조회 - List memberCoupons = memberCouponRepository.findAllByMemberIdAndUsed(member.getId(), Boolean.FALSE); - log.info("Member[id: {}] has {} coupons.", member.getId().getValue(), memberCoupons.size()); - return memberCouponDataMapper.memberCouponsToDetailMyCouponResponse(memberCoupons); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/IssueMemberCouponCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/IssueMemberCouponCommandHandler.java deleted file mode 100644 index f0ea6676..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/IssueMemberCouponCommandHandler.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.project.imdang.member.service.domain.handler.coupon; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.MemberCouponDomainService; -import com.project.imdang.member.service.domain.dto.coupon.IssueMemberCouponCommand; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import com.project.imdang.member.service.domain.exception.CouponNotFoundException; -import com.project.imdang.member.service.domain.exception.MemberCouponDomainException; -import com.project.imdang.member.service.domain.handler.MemberHelper; -import com.project.imdang.member.service.domain.handler.coupon.policy.CouponPolicy; -import com.project.imdang.member.service.domain.mapper.MemberCouponDataMapper; -import com.project.imdang.member.service.domain.ports.output.CouponRepository; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; - -@Component -@Slf4j -public class IssueMemberCouponCommandHandler { - private final MemberCouponDataMapper memberCouponDataMapper; - private final MemberCouponRepository memberCouponRepository; - private final CouponRepository couponRepository; - private final MemberHelper memberHelper; - private final MemberCouponDomainService memberCouponDomainService; - private final Map couponPolicies; - - public IssueMemberCouponCommandHandler(MemberCouponDataMapper memberCouponDataMapper, - MemberCouponRepository memberCouponRepository, - CouponRepository couponRepository, - MemberHelper memberHelper, - MemberCouponDomainService memberCouponDomainService, - List couponPolicies) { - this.memberCouponDataMapper = memberCouponDataMapper; - this.memberCouponRepository = memberCouponRepository; - this.couponRepository = couponRepository; - this.memberHelper = memberHelper; - this.memberCouponDomainService = memberCouponDomainService; - this.couponPolicies = couponPolicies.stream() - .collect(Collectors.toMap(couponPolicy -> - couponPolicy.getClass().getAnnotation(Component.class).value(), - Function.identity())); - } - - @Transactional - public void issue(IssueMemberCouponCommand issueMemberCouponCommand) { - // 1. 쿠폰 종류 확인 - Coupon coupon = checkCoupon(issueMemberCouponCommand.getName()); - // 2. 사용자 확인 - MemberId memberId = new MemberId(issueMemberCouponCommand.getMemberId()); - Member member = memberHelper.get(memberId); - // 2-1. 웰컴 쿠폰 받기 저장 - if(issueMemberCouponCommand.getName().equals("Welcome")) { - member.updateCouponReceivedStatus(); - memberHelper.save(member); - } - // 3. 쿠폰 정책 적용 - CouponPolicy couponPolicy = couponPolicies.get(issueMemberCouponCommand.getName()); - Integer couponQuantity = couponPolicy.apply(coupon, member); - // 4. 쿠폰 발급 - List memberCoupons = memberCouponDataMapper.issueMemberCouponCommandToMemberCoupons(member, coupon, couponQuantity); - memberCoupons.forEach(memberCouponDomainService::issue); - // 5. 쿠폰 저장 - save(memberCoupons); - log.info("MemberCoupons are issued by Member[id: {}].", member.getId().getValue()); - } - - private List save(List memberCoupons) { - List saved = memberCouponRepository.saveAll(memberCoupons); - if (saved.isEmpty()) { - String errorMessage = "Could not save memberCoupons!"; - log.error(errorMessage); - throw new MemberCouponDomainException(errorMessage); - } - saved.forEach(coupon -> log.info("MemberCoupon[id: {}] is saved.", coupon.getId().getValue())); - return saved; - } - - private Coupon checkCoupon(String couponName) { - return couponRepository.findByName(couponName) - .orElseThrow(() -> new CouponNotFoundException(String.format("Could not find Coupon [name : %s]", couponName))); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/CouponPolicy.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/CouponPolicy.java deleted file mode 100644 index d57c137f..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/CouponPolicy.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.project.imdang.member.service.domain.handler.coupon.policy; - -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.entity.Member; - -public interface CouponPolicy { - - Integer apply(Coupon coupon, Member member); - - void validate(Coupon coupon, Member member); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/FirstCheerUpCouponPolicy.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/FirstCheerUpCouponPolicy.java deleted file mode 100644 index cf2a29f1..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/FirstCheerUpCouponPolicy.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.project.imdang.member.service.domain.handler.coupon.policy; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberCouponDomainException; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component("FirstCheerUp") -@RequiredArgsConstructor -public class FirstCheerUpCouponPolicy implements CouponPolicy{ - private static final Integer REJECT_CRITERIA = 5; - private static final Integer ISSUE_QUANTITY = 1; - private final MemberCouponRepository memberCouponRepository; - - - @Override - public Integer apply(Coupon coupon, Member member) { - validate(coupon, member); - return ISSUE_QUANTITY; - } - - @Override - public void validate(Coupon coupon, Member member) { - checkRejectCount(member); - checkReissue(coupon.getId(), member.getId()); - } - - private Boolean checkReissue(CouponId couponId, MemberId memberId) { - if(memberCouponRepository.existsByCouponIdAndMemberId(couponId, memberId)){ - throw new MemberCouponDomainException("Already issued Coupon!"); - } - return Boolean.TRUE; - } - - private Boolean checkRejectCount(Member member) { - if (member.getRejectedCount() < REJECT_CRITERIA) { - throw new MemberCouponDomainException("Reject Count does not meet criteria"); - } - return Boolean.TRUE; - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/JoinedCouponPolicy.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/JoinedCouponPolicy.java deleted file mode 100644 index e9f74174..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/JoinedCouponPolicy.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.project.imdang.member.service.domain.handler.coupon.policy; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberCouponDomainException; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component("Welcome") -@RequiredArgsConstructor -public class JoinedCouponPolicy implements CouponPolicy{ - private static final Integer ISSUE_QUANTITY = 3; - private final MemberCouponRepository memberCouponRepository; - - @Override - public Integer apply(Coupon coupon, Member member) { - validate(coupon, member); - return ISSUE_QUANTITY; - } - - @Override - public void validate(Coupon coupon, Member member) { - checkReissue(coupon.getId(), member.getId()); - } - - // 재발급 검사 - private Boolean checkReissue(CouponId couponId, MemberId memberId) { - if(memberCouponRepository.existsByCouponIdAndMemberId(couponId, memberId)){ - throw new MemberCouponDomainException("Already issued Coupon!"); - } - return Boolean.TRUE; - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/SecondCheerUpCouponPolicy.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/SecondCheerUpCouponPolicy.java deleted file mode 100644 index 8c70e9e4..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/SecondCheerUpCouponPolicy.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.project.imdang.member.service.domain.handler.coupon.policy; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberCouponDomainException; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component("SecondCheerUp") -@RequiredArgsConstructor -public class SecondCheerUpCouponPolicy implements CouponPolicy{ - - private static final Integer REJECT_CRITERIA = 10; - private static final Integer ISSUE_QUANTITY = 3; - private final MemberCouponRepository memberCouponRepository; - - @Override - public Integer apply(Coupon coupon, Member member) { - validate(coupon, member); - return ISSUE_QUANTITY; - } - - @Override - public void validate(Coupon coupon, Member member) { - checkRejectCount(member); - checkReissue(coupon.getId(), member.getId()); - } - - private Boolean checkReissue(CouponId couponId, MemberId memberId) { - if(memberCouponRepository.existsByCouponIdAndMemberId(couponId, memberId)){ - throw new MemberCouponDomainException("Already issued Coupon!"); - } - return Boolean.TRUE; - } - - private Boolean checkRejectCount(Member member) { - if (member.getRejectedCount() < REJECT_CRITERIA) { - throw new MemberCouponDomainException("Reject Count does not meet criteria"); - } - return Boolean.TRUE; - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/ThirdCheerUpCouponPolicy.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/ThirdCheerUpCouponPolicy.java deleted file mode 100644 index 3111802a..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/coupon/policy/ThirdCheerUpCouponPolicy.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.project.imdang.member.service.domain.handler.coupon.policy; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.exception.MemberCouponDomainException; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component("ThirdCheerUp") -@RequiredArgsConstructor -public class ThirdCheerUpCouponPolicy implements CouponPolicy{ - private static final Integer REJECT_CRITERIA = 20; - private static final Integer ISSUE_QUANTITY = 5; - private final MemberCouponRepository memberCouponRepository; - - @Override - public Integer apply(Coupon coupon, Member member) { - return ISSUE_QUANTITY; - } - - @Override - public void validate(Coupon coupon, Member member) { - checkRejectCount(member); - checkReissue(coupon.getId(), member.getId()); - } - - private Boolean checkReissue(CouponId couponId, MemberId memberId) { - if(memberCouponRepository.existsByCouponIdAndMemberId(couponId, memberId)){ - throw new MemberCouponDomainException("Already issued Coupon!"); - } - return Boolean.TRUE; - } - - private Boolean checkRejectCount(Member member) { - if (member.getRejectedCount() < REJECT_CRITERIA) { - throw new MemberCouponDomainException("Reject Count does not meet criteria"); - } - return Boolean.TRUE; - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/DetailMemberCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/DetailMemberCommandHandler.java deleted file mode 100644 index 73d1df22..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/DetailMemberCommandHandler.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.project.imdang.member.service.domain.handler.member; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.dto.MemberResponse; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.handler.MemberHelper; -import com.project.imdang.member.service.domain.mapper.MemberDataMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -import java.util.UUID; - -@Component -@RequiredArgsConstructor -@Slf4j -public class DetailMemberCommandHandler { - - private final MemberDataMapper memberDataMapper; - private final MemberHelper memberHelper; - - @Transactional(readOnly = true) - public MemberResponse detailMember(UUID _memberId) { - MemberId memberId = new MemberId(_memberId); - Member member = memberHelper.get(memberId); - return memberDataMapper.memberToDetailMemberResponse(member); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/DetailMyPageCommandHandler.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/DetailMyPageCommandHandler.java deleted file mode 100644 index 98ba5cc1..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/member/DetailMyPageCommandHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.project.imdang.member.service.domain.handler.member; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.dto.DetailMyPageQuery; -import com.project.imdang.member.service.domain.dto.DetailMyPageResponse; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.handler.MemberHelper; -import com.project.imdang.member.service.domain.mapper.MemberDataMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - -@Component -@RequiredArgsConstructor -@Slf4j -public class DetailMyPageCommandHandler { - - private final MemberHelper memberHelper; - private final MemberDataMapper memberDataMapper; - - @Transactional(readOnly = true) - public DetailMyPageResponse detailMyPage(DetailMyPageQuery detailMyPageQuery) { - - MemberId memberId = new MemberId(detailMyPageQuery.getMemberId()); - Member member = memberHelper.get(memberId); - log.info("MyPage of Member[id : {}] is viewed.", member.getId().getValue()); - return memberDataMapper.memberToDetailMyPageResponse(member); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/mapper/MemberCouponDataMapper.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/mapper/MemberCouponDataMapper.java deleted file mode 100644 index b0c08ec8..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/mapper/MemberCouponDataMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.project.imdang.member.service.domain.mapper; - -import com.project.imdang.member.service.domain.dto.coupon.DetailMyCouponResponse; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -@Component -public class MemberCouponDataMapper { - - public DetailMyCouponResponse memberCouponsToDetailMyCouponResponse(List memberCoupons) { - if(memberCoupons.isEmpty()){ - return new DetailMyCouponResponse(0, null); - } - return new DetailMyCouponResponse(memberCoupons.size(), memberCoupons.get(0).getId().getValue()); - } - - public List issueMemberCouponCommandToMemberCoupons(Member member, Coupon coupon, Integer quantity) { - return IntStream.range(0, quantity) - .mapToObj(i -> MemberCoupon.builder() - .memberId(member.getId()) - .couponId(coupon.getId()) - .used(Boolean.FALSE) - .build()).collect(Collectors.toList()); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/mapper/MemberDataMapper.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/mapper/MemberDataMapper.java deleted file mode 100644 index 1158e113..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/mapper/MemberDataMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.project.imdang.member.service.domain.mapper; - -import com.project.imdang.member.service.domain.dto.DetailMyPageResponse; -import com.project.imdang.member.service.domain.dto.MemberResponse; -import com.project.imdang.member.service.domain.entity.Member; -import org.springframework.stereotype.Component; - -@Component -public class MemberDataMapper { - public DetailMyPageResponse memberToDetailMyPageResponse(Member member) { - return DetailMyPageResponse.builder() - .nickname(member.getNickname()) - .insightCount(member.getInsightCount()) - .requestCount(member.getExchangeCount()) - .build(); - } - - public MemberResponse memberToDetailMemberResponse(Member member){ - return MemberResponse.builder() - .memberId(member.getId().getValue()) - .nickname(member.getNickname()) - .birthDate(member.getBirthDate()) - .gender(member.getGender() != null ? member.getGender().name() : null) - .deviceToken(member.getDeviceToken()) - .exchangeCount(member.getExchangeCount()) - .rejectedCount(member.getRejectedCount()) - .insightCount(member.getInsightCount()) - .build(); - } -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestAcceptedCountMessageListener.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestAcceptedCountMessageListener.java deleted file mode 100644 index c9330d37..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestAcceptedCountMessageListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.project.imdang.member.service.domain.ports.input.listener; - - -import com.project.imdang.domain.message.ExchangeRequestAcceptedCountRequestMessage; - -public interface ExchangeRequestAcceptedCountMessageListener { - void handle(ExchangeRequestAcceptedCountRequestMessage exchangeRequestCountRequestMessage); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestCreatedRequestMessageListener.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestCreatedRequestMessageListener.java deleted file mode 100644 index 2ad9f2e3..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestCreatedRequestMessageListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.project.imdang.member.service.domain.ports.input.listener; - -import com.project.imdang.domain.message.ExchangeRequestCreatedRequestMessage; - -public interface ExchangeRequestCreatedRequestMessageListener { - - void handle(ExchangeRequestCreatedRequestMessage exchangeRequestCreatedRequestMessage); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestRejectedCountMessageListener.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestRejectedCountMessageListener.java deleted file mode 100644 index 2e438910..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestRejectedCountMessageListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.member.service.domain.ports.input.listener; - -import com.project.imdang.domain.message.ExchangeRequestRejectedCountRequestMessage; - -public interface ExchangeRequestRejectedCountMessageListener { - void handle(ExchangeRequestRejectedCountRequestMessage exchangeRequestRejectedCountRequestMessage); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestRejectedRequestMessageListener.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestRejectedRequestMessageListener.java deleted file mode 100644 index 6d578ad9..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/ExchangeRequestRejectedRequestMessageListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.project.imdang.member.service.domain.ports.input.listener; - -import com.project.imdang.domain.message.ExchangeRequestRejectedRequestMessage; - -public interface ExchangeRequestRejectedRequestMessageListener { - - void handle(ExchangeRequestRejectedRequestMessage exchangeRequestRejectedRequestMessage); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/InsightAccusedRequestMessageListener.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/InsightAccusedRequestMessageListener.java deleted file mode 100644 index e89e334a..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/InsightAccusedRequestMessageListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.member.service.domain.ports.input.listener; - -import com.project.imdang.domain.message.InsightAccusedRequestMessage; - -public interface InsightAccusedRequestMessageListener { - void handle(InsightAccusedRequestMessage insightAccusedRequestMessage); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/InsightCreatedCountMessageListener.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/InsightCreatedCountMessageListener.java deleted file mode 100644 index b0ce1ff2..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/listener/InsightCreatedCountMessageListener.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.project.imdang.member.service.domain.ports.input.listener; - - -import com.project.imdang.domain.message.InsightCreatedCountRequestMessage; - -public interface InsightCreatedCountMessageListener { - void handle(InsightCreatedCountRequestMessage insightCreatedCountRequestMessage); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/service/MemberApplicationService.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/service/MemberApplicationService.java deleted file mode 100644 index 1bf283ef..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/service/MemberApplicationService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.member.service.domain.ports.input.service; - -import com.project.imdang.member.service.domain.dto.*; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; - -import java.util.List; -import java.util.UUID; - -public interface MemberApplicationService { - LoginResponse login(OAuthLoginCommand loginCommand); - - DetailMyPageResponse detailMyPage(DetailMyPageQuery detailMyPageQuery); - - void join(UUID memberId, JoinCommand joinCommand); - - MemberResponse detailMember(UUID memberId); - List listMember(List memberIds); - - void logout(UUID memberId); - - void withdraw(UUID memberId, OAuthWithdrawCommand withdrawCommand); - - TokenResponse reissue(TokenReissueCommand tokenReissueCommand); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/service/MemberCouponApplicationService.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/service/MemberCouponApplicationService.java deleted file mode 100644 index f05241f3..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/input/service/MemberCouponApplicationService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.member.service.domain.ports.input.service; - -import com.project.imdang.member.service.domain.dto.coupon.IssueMemberCouponCommand; -import com.project.imdang.member.service.domain.dto.coupon.DetailMyCouponResponse; - -import java.util.UUID; - -public interface MemberCouponApplicationService { - - DetailMyCouponResponse detailMyCoupon(UUID memberId); - - // 쿠폰 발행 - void issueMemberCoupon(IssueMemberCouponCommand issueMemberCouponCommand); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/CouponRepository.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/CouponRepository.java deleted file mode 100644 index a698a0ae..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/CouponRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.member.service.domain.ports.output; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.member.service.domain.entity.Coupon; - -import java.util.Optional; - -public interface CouponRepository { - Optional findById(CouponId couponId); - - Optional findByName(String name); -} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/MemberCouponRepository.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/MemberCouponRepository.java deleted file mode 100644 index 99905dac..00000000 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/ports/output/MemberCouponRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.project.imdang.member.service.domain.ports.output; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.MemberCoupon; - -import java.util.List; -import java.util.Optional; - -public interface MemberCouponRepository { - List findAllByMemberIdAndUsed(MemberId memberId, Boolean used); - - MemberCoupon save(MemberCoupon memberCoupon); - List saveAll(List memberCoupons); - - Boolean existsByCouponIdAndMemberId(CouponId couponId, MemberId memberId); - - Optional findById(MemberCouponId memberCouponId); -} diff --git a/member-service/member-domain/member-application-service/src/main/resources/application.properties b/member-service/member-domain/member-application-service/src/main/resources/application.properties deleted file mode 100644 index 59d51671..00000000 --- a/member-service/member-domain/member-application-service/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=member-application-service diff --git a/member-service/member-domain/member-domain-core/build.gradle b/member-service/member-domain/member-domain-core/build.gradle index c049d055..1f712dad 100644 --- a/member-service/member-domain/member-domain-core/build.gradle +++ b/member-service/member-domain/member-domain-core/build.gradle @@ -1,6 +1,6 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':common:common-domain:common-domain-core') + + // TODO - api, 구현체 분리 + implementation 'org.springframework.boot:spring-boot-starter-logging' } diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/MemberDomainService.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/MemberDomainService.java new file mode 100644 index 00000000..ac67b015 --- /dev/null +++ b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/MemberDomainService.java @@ -0,0 +1,23 @@ +package com.project.imdang.member.domain; + + +import com.project.imdang.common.domain.valueobject.Gender; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.valueobject.AccusePenaltyPolicy; + +public interface MemberDomainService { + + Member join(Member member, String nickname, String birthDate, Gender gender, String deviceToken); + + Member createMember(String id, OAuthType oAuthType); + Member accuseMember(Member member, AccusePenaltyPolicy accusePenaltyPolicy); + + Member logout(Member member); + + Member withdraw(Member member); + + Member storeRefreshToken(Member member, String refreshToken); + + Member increaseInsightCount(Member member); +} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberDomainServiceImpl.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/MemberDomainServiceImpl.java similarity index 62% rename from member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberDomainServiceImpl.java rename to member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/MemberDomainServiceImpl.java index 9cd96afe..0e33d8ba 100644 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberDomainServiceImpl.java +++ b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/MemberDomainServiceImpl.java @@ -1,8 +1,9 @@ -package com.project.imdang.member.service.domain; +package com.project.imdang.member.domain; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.valueobject.Gender; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.Gender; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.valueobject.AccusePenaltyPolicy; public class MemberDomainServiceImpl implements MemberDomainService { @@ -17,6 +18,12 @@ public Member createMember(String oAuthId, OAuthType oAuthType) { return Member.createNewMember(oAuthId, oAuthType); } + @Override + public Member accuseMember(Member member, AccusePenaltyPolicy accusePenaltyPolicy) { + member.accuse(accusePenaltyPolicy); + return member; + } + @Override public Member logout(Member member) { member.logout(); @@ -36,17 +43,7 @@ public Member storeRefreshToken(Member member, String refreshToken) { } @Override - public Member updateRejectedCount(Member member) { - return member.increaseRejectedCount(); - } - - @Override - public Member updateInsightCreatedCount(Member member) { + public Member increaseInsightCount(Member member) { return member.increaseInsightCount(); } - - @Override - public Member updateExchangeRequestAcceptedCount(Member member) { - return member.increaseExchangeRequestCount(); - } } diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/Member.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/entity/Member.java similarity index 66% rename from member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/Member.java rename to member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/entity/Member.java index e1ebf7bf..4b65358b 100644 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/Member.java +++ b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/entity/Member.java @@ -1,13 +1,13 @@ -package com.project.imdang.member.service.domain.entity; - -import com.project.imdang.domain.entity.AggregateRoot; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.valueobject.AccusePenaltyPolicy; -import com.project.imdang.member.service.domain.valueobject.Gender; -import com.project.imdang.member.service.domain.valueobject.MemberStatus; -import com.project.imdang.member.service.domain.valueobject.OAuthType; -import com.project.imdang.member.service.domain.valueobject.Penalty; -import com.project.imdang.member.service.domain.valueobject.PenaltyPeriod; +package com.project.imdang.member.domain.entity; + +import com.project.imdang.common.domain.entity.AggregateRoot; +import com.project.imdang.common.domain.valueobject.Gender; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.MemberStatus; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.Penalty; +import com.project.imdang.common.domain.valueobject.PenaltyPeriod; +import com.project.imdang.member.domain.valueobject.AccusePenaltyPolicy; import lombok.Builder; import lombok.Getter; @@ -24,12 +24,7 @@ public class Member extends AggregateRoot { private Gender gender; private String deviceToken; - private int insightCount; - private int exchangeCount; - // TODO - CHECK : 데이터를 쌓아서 GROUP BY로? - private int rejectedCount; - private Boolean isCouponReceived; private String refreshToken; private Boolean isLogin; @@ -46,7 +41,6 @@ public static Member createNewMember(String oAuthId, OAuthType oAuthType) { .oAuthType(oAuthType) .isDeleted(Boolean.FALSE) .isLogin(Boolean.TRUE) - .isCouponReceived(Boolean.FALSE) .status(MemberStatus.ACTIVE) .build(); } @@ -59,13 +53,10 @@ public Member(MemberId id, String deviceToken, String oAuthId, OAuthType oAuthType, - int exchangeCount, int insightCount, - int rejectedCount, - String refreshToken, + String refreshToken, Boolean isLogin, Boolean isDeleted, - Boolean isCouponReceived, int accusedCount, MemberStatus status, PenaltyPeriod penaltyPeriod) { @@ -76,13 +67,10 @@ public Member(MemberId id, this.deviceToken = deviceToken; this.oAuthId = oAuthId; this.oAuthType = oAuthType; - this.exchangeCount = exchangeCount; this.insightCount = insightCount; - this.rejectedCount = rejectedCount; this.refreshToken = refreshToken; this.isLogin = isLogin; this.isDeleted = isDeleted; - this.isCouponReceived = isCouponReceived; this.accusedCount = accusedCount; this.status = status; this.penaltyPeriod = penaltyPeriod; @@ -110,7 +98,7 @@ public void storeRefreshToken(String refreshToken) { this.refreshToken = refreshToken; } - public void increaseAccusedCount(AccusePenaltyPolicy accusePenaltyPolicy) { + public void accuse(AccusePenaltyPolicy accusePenaltyPolicy) { this.accusedCount++; accusePenaltyPolicy.apply(this); } @@ -126,23 +114,8 @@ public void liftPenalty() { this.penaltyPeriod = null; } - public Member increaseRejectedCount() { - this.rejectedCount++; - return this; - } - public Member increaseInsightCount() { this.insightCount++; return this; } - - public Member increaseExchangeRequestCount() { - this.exchangeCount++; - return this; - } - - public Member updateCouponReceivedStatus() { - this.isCouponReceived = Boolean.TRUE; - return this; - } } diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberDomainException.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/exception/MemberDomainException.java similarity index 67% rename from member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberDomainException.java rename to member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/exception/MemberDomainException.java index 55bd9248..c73361f9 100644 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberDomainException.java +++ b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/exception/MemberDomainException.java @@ -1,6 +1,6 @@ -package com.project.imdang.member.service.domain.exception; +package com.project.imdang.member.domain.exception; -import com.project.imdang.domain.exception.DomainException; +import com.project.imdang.common.domain.exception.DomainException; public class MemberDomainException extends DomainException { diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberNotFoundException.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/exception/MemberNotFoundException.java similarity index 57% rename from member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberNotFoundException.java rename to member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/exception/MemberNotFoundException.java index 45d06d47..52fd84aa 100644 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberNotFoundException.java +++ b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/exception/MemberNotFoundException.java @@ -1,8 +1,9 @@ -package com.project.imdang.member.service.domain.exception; +package com.project.imdang.member.domain.exception; -import com.project.imdang.domain.valueobject.MemberId; +import com.project.imdang.common.domain.exception.DomainNotFoundException; +import com.project.imdang.common.domain.valueobject.MemberId; -public class MemberNotFoundException extends MemberDomainException { +public class MemberNotFoundException extends DomainNotFoundException { public MemberNotFoundException(MemberId memberId) { this(String.format("Could not find member[id: %s]!", memberId.getValue())); diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/valueobject/AccusePenaltyPolicy.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/valueobject/AccusePenaltyPolicy.java new file mode 100644 index 00000000..64a6d651 --- /dev/null +++ b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/domain/valueobject/AccusePenaltyPolicy.java @@ -0,0 +1,7 @@ +package com.project.imdang.member.domain.valueobject; + +import com.project.imdang.member.domain.entity.Member; + +public interface AccusePenaltyPolicy { + void apply(Member member); +} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberCouponDomainService.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberCouponDomainService.java deleted file mode 100644 index 63c6d08b..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberCouponDomainService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.member.service.domain; - -import com.project.imdang.member.service.domain.entity.MemberCoupon; - -public interface MemberCouponDomainService { - void issue(MemberCoupon memberCoupon); - MemberCoupon use(MemberCoupon memberCoupon); - void cancel(MemberCoupon memberCoupon); -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberCouponDomainServiceImpl.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberCouponDomainServiceImpl.java deleted file mode 100644 index 33c5a43b..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberCouponDomainServiceImpl.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.member.service.domain; - -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class MemberCouponDomainServiceImpl implements MemberCouponDomainService { - - @Override - public void issue(MemberCoupon memberCoupon) { - memberCoupon.initialize(); - } - - @Override - public MemberCoupon use(MemberCoupon memberCoupon) { - memberCoupon.use(); - log.info("MemberCoupon[id: {}] is used.", memberCoupon.getId().getValue()); - return memberCoupon; - } - - @Override - public void cancel(MemberCoupon memberCoupon) { - memberCoupon.cancel(); - log.info("MemberCoupon[id: {}] is cancelled.", memberCoupon.getId().getValue()); - } -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberDomainService.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberDomainService.java deleted file mode 100644 index 7989a037..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/MemberDomainService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.project.imdang.member.service.domain; - - -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.valueobject.Gender; -import com.project.imdang.member.service.domain.valueobject.OAuthType; - -public interface MemberDomainService { - - Member join(Member member, String nickname, String birthDate, Gender gender, String deviceToken); - - Member createMember(String id, OAuthType oAuthType); - - Member logout(Member member); - - Member withdraw(Member member); - - Member storeRefreshToken(Member member, String refreshToken); - - Member updateRejectedCount(Member member); - - Member updateInsightCreatedCount(Member member); - - Member updateExchangeRequestAcceptedCount(Member member); -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/Coupon.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/Coupon.java deleted file mode 100644 index 10bcccb5..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/Coupon.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.project.imdang.member.service.domain.entity; - - -import com.project.imdang.domain.entity.AggregateRoot; -import com.project.imdang.domain.valueobject.CouponId; -import lombok.Builder; -import lombok.Getter; - -@Getter -public class Coupon extends AggregateRoot { - private final String name; - private final String expirationDate; - - @Builder - public Coupon(CouponId id, String name, String expirationDate) { - setId(id); - this.name = name; - this.expirationDate = expirationDate; - } -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/MemberCoupon.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/MemberCoupon.java deleted file mode 100644 index fd03234d..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/entity/MemberCoupon.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.project.imdang.member.service.domain.entity; - - -import com.project.imdang.domain.entity.AggregateRoot; -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.exception.MemberCouponDomainException; -import lombok.Builder; -import lombok.Getter; - -import java.time.ZonedDateTime; - -@Getter -public class MemberCoupon extends AggregateRoot { - - private final CouponId couponId; - private final MemberId memberId; - private final ZonedDateTime expiredAt; - - private String remark; // reason - private ZonedDateTime createdAt; - - private boolean used; - private ZonedDateTime usedAt; - - @Builder - public MemberCoupon(MemberCouponId id, CouponId couponId, MemberId memberId, ZonedDateTime expiredAt, String remark, ZonedDateTime createdAt, boolean used, ZonedDateTime usedAt) { - setId(id); - this.couponId = couponId; - this.memberId = memberId; - this.expiredAt = expiredAt; - this.remark = remark; - this.createdAt = createdAt; - this.used = used; - this.usedAt = usedAt; - } - - public void initialize() { - this.createdAt = ZonedDateTime.now(); - } - - public MemberCoupon use() { - if (used) { - throw new MemberCouponDomainException("Already used memberCoupon!"); - } - this.used = true; - this.usedAt = ZonedDateTime.now(); - return this; - } - - public void cancel() { - if (!used) { - throw new MemberCouponDomainException("Not used memberCoupon!"); - } - this.used = false; - this.usedAt = null; - } -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/CouponDomainException.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/CouponDomainException.java deleted file mode 100644 index 498eaeb6..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/CouponDomainException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.member.service.domain.exception; - -import com.project.imdang.domain.exception.DomainException; - -public class CouponDomainException extends DomainException { - - public CouponDomainException(String message) { - super(message); - } - - public CouponDomainException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/CouponNotFoundException.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/CouponNotFoundException.java deleted file mode 100644 index 94b65e64..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/CouponNotFoundException.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.member.service.domain.exception; - -import com.project.imdang.domain.valueobject.CouponId; - -public class CouponNotFoundException extends CouponDomainException { - - public CouponNotFoundException(CouponId couponId) { - this(String.format("Could not find coupon[id: %s]!", couponId.getValue())); - } - - public CouponNotFoundException(String message) { - super(message); - } - - private CouponNotFoundException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberCouponDomainException.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberCouponDomainException.java deleted file mode 100644 index a6f5f57f..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberCouponDomainException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.member.service.domain.exception; - -import com.project.imdang.domain.exception.DomainException; - -public class MemberCouponDomainException extends DomainException { - - public MemberCouponDomainException(String message) { - super(message); - } - - public MemberCouponDomainException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberCouponNotFoundException.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberCouponNotFoundException.java deleted file mode 100644 index ff26c50d..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/exception/MemberCouponNotFoundException.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.member.service.domain.exception; - -import com.project.imdang.domain.valueobject.MemberCouponId; - -public class MemberCouponNotFoundException extends MemberCouponDomainException { - - public MemberCouponNotFoundException(MemberCouponId memberCouponId) { - this(String.format("Could not find memberCoupon[id: %s]!", memberCouponId.getValue())); - } - - private MemberCouponNotFoundException(String message) { - super(message); - } - - private MemberCouponNotFoundException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/AccusePenaltyPolicy.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/AccusePenaltyPolicy.java deleted file mode 100644 index 4f64311a..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/AccusePenaltyPolicy.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.project.imdang.member.service.domain.valueobject; - -import com.project.imdang.member.service.domain.entity.Member; -import org.springframework.stereotype.Component; - -import static com.project.imdang.member.service.domain.valueobject.Penalty.EXCHANGE_RESTRICTED_3DAYS; -import static com.project.imdang.member.service.domain.valueobject.Penalty.EXCHANGE_RESTRICTED_5DAYS; -import static com.project.imdang.member.service.domain.valueobject.Penalty.PERMANENT_BANNED; -import static com.project.imdang.member.service.domain.valueobject.Penalty.TEMPORARY_BANNED; - -@Component -public class AccusePenaltyPolicy { -// TODO - interface로 변경 - - public void apply(Member member) { - int accusedCount = member.getAccusedCount(); - Penalty penalty = getPenalty(accusedCount); - if (penalty != null) { - member.applyPenalty(penalty); - } - } - - private Penalty getPenalty(int accusedCount) { - Penalty penalty = null; - if (accusedCount == 5) { - penalty = EXCHANGE_RESTRICTED_3DAYS; - } else if (accusedCount == 15) { - penalty = EXCHANGE_RESTRICTED_5DAYS; - } else if (accusedCount == 30) { - penalty = TEMPORARY_BANNED; - } else if (accusedCount == 50) { - penalty = PERMANENT_BANNED; - } - return penalty; - } -} diff --git a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/OAuthType.java b/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/OAuthType.java deleted file mode 100644 index fa42c17e..00000000 --- a/member-service/member-domain/member-domain-core/src/main/java/com/project/imdang/member/service/domain/valueobject/OAuthType.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.project.imdang.member.service.domain.valueobject; - -public enum OAuthType { - KAKAO, APPLE, GOOGLE, MOCK -} diff --git a/member-service/member-domain/member-domain-core/src/main/resources/application.properties b/member-service/member-domain/member-domain-core/src/main/resources/application.properties deleted file mode 100644 index 168f387b..00000000 --- a/member-service/member-domain/member-domain-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=member-domain-core diff --git a/member-service/member-messaging/build.gradle b/member-service/member-messaging/build.gradle new file mode 100644 index 00000000..d91b4e42 --- /dev/null +++ b/member-service/member-messaging/build.gradle @@ -0,0 +1,6 @@ +dependencies { + implementation project(':member-service:member-domain:member-application-service') +// implementation project(':member-service:member-domain:member-domain-core') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') +} diff --git a/member-service/member-messaging/listener/build.gradle b/member-service/member-messaging/listener/build.gradle new file mode 100644 index 00000000..716d42e2 --- /dev/null +++ b/member-service/member-messaging/listener/build.gradle @@ -0,0 +1,9 @@ +dependencies { + implementation project(':member-service:member-domain:member-application-service') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation project(':insight-service:insight-messaging:message') + + implementation 'org.springframework.boot:spring-boot-starter' +} diff --git a/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightAccusedEventMessageListener.java b/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightAccusedEventMessageListener.java new file mode 100644 index 00000000..ee3e83a9 --- /dev/null +++ b/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightAccusedEventMessageListener.java @@ -0,0 +1,25 @@ +package com.project.imdang.member.messaging.listener; + +import com.project.imdang.common.domain.event.DomainEventMessageListener; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.messaging.message.InsightAccusedEventMessage; +import com.project.imdang.member.domain.ports.input.service.MemberApplicationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class InsightAccusedEventMessageListener extends DomainEventMessageListener { + + private final MemberApplicationService memberApplicationService; + + public InsightAccusedEventMessageListener(MemberApplicationService memberApplicationService) { + this.memberApplicationService = memberApplicationService; + } + + @Override + public void process(InsightAccusedEventMessage domainEventMessage) { + MemberId accusedMemberId = new MemberId(domainEventMessage.accusedMemberId()); + memberApplicationService.accuseMember(accusedMemberId); + } +} diff --git a/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightCreatedEventMessageListener.java b/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightCreatedEventMessageListener.java new file mode 100644 index 00000000..04081d29 --- /dev/null +++ b/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightCreatedEventMessageListener.java @@ -0,0 +1,25 @@ +package com.project.imdang.member.messaging.listener; + +import com.project.imdang.common.domain.event.DomainEventMessageListener; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.messaging.message.InsightCreatedEventMessage; +import com.project.imdang.member.domain.ports.input.service.MemberApplicationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class InsightCreatedEventMessageListener extends DomainEventMessageListener { + + private final MemberApplicationService memberApplicationService; + + public InsightCreatedEventMessageListener(MemberApplicationService memberApplicationService) { + this.memberApplicationService = memberApplicationService; + } + + @Override + public void process(InsightCreatedEventMessage domainEventMessage) { + MemberId memberId = new MemberId(domainEventMessage.memberId()); + memberApplicationService.increaseInsightCount(memberId); + } +} diff --git a/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightDeletedEventMessageListener.java b/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightDeletedEventMessageListener.java new file mode 100644 index 00000000..8d656293 --- /dev/null +++ b/member-service/member-messaging/listener/src/main/java/com/project/imdang/member/messaging/listener/InsightDeletedEventMessageListener.java @@ -0,0 +1,25 @@ +package com.project.imdang.member.messaging.listener; + +import com.project.imdang.common.domain.event.DomainEventMessageListener; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.messaging.message.InsightDeletedEventMessage; +import com.project.imdang.member.domain.ports.input.service.MemberApplicationService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class InsightDeletedEventMessageListener extends DomainEventMessageListener { + + private final MemberApplicationService memberApplicationService; + + public InsightDeletedEventMessageListener(MemberApplicationService memberApplicationService) { + this.memberApplicationService = memberApplicationService; + } + + @Override + public void process(InsightDeletedEventMessage domainEventMessage) { + MemberId memberId = new MemberId(domainEventMessage.memberId()); + memberApplicationService.decreaseInsightCount(memberId); + } +} diff --git a/member-service/member-messaging/listener/src/test/java/com/project/imdang/member/messaging/listener/ListenerApplicationTests.java b/member-service/member-messaging/listener/src/test/java/com/project/imdang/member/messaging/listener/ListenerApplicationTests.java new file mode 100644 index 00000000..a9614c3a --- /dev/null +++ b/member-service/member-messaging/listener/src/test/java/com/project/imdang/member/messaging/listener/ListenerApplicationTests.java @@ -0,0 +1,13 @@ +package com.project.imdang.member.messaging.listener; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ListenerApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/member-service/member-messaging/message/build.gradle b/member-service/member-messaging/message/build.gradle new file mode 100644 index 00000000..e69de29b diff --git a/member-service/member-messaging/publisher/build.gradle b/member-service/member-messaging/publisher/build.gradle new file mode 100644 index 00000000..e69de29b diff --git a/member-service/member-persistence/build.gradle b/member-service/member-persistence/build.gradle index c049d055..ab41c16e 100644 --- a/member-service/member-persistence/build.gradle +++ b/member-service/member-persistence/build.gradle @@ -1,6 +1,16 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':member-service:member-domain:member-application-service') + implementation project(':member-service:member-domain:member-domain-core') + implementation project(':common:common-domain:common-domain-core') + + implementation project(':infrastructure:feign') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.mysql:mysql-connector-j' + + implementation 'io.jsonwebtoken:jjwt:0.12.6' + implementation 'com.auth0:java-jwt:4.0.0' + implementation 'org.bouncycastle:bcpkix-jdk18on:1.72' } diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/MemberRepositoryImpl.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/adapter/MemberRepositoryImpl.java similarity index 79% rename from member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/MemberRepositoryImpl.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/adapter/MemberRepositoryImpl.java index d8584ae2..a5861d2f 100644 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/MemberRepositoryImpl.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/adapter/MemberRepositoryImpl.java @@ -1,13 +1,13 @@ -package com.project.imdang.member.service.persistence.adapter; +package com.project.imdang.member.persistence.adapter; -import com.project.imdang.domain.valueobject.BaseId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.persistence.entity.MemberEntity; -import com.project.imdang.member.service.persistence.mapper.MemberPersistenceMapper; -import com.project.imdang.member.service.persistence.repository.MemberJpaRepository; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.domain.ports.output.MemberRepository; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.BaseId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.persistence.entity.MemberEntity; +import com.project.imdang.member.persistence.mapper.MemberPersistenceMapper; +import com.project.imdang.member.persistence.repository.MemberJpaRepository; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.domain.ports.output.repository.MemberRepository; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/AppleApiClientHandler.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleApiClientHandler.java similarity index 88% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/AppleApiClientHandler.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleApiClientHandler.java index 3e7296fa..54454454 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/AppleApiClientHandler.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleApiClientHandler.java @@ -1,14 +1,13 @@ -package com.project.imdang.member.service.domain.handler.auth; +package com.project.imdang.member.persistence.client; import com.auth0.jwt.JWT; import com.auth0.jwt.interfaces.DecodedJWT; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.dto.oauth.apple.AppleLoginResponse; -import com.project.imdang.member.service.domain.dto.oauth.apple.AppleTokenResponse; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import com.project.imdang.member.domain.ports.output.client.OAuthApiClientHandler; +import com.project.imdang.common.domain.valueobject.OAuthType; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import lombok.RequiredArgsConstructor; @@ -91,7 +90,7 @@ public void withdraw(OAuthWithdrawCommand withdrawCommand) { HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - MultiValueMap body = withdrawCommand.makeBody(); + MultiValueMap body = withdrawCommand.getBody(); body.add("client_id", clientId); body.add("client_secret", generateClientSecret()); body.add("token_type_hint", "refresh_token"); diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleLoginResponse.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleLoginResponse.java similarity index 76% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleLoginResponse.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleLoginResponse.java index e384d211..effb4f4e 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleLoginResponse.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleLoginResponse.java @@ -1,8 +1,8 @@ -package com.project.imdang.member.service.domain.dto.oauth.apple; +package com.project.imdang.member.persistence.client; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleTokenResponse.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleTokenResponse.java similarity index 90% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleTokenResponse.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleTokenResponse.java index 756c6f3b..a669f4c5 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/apple/AppleTokenResponse.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/AppleTokenResponse.java @@ -1,4 +1,4 @@ -package com.project.imdang.member.service.domain.dto.oauth.apple; +package com.project.imdang.member.persistence.client; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AccessLevel; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/GoogleApiClientHandler.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleApiClientHandler.java similarity index 79% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/GoogleApiClientHandler.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleApiClientHandler.java index 3658a3dc..125481ab 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/GoogleApiClientHandler.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleApiClientHandler.java @@ -1,10 +1,10 @@ -package com.project.imdang.member.service.domain.handler.auth; +package com.project.imdang.member.persistence.client; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.dto.oauth.google.GoogleLoginResponse; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import com.project.imdang.member.domain.ports.output.client.OAuthApiClientHandler; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; @@ -48,7 +48,7 @@ public OAuthLoginResponse getOAuthInfo(OAuthLoginCommand loginCommand) { @Override public void withdraw(OAuthWithdrawCommand withdrawCommand) { - MultiValueMap body = withdrawCommand.makeBody(); + MultiValueMap body = withdrawCommand.getBody(); String accessToken = body.getFirst("token"); UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(withdrawUrl) diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleLoginResponse.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleLoginResponse.java similarity index 83% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleLoginResponse.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleLoginResponse.java index 4fccca56..2f254867 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleLoginResponse.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleLoginResponse.java @@ -1,9 +1,9 @@ -package com.project.imdang.member.service.domain.dto.oauth.google; +package com.project.imdang.member.persistence.client; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleTokenResponse.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleTokenResponse.java similarity index 91% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleTokenResponse.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleTokenResponse.java index 8c69f4c7..8bdf4121 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/google/GoogleTokenResponse.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/GoogleTokenResponse.java @@ -1,4 +1,4 @@ -package com.project.imdang.member.service.domain.dto.oauth.google; +package com.project.imdang.member.persistence.client; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AccessLevel; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/KaKaoApiClientHandler.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KaKaoApiClientHandler.java similarity index 77% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/KaKaoApiClientHandler.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KaKaoApiClientHandler.java index 5829aa81..1b84b8e5 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/KaKaoApiClientHandler.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KaKaoApiClientHandler.java @@ -1,11 +1,10 @@ -package com.project.imdang.member.service.domain.handler.auth; - -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.dto.oauth.kakao.KakaoLoginResponse; -import com.project.imdang.member.service.domain.dto.oauth.kakao.KakaoWithdrawResponse; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +package com.project.imdang.member.persistence.client; + +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import com.project.imdang.member.domain.ports.output.client.OAuthApiClientHandler; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; @@ -50,7 +49,7 @@ public OAuthLoginResponse getOAuthInfo(OAuthLoginCommand loginCommand) { @Override public void withdraw(OAuthWithdrawCommand withdrawCommand) { - MultiValueMap body = withdrawCommand.makeBody(); + MultiValueMap body = withdrawCommand.getBody(); String accessToken = body.getFirst("token"); HttpHeaders httpHeaders = new HttpHeaders(); diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoLoginResponse.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoLoginResponse.java similarity index 85% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoLoginResponse.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoLoginResponse.java index 675a6cf5..890024f6 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoLoginResponse.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoLoginResponse.java @@ -1,9 +1,9 @@ -package com.project.imdang.member.service.domain.dto.oauth.kakao; +package com.project.imdang.member.persistence.client; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoTokenResponse.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoTokenResponse.java similarity index 90% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoTokenResponse.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoTokenResponse.java index deea67c4..91ce4c99 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoTokenResponse.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoTokenResponse.java @@ -1,4 +1,4 @@ -package com.project.imdang.member.service.domain.dto.oauth.kakao; +package com.project.imdang.member.persistence.client; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AccessLevel; diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoWithdrawResponse.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoWithdrawResponse.java similarity index 69% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoWithdrawResponse.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoWithdrawResponse.java index 00b3f117..e0aa0a7b 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/dto/oauth/kakao/KakaoWithdrawResponse.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/KakaoWithdrawResponse.java @@ -1,7 +1,7 @@ -package com.project.imdang.member.service.domain.dto.oauth.kakao; +package com.project.imdang.member.persistence.client; import com.fasterxml.jackson.annotation.JsonProperty; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.*; @AllArgsConstructor diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/MockApiClientHandler.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/MockApiClientHandler.java similarity index 74% rename from member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/MockApiClientHandler.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/MockApiClientHandler.java index 7fc8fe6d..49a3ce6d 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/service/domain/handler/auth/MockApiClientHandler.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/client/MockApiClientHandler.java @@ -1,10 +1,11 @@ -package com.project.imdang.member.service.domain.handler.auth; +package com.project.imdang.member.persistence.client; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginCommand; -import com.project.imdang.member.service.domain.dto.oauth.OAuthLoginResponse; -import com.project.imdang.member.service.domain.dto.oauth.OAuthWithdrawCommand; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.domain.dto.auth.OAuthLoginCommand; +import com.project.imdang.member.domain.dto.auth.OAuthLoginResponse; +import com.project.imdang.member.domain.dto.member.OAuthWithdrawCommand; +import com.project.imdang.member.domain.ports.output.client.OAuthApiClientHandler; +import com.project.imdang.common.domain.valueobject.OAuthType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.util.MultiValueMap; diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/configuration/RestTemplateConfiguration.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/configuration/RestTemplateConfiguration.java new file mode 100644 index 00000000..1de846dc --- /dev/null +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/configuration/RestTemplateConfiguration.java @@ -0,0 +1,14 @@ +package com.project.imdang.member.persistence.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfiguration { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/MemberEntity.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/entity/MemberEntity.java similarity index 75% rename from member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/MemberEntity.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/entity/MemberEntity.java index bbc389ce..27bfd2f4 100644 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/MemberEntity.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/entity/MemberEntity.java @@ -1,9 +1,9 @@ -package com.project.imdang.member.service.persistence.entity; +package com.project.imdang.member.persistence.entity; -import com.project.imdang.member.service.domain.valueobject.Gender; -import com.project.imdang.member.service.domain.valueobject.MemberStatus; -import com.project.imdang.member.service.domain.valueobject.OAuthType; -import com.project.imdang.member.service.domain.valueobject.PenaltyPeriod; +import com.project.imdang.common.domain.valueobject.Gender; +import com.project.imdang.common.domain.valueobject.MemberStatus; +import com.project.imdang.common.domain.valueobject.OAuthType; +import com.project.imdang.common.domain.valueobject.PenaltyPeriod; import jakarta.persistence.AttributeOverride; import jakarta.persistence.AttributeOverrides; import jakarta.persistence.Column; @@ -13,7 +13,6 @@ import jakarta.persistence.Enumerated; import jakarta.persistence.Id; import jakarta.persistence.Table; -import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -37,8 +36,6 @@ public class MemberEntity { @Column(columnDefinition = "CHAR(36)") @JdbcTypeCode(SqlTypes.CHAR) private UUID id; - - @NotNull private String authId; @Enumerated(EnumType.STRING) @@ -50,13 +47,10 @@ public class MemberEntity { private String deviceToken; private int insightCount; - private int exchangeCount; - private int rejectedCount; private String refreshToken; private Boolean isLogin; private Boolean isDeleted; - private Boolean isCouponReceived; private int accusedCount; @Enumerated(EnumType.STRING) diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/MemberPersistenceMapper.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/mapper/MemberPersistenceMapper.java similarity index 74% rename from member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/MemberPersistenceMapper.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/mapper/MemberPersistenceMapper.java index 19c1d6f1..ffb7111d 100644 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/MemberPersistenceMapper.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/mapper/MemberPersistenceMapper.java @@ -1,9 +1,9 @@ -package com.project.imdang.member.service.persistence.mapper; +package com.project.imdang.member.persistence.mapper; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.Member; -import com.project.imdang.member.service.persistence.entity.MemberEntity; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.entity.Member; +import com.project.imdang.member.persistence.entity.MemberEntity; import org.springframework.stereotype.Component; @Component @@ -18,12 +18,9 @@ public MemberEntity memberToMemberEntity(Member member) { .gender(member.getGender()) .deviceToken(member.getDeviceToken()) .insightCount(member.getInsightCount()) - .exchangeCount(member.getExchangeCount()) - .rejectedCount(member.getRejectedCount()) .refreshToken(member.getRefreshToken()) .isLogin(member.getIsLogin()) .isDeleted(member.getIsDeleted()) - .isCouponReceived(member.getIsCouponReceived()) .accusedCount(member.getAccusedCount()) .status(member.getStatus()) .penaltyPeriod(member.getPenaltyPeriod()) @@ -40,12 +37,9 @@ public Member memberEntityToMember(MemberEntity memberEntity) { .gender(memberEntity.getGender()) .deviceToken(memberEntity.getDeviceToken()) .insightCount(memberEntity.getInsightCount()) - .exchangeCount(memberEntity.getExchangeCount()) - .rejectedCount(memberEntity.getRejectedCount()) .refreshToken(memberEntity.getRefreshToken()) .isLogin(memberEntity.getIsLogin()) .isDeleted(memberEntity.getIsDeleted()) - .isCouponReceived(memberEntity.getIsCouponReceived()) .accusedCount(memberEntity.getAccusedCount()) .status(memberEntity.getStatus()) .penaltyPeriod(memberEntity.getPenaltyPeriod()) diff --git a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/jwt/JwtTokenProvider.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/provider/JwtTokenProvider.java similarity index 83% rename from common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/jwt/JwtTokenProvider.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/provider/JwtTokenProvider.java index f777c5ed..b1189321 100644 --- a/common/common-domain/common-application-service/src/main/java/com/project/imdang/domain/jwt/JwtTokenProvider.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/provider/JwtTokenProvider.java @@ -1,5 +1,6 @@ -package com.project.imdang.domain.jwt; +package com.project.imdang.member.persistence.provider; +import com.project.imdang.member.domain.ports.output.provider.TokenProvider; import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.Jws; @@ -17,12 +18,11 @@ import java.security.Key; import java.util.Date; -// TODO - 클래스 이동 @Slf4j @Component -public final class JwtTokenProvider implements InitializingBean { - private Key key; +public final class JwtTokenProvider implements TokenProvider, InitializingBean { + private Key key; @Value("${jwt.secret-key}") private String secretKey; @@ -33,9 +33,7 @@ public void afterPropertiesSet() { log.info("생성 후 초기화 완료"); } - /** - * AccessToken 생성 함수 - */ + @Override public String generateAccessToken(String subject, Date expiredAt) { return Jwts.builder() .subject(subject) @@ -44,9 +42,7 @@ public String generateAccessToken(String subject, Date expiredAt) { .compact(); } - /** - * RefreshToken 생성 함수 - */ + @Override public String generateRefreshToken(Date expiredAt) { return Jwts.builder() .subject("RefreshToken") @@ -55,15 +51,12 @@ public String generateRefreshToken(Date expiredAt) { .compact(); } - /** - * 토큰 유효성 검증 - */ + @Override public boolean verifyToken(String token) { try { Jws claims = Jwts.parser() .setSigningKey(key).build() .parseClaimsJws(token); - return claims.getBody().getExpiration().after(new Date()); } catch (SecurityException | MalformedJwtException e) { log.warn("잘못된 JWT 서명입니다."); @@ -83,9 +76,6 @@ public boolean verifyToken(String token) { } } - /** - * 사용자 정보 추출 -> memberId or SocialId ? - */ public String extractSubject(String accessToken) { Claims claims = parseClaims(accessToken); return claims.getSubject(); @@ -98,15 +88,4 @@ private Claims parseClaims(String accessToken) { .parseClaimsJws(accessToken) .getBody(); } - - - //TODO : 토큰 검증 및 리프레쉬 토큰 재발급 및 리프레쉬 토큰 저장 - /** - * 토큰 재발급 - */ - - /** - * RefreshToken 저장 - */ - } diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/MemberJpaRepository.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/repository/MemberJpaRepository.java similarity index 68% rename from member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/MemberJpaRepository.java rename to member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/repository/MemberJpaRepository.java index a30c7783..12b21c07 100644 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/MemberJpaRepository.java +++ b/member-service/member-persistence/src/main/java/com/project/imdang/member/persistence/repository/MemberJpaRepository.java @@ -1,7 +1,7 @@ -package com.project.imdang.member.service.persistence.repository; +package com.project.imdang.member.persistence.repository; -import com.project.imdang.member.service.persistence.entity.MemberEntity; -import com.project.imdang.member.service.domain.valueobject.OAuthType; +import com.project.imdang.member.persistence.entity.MemberEntity; +import com.project.imdang.common.domain.valueobject.OAuthType; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/CouponRepositoryImpl.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/CouponRepositoryImpl.java deleted file mode 100644 index 48d49911..00000000 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/CouponRepositoryImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.project.imdang.member.service.persistence.adapter; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.member.service.persistence.mapper.CouponPersistenceMapper; -import com.project.imdang.member.service.persistence.repository.CouponJpaRepository; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.domain.ports.output.CouponRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -@RequiredArgsConstructor -public class CouponRepositoryImpl implements CouponRepository { - private final CouponJpaRepository couponJpaRepository; - private final CouponPersistenceMapper couponPersistenceMapper; - - @Override - public Optional findById(CouponId couponId) { - return couponJpaRepository.findById(couponId.getValue()) - .map(couponPersistenceMapper::couponEntityToCoupon); - } - - @Override - public Optional findByName(String name) { - return couponJpaRepository.findByName(name) - .map(couponPersistenceMapper::couponEntityToCoupon); - } -} diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/MemberCouponRepositoryImpl.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/MemberCouponRepositoryImpl.java deleted file mode 100644 index 2b54395f..00000000 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/adapter/MemberCouponRepositoryImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.project.imdang.member.service.persistence.adapter; - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import com.project.imdang.member.service.domain.ports.output.MemberCouponRepository; -import com.project.imdang.member.service.persistence.entity.MemberCouponEntity; -import com.project.imdang.member.service.persistence.mapper.MemberCouponPersistenceMapper; -import com.project.imdang.member.service.persistence.repository.MemberCouponJpaRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -@Repository -@Transactional(readOnly = true) -@RequiredArgsConstructor -public class MemberCouponRepositoryImpl implements MemberCouponRepository { - - private final MemberCouponJpaRepository memberCouponJpaRepository; - private final MemberCouponPersistenceMapper memberCouponPersistenceMapper; - - @Override - public List findAllByMemberIdAndUsed(MemberId memberId, Boolean used) { - List memberCouponEntity = memberCouponJpaRepository.findAllByMemberIdAndUsed(memberId.getValue(), used); - return memberCouponEntity.stream() - .map(memberCouponPersistenceMapper::memberCouponEntityToMemberCoupon).collect(Collectors.toList()); - } - - @Transactional - @Override - public MemberCoupon save(MemberCoupon memberCoupon) { - MemberCouponEntity memberCouponEntity = memberCouponPersistenceMapper.memberCouponToMemberCouponEntity(memberCoupon); - MemberCouponEntity saved = memberCouponJpaRepository.save(memberCouponEntity); - return memberCouponPersistenceMapper.memberCouponEntityToMemberCoupon(saved); - } - - @Transactional - @Override - public List saveAll(List memberCoupons) { - List memberCouponEntities = memberCouponJpaRepository.saveAll(memberCoupons.stream() - .map(memberCouponPersistenceMapper::memberCouponToMemberCouponEntity).collect(Collectors.toList())); - return memberCouponEntities.stream() - .map(memberCouponPersistenceMapper::memberCouponEntityToMemberCoupon).collect(Collectors.toList()); - } - - @Override - public Boolean existsByCouponIdAndMemberId(CouponId couponId, MemberId memberId) { - return memberCouponJpaRepository.existsByCouponIdAndMemberId(couponId.getValue(), memberId.getValue()); - } - - @Override - public Optional findById(MemberCouponId memberCouponId) { - return memberCouponJpaRepository.findById(memberCouponId.getValue()) - .map(memberCouponPersistenceMapper::memberCouponEntityToMemberCoupon); - } -} diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/CouponEntity.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/CouponEntity.java deleted file mode 100644 index 4e0127b7..00000000 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/CouponEntity.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.project.imdang.member.service.persistence.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import jakarta.validation.constraints.NotBlank; -import lombok.*; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter -@Table(name = "coupon") -@Entity -public class CouponEntity { - - @Id - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID id; - @NotBlank - private String name; - private String expirationDate; -} diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/MemberCouponEntity.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/MemberCouponEntity.java deleted file mode 100644 index b40180b2..00000000 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/entity/MemberCouponEntity.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.project.imdang.member.service.persistence.entity; - - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.JdbcTypeCode; -import org.hibernate.type.SqlTypes; - -import java.time.ZonedDateTime; -import java.util.UUID; - -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Getter -@Table(name = "member_coupon") -@Entity -public class MemberCouponEntity { - - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID couponId; - - @Column(columnDefinition = "CHAR(36)") - @JdbcTypeCode(SqlTypes.CHAR) - private UUID memberId; - - private ZonedDateTime expiredAt; - - private String remark; // reason - @NotNull - private ZonedDateTime createdAt; - - private boolean used; - private ZonedDateTime usedAt; -} diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/CouponPersistenceMapper.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/CouponPersistenceMapper.java deleted file mode 100644 index 5a79a5ce..00000000 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/CouponPersistenceMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.project.imdang.member.service.persistence.mapper; - - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.member.service.domain.entity.Coupon; -import com.project.imdang.member.service.persistence.entity.CouponEntity; -import org.springframework.stereotype.Component; - -@Component -public class CouponPersistenceMapper { - - public CouponEntity CouponToCouponEntity(Coupon coupon) { - return CouponEntity.builder() - .id(coupon.getId().getValue()) - .name(coupon.getName()) - .expirationDate(coupon.getExpirationDate()) - .build(); - } - - public Coupon couponEntityToCoupon(CouponEntity couponEntity) { - return Coupon.builder() - .id(new CouponId(couponEntity.getId())) - .name(couponEntity.getName()) - .expirationDate(couponEntity.getExpirationDate()) - .build(); - } -} diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/MemberCouponPersistenceMapper.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/MemberCouponPersistenceMapper.java deleted file mode 100644 index a5957dcb..00000000 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/mapper/MemberCouponPersistenceMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.project.imdang.member.service.persistence.mapper; - - -import com.project.imdang.domain.valueobject.CouponId; -import com.project.imdang.domain.valueobject.MemberCouponId; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.member.service.domain.entity.MemberCoupon; -import com.project.imdang.member.service.persistence.entity.MemberCouponEntity; -import org.springframework.stereotype.Component; - -@Component -public class MemberCouponPersistenceMapper { - public MemberCouponEntity memberCouponToMemberCouponEntity(MemberCoupon memberCoupon) { - return MemberCouponEntity.builder() - .id(memberCoupon.getId() != null ? memberCoupon.getId().getValue() : null) - .couponId(memberCoupon.getCouponId().getValue()) - .memberId(memberCoupon.getMemberId().getValue()) - .expiredAt(memberCoupon.getExpiredAt()) - .remark(memberCoupon.getRemark()) - .createdAt(memberCoupon.getCreatedAt()) - .used(memberCoupon.isUsed()) - .usedAt(memberCoupon.getUsedAt()) - .build(); - } - - public MemberCoupon memberCouponEntityToMemberCoupon(MemberCouponEntity memberCouponEntity) { - return MemberCoupon.builder() - .id(new MemberCouponId(memberCouponEntity.getId())) - .couponId(new CouponId(memberCouponEntity.getCouponId())) - .memberId(new MemberId(memberCouponEntity.getMemberId())) - .expiredAt(memberCouponEntity.getExpiredAt()) - .remark(memberCouponEntity.getRemark()) - .createdAt(memberCouponEntity.getCreatedAt()) - .used(memberCouponEntity.isUsed()) - .usedAt(memberCouponEntity.getUsedAt()) - .build(); - } -} diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/CouponJpaRepository.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/CouponJpaRepository.java deleted file mode 100644 index 81b367eb..00000000 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/CouponJpaRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.member.service.persistence.repository; - -import com.project.imdang.member.service.persistence.entity.CouponEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.Optional; -import java.util.UUID; - -public interface CouponJpaRepository extends JpaRepository { -// Optional findById(UUID id); - Optional findByName(String name); -} diff --git a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/MemberCouponJpaRepository.java b/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/MemberCouponJpaRepository.java deleted file mode 100644 index e0358b62..00000000 --- a/member-service/member-persistence/src/main/java/com/project/imdang/member/service/persistence/repository/MemberCouponJpaRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.imdang.member.service.persistence.repository; - -import com.project.imdang.member.service.persistence.entity.MemberCouponEntity; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; -import java.util.Optional; -import java.util.UUID; - -public interface MemberCouponJpaRepository extends JpaRepository { - List findAllByMemberIdAndUsed(UUID memberId, Boolean used); - Boolean existsByCouponIdAndMemberId(UUID couponId, UUID memberId); -} diff --git a/member-service/member-service-client/build.gradle b/member-service/member-service-client/build.gradle new file mode 100644 index 00000000..e69de29b diff --git a/member-service/member-service-client/member-service-client-api-impl/build.gradle b/member-service/member-service-client/member-service-client-api-impl/build.gradle new file mode 100644 index 00000000..7afc507c --- /dev/null +++ b/member-service/member-service-client/member-service-client-api-impl/build.gradle @@ -0,0 +1,7 @@ +dependencies { + implementation project(":member-service:member-service-client:member-service-client-api") + implementation project(':common:common-domain:common-domain-core') + implementation project(':infrastructure:feign') + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.1.3' +// implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' +} diff --git a/infrastructure/feign/src/main/java/com/project/imdang/feign/MemberFeignClient.java b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberFeignClient.java similarity index 55% rename from infrastructure/feign/src/main/java/com/project/imdang/feign/MemberFeignClient.java rename to member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberFeignClient.java index 5ecff23e..518b97cd 100644 --- a/infrastructure/feign/src/main/java/com/project/imdang/feign/MemberFeignClient.java +++ b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberFeignClient.java @@ -1,7 +1,7 @@ -package com.project.imdang.feign; +package com.project.imdang.member.domain.client; -import com.project.imdang.feign.configuration.FeignConfiguration; +import com.project.imdang.member.domain.client.MemberData; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -10,11 +10,12 @@ import java.util.List; import java.util.UUID; -@FeignClient(name = "memberFeignClient", url = "http://localhost:8080/members", configuration = FeignConfiguration.class) +@FeignClient(name = "memberFeignClient", url = "http://localhost:8080/members") public interface MemberFeignClient { @GetMapping("/info") - ResponseEntity getMemberInfo(@RequestParam UUID memberId); + ResponseEntity getMemberData(@RequestParam UUID memberId); + @GetMapping - ResponseEntity> listMemberInfo(@RequestParam List memberIds); + ResponseEntity> listMemberData(@RequestParam List memberIds); } diff --git a/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java new file mode 100644 index 00000000..70f0391f --- /dev/null +++ b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java @@ -0,0 +1,32 @@ +package com.project.imdang.member.domain.client; + +import com.project.imdang.common.domain.valueobject.BaseId; +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@RequiredArgsConstructor +@Component +public class MemberInfoResolverImpl implements MemberDataResolver { + + private final MemberFeignClient memberFeignClient; + + @Override + public Optional resolve(MemberId memberId) { + UUID id = memberId.getValue(); + MemberData memberData = memberFeignClient.getMemberData(id).getBody(); + return Optional.ofNullable(memberData); + } + + @Override + public List resolve(List memberIds) { + List ids = memberIds.stream() + .map(BaseId::getValue) + .toList(); + return memberFeignClient.listMemberData(ids).getBody(); + } +} diff --git a/member-service/member-service-client/member-service-client-api/build.gradle b/member-service/member-service-client/member-service-client-api/build.gradle new file mode 100644 index 00000000..107c7086 --- /dev/null +++ b/member-service/member-service-client/member-service-client-api/build.gradle @@ -0,0 +1,3 @@ +dependencies { + implementation project(':common:common-domain:common-domain-core') +} diff --git a/infrastructure/feign/src/main/java/com/project/imdang/feign/MemberInfoResponse.java b/member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/MemberData.java similarity index 76% rename from infrastructure/feign/src/main/java/com/project/imdang/feign/MemberInfoResponse.java rename to member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/MemberData.java index ff1be5fb..499e2a5b 100644 --- a/infrastructure/feign/src/main/java/com/project/imdang/feign/MemberInfoResponse.java +++ b/member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/MemberData.java @@ -1,24 +1,23 @@ -package com.project.imdang.feign; +package com.project.imdang.member.domain.client; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import java.util.UUID; @Getter +@Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class MemberInfoResponse { +public class MemberData { private UUID memberId; private String nickname; private String birthDate; private String gender; private String deviceToken; - private int accusedCount; - private int exchangeCount; private int insightCount; - private int rejectedCount; } diff --git a/member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/MemberDataResolver.java b/member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/MemberDataResolver.java new file mode 100644 index 00000000..106b6db1 --- /dev/null +++ b/member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/MemberDataResolver.java @@ -0,0 +1,12 @@ +package com.project.imdang.member.domain.client; + +import com.project.imdang.common.domain.valueobject.MemberId; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface MemberDataResolver { + Optional resolve(MemberId memberId); + List resolve(List memberIds); +} diff --git a/member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/exception/MemberNotFoundException.java b/member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/exception/MemberNotFoundException.java new file mode 100644 index 00000000..00302c2a --- /dev/null +++ b/member-service/member-service-client/member-service-client-api/src/main/java/com/project/imdang/member/domain/client/exception/MemberNotFoundException.java @@ -0,0 +1,19 @@ +package com.project.imdang.member.domain.client.exception; + +import com.project.imdang.common.domain.exception.DomainNotFoundException; +import com.project.imdang.common.domain.valueobject.MemberId; + +public class MemberNotFoundException extends DomainNotFoundException { + + public MemberNotFoundException(MemberId memberId) { + this(String.format("Could not find member[id: %s]!", memberId.getValue())); + } + + private MemberNotFoundException(String message) { + super(message); + } + + private MemberNotFoundException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/member-service/member-service-client/member-service-client-api/src/test/java/com/project/imdang/MemberServiceClientApiApplicationTests.java b/member-service/member-service-client/member-service-client-api/src/test/java/com/project/imdang/MemberServiceClientApiApplicationTests.java new file mode 100644 index 00000000..6fa2a7fc --- /dev/null +++ b/member-service/member-service-client/member-service-client-api/src/test/java/com/project/imdang/MemberServiceClientApiApplicationTests.java @@ -0,0 +1,13 @@ +package com.project.imdang; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MemberServiceClientApiApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/setting-service/setting-application/build.gradle b/setting-service/setting-application/build.gradle index c049d055..ce54655c 100644 --- a/setting-service/setting-application/build.gradle +++ b/setting-service/setting-application/build.gradle @@ -1,6 +1,13 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':setting-service:setting-domain:setting-application-service') + implementation project(':common:common-application') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.data:spring-data-commons' + implementation 'org.springframework.boot:spring-boot-starter-security' + + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/delete/DeleteInsightResponse.java b/setting-service/setting-application/src/main/java/com/project/imdang/setting/application/dto/AgreeTermsRequest.java similarity index 59% rename from insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/delete/DeleteInsightResponse.java rename to setting-service/setting-application/src/main/java/com/project/imdang/setting/application/dto/AgreeTermsRequest.java index b74f9d75..4e38b7e3 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/service/domain/dto/insight/delete/DeleteInsightResponse.java +++ b/setting-service/setting-application/src/main/java/com/project/imdang/setting/application/dto/AgreeTermsRequest.java @@ -1,4 +1,4 @@ -package com.project.imdang.insight.service.domain.dto.insight.delete; +package com.project.imdang.setting.application.dto; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -6,12 +6,12 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.UUID; +import java.util.Set; @Builder @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DeleteInsightResponse { - private UUID insightId; +public class AgreeTermsRequest { + private Set termsIds; } diff --git a/setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/rest/NotificationController.java b/setting-service/setting-application/src/main/java/com/project/imdang/setting/application/rest/NotificationController.java similarity index 62% rename from setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/rest/NotificationController.java rename to setting-service/setting-application/src/main/java/com/project/imdang/setting/application/rest/NotificationController.java index 52179084..84b016ea 100644 --- a/setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/rest/NotificationController.java +++ b/setting-service/setting-application/src/main/java/com/project/imdang/setting/application/rest/NotificationController.java @@ -1,8 +1,9 @@ -package com.project.imdang.setting.service.application.rest; +package com.project.imdang.setting.application.rest; -import com.project.imdang.setting.service.domain.dto.ListNotificationQuery; -import com.project.imdang.setting.service.domain.dto.NotificationResponse; -import com.project.imdang.setting.service.domain.ports.input.service.NotificationApplicationService; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.dto.ListNotificationQuery; +import com.project.imdang.setting.domain.dto.NotificationResult; +import com.project.imdang.setting.domain.ports.input.service.NotificationApplicationService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; @@ -38,25 +39,26 @@ public ResponseEntity check(@AuthenticationPrincipal UUID memberId) { @Operation(description = "알림 리스트 조회 API") @ApiResponse(responseCode = "200", description = "알림 리스트 조회 성공") @GetMapping - public ResponseEntity> list(@AuthenticationPrincipal UUID memberId, - @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, - @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, - @RequestParam(name = "direction", defaultValue = "DESC") String direction, - @RequestParam(name = "properties", defaultValue = "created_at") String[] properties) { + public ResponseEntity> list(@AuthenticationPrincipal UUID memberId, + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, + @RequestParam(name = "direction", defaultValue = "DESC") String direction, + @RequestParam(name = "properties", defaultValue = "created_at") String[] properties) { + // TODO - CHECK notificationApplicationService.updateNotificationAsChecked(memberId); log.info("New notifications of Member[id: {}] is checked.", memberId); ListNotificationQuery listNotificationQuery = ListNotificationQuery.builder() - .receiverId(memberId) + .receiverId(new MemberId(memberId)) .isChecked(true) .pageNumber(pageNumber) .pageSize(pageSize) .direction(direction) .properties(properties) .build(); - Page paged = notificationApplicationService.listNotification(listNotificationQuery); + Page notifications = notificationApplicationService.listNotification(listNotificationQuery); log.info("Notifications of Member[id: {}] are retrieved.", memberId); - return ResponseEntity.ok(paged); + return ResponseEntity.ok(notifications); } } diff --git a/setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/rest/TermsController.java b/setting-service/setting-application/src/main/java/com/project/imdang/setting/application/rest/TermsController.java similarity index 58% rename from setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/rest/TermsController.java rename to setting-service/setting-application/src/main/java/com/project/imdang/setting/application/rest/TermsController.java index 9048ed30..e585f16d 100644 --- a/setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/rest/TermsController.java +++ b/setting-service/setting-application/src/main/java/com/project/imdang/setting/application/rest/TermsController.java @@ -1,8 +1,11 @@ -package com.project.imdang.setting.service.application.rest; +package com.project.imdang.setting.application.rest; -import com.project.imdang.setting.service.domain.dto.AgreeTermsCommand; -import com.project.imdang.setting.service.domain.dto.TermsResponse; -import com.project.imdang.setting.service.domain.ports.input.service.TermsApplicationService; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.TermsId; +import com.project.imdang.setting.application.dto.AgreeTermsRequest; +import com.project.imdang.setting.domain.dto.AgreeTermsCommand; +import com.project.imdang.setting.domain.dto.TermsResult; +import com.project.imdang.setting.domain.ports.input.service.TermsApplicationService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -20,7 +23,9 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; @Slf4j @Tag(name = "TermsController", description = "약관 API") @@ -33,18 +38,25 @@ public class TermsController { @Operation(description = "약관 목록 조회 API") @ApiResponse(responseCode = "200", description = "약관 목록 조회 성공", - content = @Content(schema = @Schema(implementation = TermsResponse.class))) + content = @Content(schema = @Schema(implementation = TermsResult.class))) @GetMapping - public ResponseEntity> list() { - List list = termsApplicationService.listTerms(); - return ResponseEntity.ok(list); + public ResponseEntity> list() { + List termsResults = termsApplicationService.listTerms(); + return ResponseEntity.ok(termsResults); } @Operation(description = "약관 동의 API") @ApiResponse(responseCode = "200", description = "약관 동의 성공") @PostMapping("/agree") - public ResponseEntity agree(@AuthenticationPrincipal UUID memberId, @RequestBody @Valid AgreeTermsCommand agreeTermsCommand) { - agreeTermsCommand.setMemberId(memberId); + public ResponseEntity agree(@AuthenticationPrincipal UUID memberId, + @RequestBody @Valid AgreeTermsRequest agreeTermsRequest) { + Set termsIds = agreeTermsRequest.getTermsIds().stream() + .map(TermsId::new) + .collect(Collectors.toSet()); + AgreeTermsCommand agreeTermsCommand = AgreeTermsCommand.builder() + .memberId(new MemberId(memberId)) + .termsIds(termsIds) + .build(); termsApplicationService.agreeTerms(agreeTermsCommand); return ResponseEntity.ok().build(); } diff --git a/setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/exception/handler/GlobalExceptionHandler.java b/setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/exception/handler/GlobalExceptionHandler.java deleted file mode 100644 index 4b85c875..00000000 --- a/setting-service/setting-application/src/main/java/com/project/imdang/setting/service/application/exception/handler/GlobalExceptionHandler.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.project.imdang.setting.service.application.exception.handler; - -import com.project.imdang.application.handler.ErrorDTO; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.ConstraintViolationException; -import jakarta.validation.ValidationException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; - -import java.util.stream.Collectors; - -@Slf4j -@ControllerAdvice -@Component("SettingGlobalExceptionHandler") -public class GlobalExceptionHandler { - - @ResponseBody - @ExceptionHandler(value = {Exception.class}) - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - public ErrorDTO handleException(Exception exception) { - log.error(exception.getMessage(), exception); - return ErrorDTO.of(HttpStatus.INTERNAL_SERVER_ERROR, "Unexpected Error!"); - } - - @ResponseBody - @ExceptionHandler(value = {ValidationException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(ValidationException validationException) { - ErrorDTO errorDTO; - if (validationException instanceof ConstraintViolationException) { - String violations = extractViolationsFromException((ConstraintViolationException) validationException); - log.error(violations, validationException); - - errorDTO = ErrorDTO.of(HttpStatus.BAD_REQUEST, violations); - - } else { - String exceptionMessage = validationException.getMessage(); - log.error(exceptionMessage, validationException); - errorDTO = ErrorDTO.of(HttpStatus.BAD_REQUEST, exceptionMessage); - } - return errorDTO; - } - - private String extractViolationsFromException(ConstraintViolationException validationException) { - return validationException.getConstraintViolations() - .stream() - .map(ConstraintViolation::getMessage) - .collect(Collectors.joining("--")); - } - - @ResponseBody - @ExceptionHandler(value = {MethodArgumentNotValidException.class}) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorDTO handleException(MethodArgumentNotValidException methodArgumentNotValidException) { - log.error(methodArgumentNotValidException.getMessage(), methodArgumentNotValidException); - return ErrorDTO.of(HttpStatus.BAD_REQUEST, "Please input " + methodArgumentNotValidException.getParameter().getParameterName()); - } -} diff --git a/setting-service/setting-application/src/main/resources/application.properties b/setting-service/setting-application/src/main/resources/application.properties deleted file mode 100644 index d131ce7a..00000000 --- a/setting-service/setting-application/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=setting-application diff --git a/setting-service/setting-container/build.gradle b/setting-service/setting-container/build.gradle deleted file mode 100644 index c049d055..00000000 --- a/setting-service/setting-container/build.gradle +++ /dev/null @@ -1,6 +0,0 @@ -bootJar { - enabled = false -} -jar { - enabled = true -} diff --git a/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/BeanConfiguration.java b/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/BeanConfiguration.java deleted file mode 100644 index 319d84b4..00000000 --- a/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/BeanConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.project.imdang.setting.service; - -import com.project.imdang.setting.service.domain.NotificationDomainService; -import com.project.imdang.setting.service.domain.NotificationDomainServiceImpl; -import com.project.imdang.setting.service.domain.TermsDomainService; -import com.project.imdang.setting.service.domain.TermsDomainServiceImpl; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration("settingBeanConfiguration") -public class BeanConfiguration { - - @Bean - public NotificationDomainService notificationDomainService() { - return new NotificationDomainServiceImpl(); - } - @Bean - public TermsDomainService termsDomainService() { - return new TermsDomainServiceImpl(); - } -} diff --git a/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/FcmConfiguration.java b/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/FcmConfiguration.java deleted file mode 100644 index d27deaa5..00000000 --- a/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/FcmConfiguration.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.project.imdang.setting.service; - -import com.google.auth.oauth2.GoogleCredentials; -import com.google.firebase.FirebaseApp; -import com.google.firebase.FirebaseOptions; -import com.google.firebase.messaging.FirebaseMessaging; -import com.project.imdang.setting.service.domain.exception.FirebaseException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - -@Slf4j -@Configuration -public class FcmConfiguration { - - @Value("${firebase.config.path}") - private String firebaseConfigPath; - - @Bean - public FirebaseApp firebaseApp() { - try { - InputStream serviceAccount = new ClassPathResource(firebaseConfigPath).getInputStream(); - - FirebaseOptions options = FirebaseOptions.builder() - .setCredentials(GoogleCredentials.fromStream(serviceAccount)) - .build(); - log.info("Initialize Firebase Admin SDK complete"); - return FirebaseApp.initializeApp(options); - } catch (FileNotFoundException e) { - throw new IllegalStateException(); - } catch (IOException e) { - throw new FirebaseException("Failed initialize Firebase Admin SDK"); - } - } - - @Bean - public FirebaseMessaging firebaseMessaging() { - try { - return FirebaseMessaging.getInstance(firebaseApp()); - } catch (IllegalStateException e) { - throw new FirebaseException("Failed initialize FirebaseApp" + e.getMessage()); - } catch (NullPointerException e) { - throw new FirebaseException("Failed load FirebaseApp" + e.getMessage()); - } catch (Exception e) { - throw new IllegalArgumentException("Failed read FirebaseConfigPath" + e.getMessage()); - } - } -} diff --git a/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/SettingServiceApplication.java b/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/SettingServiceApplication.java deleted file mode 100644 index 5d15f1dc..00000000 --- a/setting-service/setting-container/src/main/java/com/project/imdang/setting/service/SettingServiceApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.setting.service; - -import org.springframework.boot.SpringApplication; - -//@EnableJpaRepositories(basePackages = "com.project.imdang.setting.service.persistence") -//@EntityScan(basePackages = "com.project.imdang.setting.service.persistence") -//@SpringBootApplication(scanBasePackages = "com.project.imdang") -public class SettingServiceApplication { - - public static void main(String[] args) { - SpringApplication.run(SettingServiceApplication.class, args); - } - -} diff --git a/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/NotificationControllerTest.java b/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/NotificationControllerTest.java deleted file mode 100644 index 60cea1c3..00000000 --- a/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/NotificationControllerTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.project.imdang.setting.service.application.rest; - -import com.project.imdang.domain.jwt.JwtTokenProvider; -import com.project.imdang.setting.service.SettingServiceApplication; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.UUID; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@AutoConfigureMockMvc -@SpringBootTest(classes = SettingServiceApplication.class) -public class NotificationControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private JwtTokenProvider jwtTokenProvider; - - @Test - void listUnchecked() throws Exception { - - // given - String token = "token"; - String memberId = UUID.randomUUID().toString(); - Mockito.when(jwtTokenProvider.verifyToken(token)) - .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(token)) - .thenReturn(memberId); - - mockMvc.perform(get("/notifications/unchecked") - .header("Authorization", "Bearer " + token) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(print()) - .andReturn(); - } -} diff --git a/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/TermsControllerTest.java b/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/TermsControllerTest.java deleted file mode 100644 index 7b2af6be..00000000 --- a/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/TermsControllerTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.project.imdang.setting.service.application.rest; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.domain.jwt.JwtTokenProvider; -import com.project.imdang.setting.service.SettingServiceApplication; -import com.project.imdang.setting.service.domain.dto.AgreeTermsCommand; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; - -import java.util.Set; -import java.util.UUID; - -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@AutoConfigureMockMvc -@SpringBootTest(classes = SettingServiceApplication.class) -public class TermsControllerTest { - - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - - @MockBean - private JwtTokenProvider jwtTokenProvider; - - @Test - public void list() throws Exception { - mockMvc.perform(get("/terms") -// .param("pageNumber", "0") -// .param("pageSize", "10") - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andDo(print()) - .andReturn(); - } - - @Test - public void agree() throws Exception { - - // given - String token = "token"; - String memberId = UUID.randomUUID().toString(); - Mockito.when(jwtTokenProvider.verifyToken(token)) - .thenReturn(true); - Mockito.when(jwtTokenProvider.extractSubject(token)) - .thenReturn(memberId); - - AgreeTermsCommand agreeTermsCommand = AgreeTermsCommand.builder() - .termsIds(Set.of(1L, 2L)) -// .memberId(UUID.randomUUID()) - .build(); - mockMvc.perform(post("/terms/agree") - .header("Authorization", "Bearer " + token) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(agreeTermsCommand))) - .andExpect(status().isOk()); - } -} diff --git a/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/TestConfiguration.java b/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/TestConfiguration.java deleted file mode 100644 index cb7ce5aa..00000000 --- a/setting-service/setting-container/src/test/java/com/project/imdang/setting/service/application/rest/TestConfiguration.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.project.imdang.setting.service.application.rest; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -@EnableJpaRepositories(basePackages = "com.project.imdang.setting.service.persistence") -@EntityScan(basePackages = "com.project.imdang.setting.service.persistence") -@SpringBootApplication(scanBasePackages = "com.project.imdang") -public class TestConfiguration { -} diff --git a/setting-service/setting-domain/setting-application-service/build.gradle b/setting-service/setting-domain/setting-application-service/build.gradle index c049d055..cc304d3c 100644 --- a/setting-service/setting-domain/setting-application-service/build.gradle +++ b/setting-service/setting-domain/setting-application-service/build.gradle @@ -1,6 +1,16 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':setting-service:setting-domain:setting-domain-core') + implementation project(':common:common-domain:common-application-service') + implementation project(':common:common-domain:common-domain-core') + + implementation project(':member-service:member-service-client:member-service-client-api') + + implementation 'org.springframework.boot:spring-boot-starter' + // TODO - CHECK + implementation 'org.springframework:spring-tx' + implementation 'org.springframework.data:spring-data-commons' + + // TODO - CHECK + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0' } diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/NotificationApplicationServiceImpl.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/NotificationApplicationServiceImpl.java similarity index 61% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/NotificationApplicationServiceImpl.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/NotificationApplicationServiceImpl.java index 330c9627..48db0b0a 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/NotificationApplicationServiceImpl.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/NotificationApplicationServiceImpl.java @@ -1,11 +1,11 @@ -package com.project.imdang.setting.service.domain; +package com.project.imdang.setting.domain; -import com.project.imdang.setting.service.domain.dto.ListNotificationQuery; -import com.project.imdang.setting.service.domain.dto.NotificationResponse; -import com.project.imdang.setting.service.domain.handler.CheckNewNotificationCommandHandler; -import com.project.imdang.setting.service.domain.handler.ListNotificationCommandHandler; -import com.project.imdang.setting.service.domain.handler.UpdateNotificationAsCheckedHandler; -import com.project.imdang.setting.service.domain.ports.input.service.NotificationApplicationService; +import com.project.imdang.setting.domain.dto.ListNotificationQuery; +import com.project.imdang.setting.domain.dto.NotificationResult; +import com.project.imdang.setting.domain.handler.CheckNewNotificationCommandHandler; +import com.project.imdang.setting.domain.handler.ListNotificationCommandHandler; +import com.project.imdang.setting.domain.handler.UpdateNotificationAsCheckedHandler; +import com.project.imdang.setting.domain.ports.input.service.NotificationApplicationService; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; @@ -28,7 +28,7 @@ public Boolean checkNewNotification(UUID memberId) { } @Override - public Page listNotification(ListNotificationQuery listNotificationQuery) { + public Page listNotification(ListNotificationQuery listNotificationQuery) { return listNotificationCommandHandler.listNotification(listNotificationQuery); } diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/TermsApplicationServiceImpl.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/TermsApplicationServiceImpl.java similarity index 57% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/TermsApplicationServiceImpl.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/TermsApplicationServiceImpl.java index 9bf4998e..ad20c7a4 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/TermsApplicationServiceImpl.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/TermsApplicationServiceImpl.java @@ -1,10 +1,10 @@ -package com.project.imdang.setting.service.domain; +package com.project.imdang.setting.domain; -import com.project.imdang.setting.service.domain.dto.AgreeTermsCommand; -import com.project.imdang.setting.service.domain.dto.TermsResponse; -import com.project.imdang.setting.service.domain.handler.AgreeTermsCommandHandler; -import com.project.imdang.setting.service.domain.handler.ListTermsCommandHandler; -import com.project.imdang.setting.service.domain.ports.input.service.TermsApplicationService; +import com.project.imdang.setting.domain.dto.AgreeTermsCommand; +import com.project.imdang.setting.domain.dto.TermsResult; +import com.project.imdang.setting.domain.handler.AgreeTermsCommandHandler; +import com.project.imdang.setting.domain.handler.ListTermsCommandHandler; +import com.project.imdang.setting.domain.ports.input.service.TermsApplicationService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -20,7 +20,7 @@ public class TermsApplicationServiceImpl implements TermsApplicationService { private final AgreeTermsCommandHandler agreeTermsCommandHandler; @Override - public List listTerms() { + public List listTerms() { return listTermsCommandHandler.listTerms(); } diff --git a/common/common-application/src/main/java/com/project/imdang/application/configuration/ObjectMapperConfiguration.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/configuration/ObjectMapperConfiguration.java similarity index 86% rename from common/common-application/src/main/java/com/project/imdang/application/configuration/ObjectMapperConfiguration.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/configuration/ObjectMapperConfiguration.java index eb2ebb76..1a167152 100644 --- a/common/common-application/src/main/java/com/project/imdang/application/configuration/ObjectMapperConfiguration.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/configuration/ObjectMapperConfiguration.java @@ -1,11 +1,11 @@ -package com.project.imdang.application.configuration; +package com.project.imdang.setting.domain.configuration; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -@Configuration("objectMapperConfiguration") +@Configuration public class ObjectMapperConfiguration { @Bean public ObjectMapper objectMapper() { diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/AgreeTermsCommand.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/AgreeTermsCommand.java similarity index 53% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/AgreeTermsCommand.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/AgreeTermsCommand.java index ff1c2753..3cb3a70c 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/AgreeTermsCommand.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/AgreeTermsCommand.java @@ -1,23 +1,20 @@ -package com.project.imdang.setting.service.domain.dto; +package com.project.imdang.setting.domain.dto; -import jakarta.validation.constraints.NotEmpty; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.TermsId; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import java.util.Set; -import java.util.UUID; @Builder @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AgreeTermsCommand { - @NotEmpty - private Set termsIds; - @Setter - private UUID memberId; // agreedBy + private Set termsIds; + private MemberId memberId; // agreedBy } diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/CreateNotificationCommand.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/CreateNotificationCommand.java similarity index 61% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/CreateNotificationCommand.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/CreateNotificationCommand.java index 9c314fcf..3eaecfc0 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/CreateNotificationCommand.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/CreateNotificationCommand.java @@ -1,20 +1,19 @@ -package com.project.imdang.setting.service.domain.dto; +package com.project.imdang.setting.domain.dto; -import com.project.imdang.setting.service.domain.valueobject.NotificationCategory; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.NotificationCategory; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import java.util.UUID; - @Builder @AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class CreateNotificationCommand { private NotificationCategory category; - private UUID receiverId; + private MemberId receiverId; private String message; } diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/ListNotificationQuery.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/ListNotificationQuery.java new file mode 100644 index 00000000..18c1a55b --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/ListNotificationQuery.java @@ -0,0 +1,22 @@ +package com.project.imdang.setting.domain.dto; + +import com.project.imdang.common.domain.dto.PagingQuery; +import com.project.imdang.common.domain.valueobject.MemberId; +import lombok.Builder; +import lombok.Getter; + +import java.util.UUID; + +@Getter +public class ListNotificationQuery extends PagingQuery { + private MemberId receiverId; + private boolean isChecked; + + @Builder + private ListNotificationQuery(Integer pageNumber, Integer pageSize, String direction, String[] properties, + MemberId receiverId, boolean isChecked) { + super(pageNumber, pageSize, direction, properties); + this.receiverId = receiverId; + this.isChecked = isChecked; + } +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/PushNotificationRequest.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/NotificationResult.java similarity index 52% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/PushNotificationRequest.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/NotificationResult.java index 399903e0..37d35b7e 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/PushNotificationRequest.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/NotificationResult.java @@ -1,21 +1,21 @@ -package com.project.imdang.setting.service.domain.dto; +package com.project.imdang.setting.domain.dto; -import com.project.imdang.setting.service.domain.valueobject.NotificationCategory; +import com.project.imdang.common.domain.valueobject.NotificationCategory; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import java.time.ZonedDateTime; -import java.util.UUID; +@Builder +@AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class PushNotificationRequest { - private UUID memberId; +public class NotificationResult { + private Long notificationId; private NotificationCategory category; - private String title; - private String body; + private String message; private ZonedDateTime createdAt; } diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/TermsResult.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/TermsResult.java new file mode 100644 index 00000000..4c448271 --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/dto/TermsResult.java @@ -0,0 +1,19 @@ +package com.project.imdang.setting.domain.dto; + +import com.project.imdang.common.domain.valueobject.TermsId; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class TermsResult { + private TermsId termsId; + private String title; + private String url; + private Boolean isEssential; +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/AgreeTermsCommandHandler.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/AgreeTermsCommandHandler.java similarity index 62% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/AgreeTermsCommandHandler.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/AgreeTermsCommandHandler.java index 4763938d..0e95993e 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/AgreeTermsCommandHandler.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/AgreeTermsCommandHandler.java @@ -1,20 +1,21 @@ -package com.project.imdang.setting.service.domain.handler; +package com.project.imdang.setting.domain.handler; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.TermsDomainService; -import com.project.imdang.setting.service.domain.dto.AgreeTermsCommand; -import com.project.imdang.setting.service.domain.entity.Terms; -import com.project.imdang.setting.service.domain.entity.TermsAgreement; -import com.project.imdang.setting.service.domain.exception.NotificationDomainException; -import com.project.imdang.setting.service.domain.ports.output.repository.TermsAgreementRepository; -import com.project.imdang.setting.service.domain.ports.output.repository.TermsRepository; -import com.project.imdang.setting.service.domain.valueobject.TermsId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.TermsId; +import com.project.imdang.setting.domain.TermsDomainService; +import com.project.imdang.setting.domain.dto.AgreeTermsCommand; +import com.project.imdang.setting.domain.entity.Terms; +import com.project.imdang.setting.domain.entity.TermsAgreement; +import com.project.imdang.setting.domain.exception.NotificationDomainException; +import com.project.imdang.setting.domain.ports.output.repository.TermsAgreementRepository; +import com.project.imdang.setting.domain.ports.output.repository.TermsRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Set; @Slf4j @RequiredArgsConstructor @@ -28,10 +29,8 @@ public class AgreeTermsCommandHandler { @Transactional public void agreeTerms(AgreeTermsCommand agreeTermsCommand) { - List termsIds = agreeTermsCommand.getTermsIds().stream() - .map(TermsId::new) - .toList(); - MemberId memberId = new MemberId(agreeTermsCommand.getMemberId()); + Set termsIds = agreeTermsCommand.getTermsIds(); + MemberId memberId = agreeTermsCommand.getMemberId(); List terms = termsRepository.findAllByIds(termsIds); // TODO - 일괄 동의 or ASYNC terms.forEach(agreed -> { diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/CheckNewNotificationCommandHandler.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/CheckNewNotificationCommandHandler.java similarity index 75% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/CheckNewNotificationCommandHandler.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/CheckNewNotificationCommandHandler.java index 08c6211b..38120085 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/CheckNewNotificationCommandHandler.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/CheckNewNotificationCommandHandler.java @@ -1,7 +1,7 @@ -package com.project.imdang.setting.service.domain.handler; +package com.project.imdang.setting.domain.handler; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.ports.output.repository.NotificationRepository; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.ports.output.repository.NotificationRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/CreateNotificationCommandHandler.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/CreateNotificationCommandHandler.java similarity index 69% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/CreateNotificationCommandHandler.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/CreateNotificationCommandHandler.java index 39051043..2fbbe356 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/CreateNotificationCommandHandler.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/CreateNotificationCommandHandler.java @@ -1,12 +1,12 @@ -package com.project.imdang.setting.service.domain.handler; +package com.project.imdang.setting.domain.handler; -import com.project.imdang.setting.service.domain.NotificationDomainService; -import com.project.imdang.setting.service.domain.dto.CreateNotificationCommand; -import com.project.imdang.setting.service.domain.entity.Notification; -import com.project.imdang.setting.service.domain.event.NotificationCreatedEvent; -import com.project.imdang.setting.service.domain.exception.NotificationDomainException; -import com.project.imdang.setting.service.domain.mapper.NotificationDataMapper; -import com.project.imdang.setting.service.domain.ports.output.repository.NotificationRepository; +import com.project.imdang.setting.domain.NotificationDomainService; +import com.project.imdang.setting.domain.dto.CreateNotificationCommand; +import com.project.imdang.setting.domain.entity.Notification; +import com.project.imdang.setting.domain.event.NotificationCreatedEvent; +import com.project.imdang.setting.domain.exception.NotificationDomainException; +import com.project.imdang.setting.domain.mapper.NotificationDataMapper; +import com.project.imdang.setting.domain.ports.output.repository.NotificationRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/ListNotificationCommandHandler.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/ListNotificationCommandHandler.java similarity index 61% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/ListNotificationCommandHandler.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/ListNotificationCommandHandler.java index b51de332..c84637af 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/ListNotificationCommandHandler.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/ListNotificationCommandHandler.java @@ -1,11 +1,11 @@ -package com.project.imdang.setting.service.domain.handler; +package com.project.imdang.setting.domain.handler; -import com.project.imdang.domain.utils.PagingUtils; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.dto.ListNotificationQuery; -import com.project.imdang.setting.service.domain.dto.NotificationResponse; -import com.project.imdang.setting.service.domain.mapper.NotificationDataMapper; -import com.project.imdang.setting.service.domain.ports.output.repository.NotificationRepository; +import com.project.imdang.common.domain.utils.PagingUtils; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.dto.ListNotificationQuery; +import com.project.imdang.setting.domain.dto.NotificationResult; +import com.project.imdang.setting.domain.mapper.NotificationDataMapper; +import com.project.imdang.setting.domain.ports.output.repository.NotificationRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -24,13 +24,12 @@ public class ListNotificationCommandHandler { private final NotificationDataMapper notificationDataMapper; @Transactional(readOnly = true) - public Page listNotification(ListNotificationQuery listNotificationQuery) { + public Page listNotification(ListNotificationQuery listNotificationQuery) { PageRequest pageRequest = PagingUtils.getPageRequest( listNotificationQuery.getPageNumber(), listNotificationQuery.getPageSize(), listNotificationQuery.getDirection(), listNotificationQuery.getProperties()); - MemberId memberId = new MemberId(listNotificationQuery.getReceiverId()); + MemberId memberId = listNotificationQuery.getReceiverId(); ZonedDateTime minusOneYear = ZonedDateTime.now().minusYears(1); - return notificationRepository.findAllByReceiverIdAndIsCheckedAndCreatedAt(memberId, listNotificationQuery.isChecked(), minusOneYear, pageRequest) - .map(notificationDataMapper::notificationToNotificationResponse); + .map(notificationDataMapper::notificationToNotificationResult); } } diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/ListTermsCommandHandler.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/ListTermsCommandHandler.java similarity index 59% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/ListTermsCommandHandler.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/ListTermsCommandHandler.java index 4634898d..fc008e44 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/ListTermsCommandHandler.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/ListTermsCommandHandler.java @@ -1,8 +1,8 @@ -package com.project.imdang.setting.service.domain.handler; +package com.project.imdang.setting.domain.handler; -import com.project.imdang.setting.service.domain.dto.TermsResponse; -import com.project.imdang.setting.service.domain.mapper.TermsDataMapper; -import com.project.imdang.setting.service.domain.ports.output.repository.TermsRepository; +import com.project.imdang.setting.domain.dto.TermsResult; +import com.project.imdang.setting.domain.mapper.TermsDataMapper; +import com.project.imdang.setting.domain.ports.output.repository.TermsRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -21,9 +21,9 @@ public class ListTermsCommandHandler { private final TermsDataMapper termsDataMapper; @Transactional(readOnly = true) - public List listTerms() { + public List listTerms() { return termsRepository.findAll().stream() - .map(termsDataMapper::termsToTermsResponse) + .map(termsDataMapper::termsToTermsResult) .collect(Collectors.toList()); } } diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/UpdateNotificationAsCheckedHandler.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/UpdateNotificationAsCheckedHandler.java similarity index 80% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/UpdateNotificationAsCheckedHandler.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/UpdateNotificationAsCheckedHandler.java index 17a7a929..db7fc090 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/UpdateNotificationAsCheckedHandler.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/handler/UpdateNotificationAsCheckedHandler.java @@ -1,10 +1,10 @@ -package com.project.imdang.setting.service.domain.handler; +package com.project.imdang.setting.domain.handler; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.NotificationDomainService; -import com.project.imdang.setting.service.domain.entity.Notification; -import com.project.imdang.setting.service.domain.exception.NotificationDomainException; -import com.project.imdang.setting.service.domain.ports.output.repository.NotificationRepository; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.NotificationDomainService; +import com.project.imdang.setting.domain.entity.Notification; +import com.project.imdang.setting.domain.exception.NotificationDomainException; +import com.project.imdang.setting.domain.ports.output.repository.NotificationRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/mapper/NotificationDataMapper.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/mapper/NotificationDataMapper.java similarity index 56% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/mapper/NotificationDataMapper.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/mapper/NotificationDataMapper.java index 341e96bf..d958b059 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/mapper/NotificationDataMapper.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/mapper/NotificationDataMapper.java @@ -1,9 +1,8 @@ -package com.project.imdang.setting.service.domain.mapper; +package com.project.imdang.setting.domain.mapper; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.dto.CreateNotificationCommand; -import com.project.imdang.setting.service.domain.dto.NotificationResponse; -import com.project.imdang.setting.service.domain.entity.Notification; +import com.project.imdang.setting.domain.dto.CreateNotificationCommand; +import com.project.imdang.setting.domain.dto.NotificationResult; +import com.project.imdang.setting.domain.entity.Notification; import org.springframework.stereotype.Component; @Component @@ -12,14 +11,14 @@ public class NotificationDataMapper { public Notification createNotificationCommandToNotification(CreateNotificationCommand createNotificationCommand) { return Notification.builder() .category(createNotificationCommand.getCategory()) - .receiverId(new MemberId(createNotificationCommand.getReceiverId())) + .receiverId(createNotificationCommand.getReceiverId()) .message(createNotificationCommand.getMessage()) .isChecked(Boolean.FALSE) .build(); } - public NotificationResponse notificationToNotificationResponse(Notification notification) { - return NotificationResponse.builder() + public NotificationResult notificationToNotificationResult(Notification notification) { + return NotificationResult.builder() .notificationId(notification.getId().getValue()) .category(notification.getCategory()) .message(notification.getMessage()) diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/mapper/TermsDataMapper.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/mapper/TermsDataMapper.java new file mode 100644 index 00000000..a002c03c --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/mapper/TermsDataMapper.java @@ -0,0 +1,18 @@ +package com.project.imdang.setting.domain.mapper; + +import com.project.imdang.setting.domain.dto.TermsResult; +import com.project.imdang.setting.domain.entity.Terms; +import org.springframework.stereotype.Component; + +@Component +public class TermsDataMapper { + + public TermsResult termsToTermsResult(Terms terms) { + return TermsResult.builder() + .termsId(terms.getId()) + .title(terms.getTitle()) + .url(terms.getUrl()) + .isEssential(terms.getIsEssential()) + .build(); + } +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/listener/SendNotificationListener.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/listener/SendNotificationListener.java new file mode 100644 index 00000000..a237fec1 --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/listener/SendNotificationListener.java @@ -0,0 +1,78 @@ +package com.project.imdang.setting.domain.ports.input.listener; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.project.imdang.common.domain.event.entry.EventEntry; +import com.project.imdang.common.domain.event.entry.EventListener; +import com.project.imdang.common.domain.exception.DomainException; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.NotificationCategory; +import com.project.imdang.member.domain.client.MemberData; +import com.project.imdang.member.domain.client.MemberDataResolver; +import com.project.imdang.member.domain.client.exception.MemberNotFoundException; +import com.project.imdang.setting.domain.dto.CreateNotificationCommand; +import com.project.imdang.setting.domain.handler.CreateNotificationCommandHandler; +import com.project.imdang.setting.domain.ports.output.sender.NotificationRequest; +import com.project.imdang.setting.domain.ports.output.sender.NotificationSender; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.ZonedDateTime; +import java.util.UUID; + +@Slf4j +@RequiredArgsConstructor +@Component +public class SendNotificationListener implements EventListener { + + private final CreateNotificationCommandHandler createNotificationCommandHandler; + private final MemberDataResolver memberResolver; + + private final NotificationSender notificationSender; + private final ObjectMapper objectMapper; + + @Override + public void process(EventEntry eventEntry) { + + NotificationCategory category = NotificationCategory.getType(eventEntry.getType()); + final UUID receiverId = getReceiverId(eventEntry.getPayload()); + + MemberId memberId = new MemberId(receiverId); + MemberData receiver = memberResolver.resolve(memberId) + .orElseThrow(() -> new MemberNotFoundException(memberId)); + + final String message = String.format(category.getNotificationContent(), receiver.getNickname()); + + // 1. 알림 생성 + CreateNotificationCommand createNotificationCommand + = new CreateNotificationCommand(category, memberId, message); + createNotificationCommandHandler.createNotification(createNotificationCommand); + + // 2. 푸시 알림 생성 + NotificationRequest notificationRequest = NotificationRequest.builder() + .receiverId(receiverId) +// .category(category) + .title(category.getTitle()) + .body(category.getPushNotificationContent()) + .createdAt(ZonedDateTime.now()) + .build(); + notificationSender.send(notificationRequest); + } + + private UUID getReceiverId(String payload) { + try { + JsonNode jsonNode = objectMapper.readTree(payload); + String receiverId = jsonNode + .get("exchangeRequest") + .get("requestMemberId") + .get("value") + .asText(); + return UUID.fromString(receiverId); + } catch (JsonProcessingException e) { + // TODO - 예외 처리 + throw new DomainException("JSON ERROR!"); + } + } +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/service/NotificationApplicationService.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/service/NotificationApplicationService.java new file mode 100644 index 00000000..044eaaed --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/service/NotificationApplicationService.java @@ -0,0 +1,13 @@ +package com.project.imdang.setting.domain.ports.input.service; + +import com.project.imdang.setting.domain.dto.ListNotificationQuery; +import com.project.imdang.setting.domain.dto.NotificationResult; +import org.springframework.data.domain.Page; + +import java.util.UUID; + +public interface NotificationApplicationService { + Boolean checkNewNotification(UUID memberId); + Page listNotification(ListNotificationQuery listNotificationQuery); + void updateNotificationAsChecked(UUID memberId); +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/service/TermsApplicationService.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/service/TermsApplicationService.java new file mode 100644 index 00000000..ed56534e --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/input/service/TermsApplicationService.java @@ -0,0 +1,12 @@ +package com.project.imdang.setting.domain.ports.input.service; + +import com.project.imdang.setting.domain.dto.AgreeTermsCommand; +import com.project.imdang.setting.domain.dto.TermsResult; + +import java.util.List; + +public interface TermsApplicationService { + + List listTerms(); + void agreeTerms(AgreeTermsCommand agreeTermsCommand); +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/NotificationRepository.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/NotificationRepository.java similarity index 71% rename from setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/NotificationRepository.java rename to setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/NotificationRepository.java index 38bfb22f..1efbd7e1 100644 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/NotificationRepository.java +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/NotificationRepository.java @@ -1,7 +1,7 @@ -package com.project.imdang.setting.service.domain.ports.output.repository; +package com.project.imdang.setting.domain.ports.output.repository; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.entity.Notification; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.entity.Notification; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/TermsAgreementRepository.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/TermsAgreementRepository.java new file mode 100644 index 00000000..df52278e --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/TermsAgreementRepository.java @@ -0,0 +1,7 @@ +package com.project.imdang.setting.domain.ports.output.repository; + +import com.project.imdang.setting.domain.entity.TermsAgreement; + +public interface TermsAgreementRepository { + TermsAgreement save(TermsAgreement termsAgreement); +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/TermsRepository.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/TermsRepository.java new file mode 100644 index 00000000..9354d120 --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/repository/TermsRepository.java @@ -0,0 +1,12 @@ +package com.project.imdang.setting.domain.ports.output.repository; + +import com.project.imdang.common.domain.valueobject.TermsId; +import com.project.imdang.setting.domain.entity.Terms; + +import java.util.List; +import java.util.Set; + +public interface TermsRepository { + List findAll(); + List findAllByIds(Set termsIds); +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/sender/NotificationRequest.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/sender/NotificationRequest.java new file mode 100644 index 00000000..0fedef53 --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/sender/NotificationRequest.java @@ -0,0 +1,19 @@ +package com.project.imdang.setting.domain.ports.output.sender; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.time.ZonedDateTime; +import java.util.UUID; + +@Getter +@Builder +@AllArgsConstructor +public class NotificationRequest { + private UUID receiverId; +// private NotificationCategory category; + private String title; + private String body; + private ZonedDateTime createdAt; +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/sender/NotificationSender.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/sender/NotificationSender.java new file mode 100644 index 00000000..f03bd09b --- /dev/null +++ b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/domain/ports/output/sender/NotificationSender.java @@ -0,0 +1,5 @@ +package com.project.imdang.setting.domain.ports.output.sender; + +public interface NotificationSender { + void send(NotificationRequest notificationRequest); +} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/SendNotificationListener.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/SendNotificationListener.java deleted file mode 100644 index bfbc7828..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/SendNotificationListener.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.project.imdang.setting.service.domain; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.project.imdang.domain.exception.DomainException; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.event.EventEntry; -import com.project.imdang.event.EventListener; -import com.project.imdang.setting.service.domain.dto.CreateNotificationCommand; -import com.project.imdang.setting.service.domain.dto.PushNotificationRequest; -import com.project.imdang.setting.service.domain.handler.CreateNotificationCommandHandler; -import com.project.imdang.setting.service.domain.handler.SendNotificationHandler; -import com.project.imdang.setting.service.domain.ports.output.lookup.SettingMemberLookup; -import com.project.imdang.setting.service.domain.valueobject.MemberInfo; -import com.project.imdang.setting.service.domain.valueobject.NotificationCategory; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.time.ZonedDateTime; -import java.util.Optional; -import java.util.UUID; - -@Slf4j -@RequiredArgsConstructor -@Component -public class SendNotificationListener implements EventListener { - - private final CreateNotificationCommandHandler createNotificationCommandHandler; - private final SendNotificationHandler sendNotificationHandler; - private final SettingMemberLookup settingMemberLookup; - private final ObjectMapper objectMapper; - - @Override - public void process(EventEntry eventEntry) { - - try { - - NotificationCategory category = NotificationCategory.getType(eventEntry.getType()); - UUID receiverId = getReceiverId(eventEntry.getPayload()); - - Optional memberInfo = settingMemberLookup.lookupByMemberId(new MemberId(receiverId)); - if (memberInfo.isPresent()) { - String message = String.format(category.getNotificationContent(), memberInfo.get().nickname()); - - // 1. 알림 생성 - CreateNotificationCommand createNotificationCommand = new CreateNotificationCommand(category, receiverId, message); - createNotificationCommandHandler.createNotification(createNotificationCommand); - - // 2. 푸시알림 생성 - PushNotificationRequest pushNotificationRequest = new PushNotificationRequest(receiverId, category, category.getTitle(), category.getPushNotificationContent(), ZonedDateTime.now()); - sendNotificationHandler.send(pushNotificationRequest); - } - - } catch (Exception e) { - log.error("Cannot send notification!", e); - } - } - - private UUID getReceiverId(String payload) { - try { - JsonNode jsonNode = objectMapper.readTree(payload); - String receiverId = jsonNode.get("exchangeRequest").get("requestMemberId").get("value").asText(); - return UUID.fromString(receiverId); - } catch (JsonProcessingException e) { - // TODO - 예외 처리 - throw new DomainException("JSON ERROR!"); - } - } -} - - diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/FcmTokenResponse.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/FcmTokenResponse.java deleted file mode 100644 index 70bd98d1..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/FcmTokenResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.project.imdang.setting.service.domain.dto; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor -public class FcmTokenResponse { - //TODO : Validation - private String deviceToken; -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/ListNotificationQuery.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/ListNotificationQuery.java deleted file mode 100644 index e1fe8d9f..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/ListNotificationQuery.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.project.imdang.setting.service.domain.dto; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.util.UUID; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ListNotificationQuery { - private UUID receiverId; - private boolean isChecked; - - private Integer pageNumber; - private Integer pageSize; - private String direction; - private String[] properties; -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/NotificationResponse.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/NotificationResponse.java deleted file mode 100644 index bcb92904..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/NotificationResponse.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.project.imdang.setting.service.domain.dto; - -import com.project.imdang.setting.service.domain.valueobject.NotificationCategory; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.time.ZonedDateTime; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class NotificationResponse { - @Schema(description = "알림 ID") - private Long notificationId; - @Schema(description = "알림 종류") - private NotificationCategory category; - @Schema(description = "알림 메세지") - private String message; - @Schema(description = "알림 생성 날짜") - private ZonedDateTime createdAt; -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/TermsResponse.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/TermsResponse.java deleted file mode 100644 index 3d46c128..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/dto/TermsResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.project.imdang.setting.service.domain.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Builder -@AllArgsConstructor -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class TermsResponse { - @Schema(description = "약관 ID") - private Long termsId; - @Schema(description = "제목") - private String title; - @Schema(description = "약관 URL") - private String url; - @Schema(description = "필수 동의 여부") - private Boolean isEssential; -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/exception/SettingApplicationServiceException.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/exception/SettingApplicationServiceException.java deleted file mode 100644 index 41b227af..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/exception/SettingApplicationServiceException.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.project.imdang.setting.service.domain.exception; - -import com.project.imdang.domain.exception.ApplicationServiceException; -import com.project.imdang.domain.exception.ErrorCode; - -public class SettingApplicationServiceException extends ApplicationServiceException { - - public SettingApplicationServiceException(ErrorCode errorCode) { - // TODO - 수정 - super(errorCode.name()); - } - - public SettingApplicationServiceException(String message) { - super(message); - } - - public SettingApplicationServiceException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/SendNotificationHandler.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/SendNotificationHandler.java deleted file mode 100644 index a51fbd5f..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/handler/SendNotificationHandler.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.project.imdang.setting.service.domain.handler; - -import com.google.firebase.messaging.*; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.dto.PushNotificationRequest; -import com.project.imdang.setting.service.domain.exception.NotificationDomainException; -import com.project.imdang.setting.service.domain.exception.SettingApplicationServiceException; -import com.project.imdang.setting.service.domain.ports.output.lookup.SettingMemberLookup; -import com.project.imdang.setting.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.retry.annotation.Backoff; -import org.springframework.retry.annotation.Retryable; -import org.springframework.stereotype.Component; - -import java.time.ZonedDateTime; - -import static com.project.imdang.domain.exception.ErrorCode.MEMBER_NOT_EXIST; - -@Component -@RequiredArgsConstructor -@Slf4j -public class SendNotificationHandler { - - private final FirebaseMessaging firebaseMessaging; - private final SettingMemberLookup settingMemberLookup; - - @Retryable(retryFor = FirebaseMessagingException.class, maxAttempts = 3, backoff = @Backoff(delay = 1000)) - public void send(PushNotificationRequest pushNotificationRequest) { - - MemberId memberId = new MemberId(pushNotificationRequest.getMemberId()); - String title = pushNotificationRequest.getTitle(); - String body = pushNotificationRequest.getBody(); - - String token = getFcmToken(memberId); - Notification notification = getNotification(title, body); - // TODO - CHECK : Android Configuration - AndroidConfig androidConfig = getAndroidConfig(title, body); - // TODO - CHECK : APNs Configuration - Message message = Message.builder() - .setToken(token) - .setNotification(notification) - .putData("time", ZonedDateTime.now().toString()) - .setAndroidConfig(androidConfig) - .build(); - - try { - String response = firebaseMessaging.send(message); - } catch (FirebaseMessagingException e) { - log.error("Error Code : {}", e.getErrorCode().name()); - throw new NotificationDomainException("메세지 전송에 실패했습니다." + e.getMessage()); - } - } - - private Notification getNotification(String title, String body) { - return Notification.builder() - .setTitle(title) - .setBody(body) - .build(); - } - - private AndroidConfig getAndroidConfig(String title, String body) { - return AndroidConfig.builder() - .setPriority(AndroidConfig.Priority.HIGH) - .setNotification(AndroidNotification.builder() - .setTitle(title) - .setBody(body) - .build()) - .build(); - } - - private String getFcmToken(MemberId memberId) { - MemberInfo memberInfo = settingMemberLookup.lookupByMemberId(memberId) - .orElseThrow(() -> new SettingApplicationServiceException(MEMBER_NOT_EXIST)); - return memberInfo.deviceToken(); - } -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/mapper/TermsDataMapper.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/mapper/TermsDataMapper.java deleted file mode 100644 index 690a6b9e..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/mapper/TermsDataMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.project.imdang.setting.service.domain.mapper; - -import com.project.imdang.setting.service.domain.dto.TermsResponse; -import com.project.imdang.setting.service.domain.entity.Terms; -import org.springframework.stereotype.Component; - -@Component -public class TermsDataMapper { - - public TermsResponse termsToTermsResponse(Terms terms) { - return TermsResponse.builder() - .termsId(terms.getId().getValue()) - .title(terms.getTitle()) - .url(terms.getUrl()) - .isEssential(terms.getIsEssential()) - .build(); - } -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/input/service/NotificationApplicationService.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/input/service/NotificationApplicationService.java deleted file mode 100644 index d2b214d1..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/input/service/NotificationApplicationService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.project.imdang.setting.service.domain.ports.input.service; - -import com.project.imdang.setting.service.domain.dto.ListNotificationQuery; -import com.project.imdang.setting.service.domain.dto.NotificationResponse; -import org.springframework.data.domain.Page; - -import java.util.UUID; - -public interface NotificationApplicationService { - Boolean checkNewNotification(UUID memberId); - Page listNotification(ListNotificationQuery listNotificationQuery); - void updateNotificationAsChecked(UUID memberId); -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/input/service/TermsApplicationService.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/input/service/TermsApplicationService.java deleted file mode 100644 index f961d56a..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/input/service/TermsApplicationService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.project.imdang.setting.service.domain.ports.input.service; - -import com.project.imdang.setting.service.domain.dto.AgreeTermsCommand; -import com.project.imdang.setting.service.domain.dto.TermsResponse; - -import java.util.List; - -public interface TermsApplicationService { - - List listTerms(); - void agreeTerms(AgreeTermsCommand agreeTermsCommand); -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/lookup/SettingMemberLookup.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/lookup/SettingMemberLookup.java deleted file mode 100644 index bf8f813a..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/lookup/SettingMemberLookup.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.project.imdang.setting.service.domain.ports.output.lookup; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.valueobject.MemberInfo; - -import java.util.Optional; - -public interface SettingMemberLookup { - Optional lookupByMemberId(MemberId memberId); -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/TermsAgreementRepository.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/TermsAgreementRepository.java deleted file mode 100644 index 94677c45..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/TermsAgreementRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.project.imdang.setting.service.domain.ports.output.repository; - -import com.project.imdang.setting.service.domain.entity.TermsAgreement; - -public interface TermsAgreementRepository { - TermsAgreement save(TermsAgreement termsAgreement); -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/TermsRepository.java b/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/TermsRepository.java deleted file mode 100644 index acf5cd50..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/java/com/project/imdang/setting/service/domain/ports/output/repository/TermsRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.project.imdang.setting.service.domain.ports.output.repository; - -import com.project.imdang.setting.service.domain.entity.Terms; -import com.project.imdang.setting.service.domain.valueobject.TermsId; - -import java.util.List; - -public interface TermsRepository { - List findAll(); - List findAllByIds(List termsIds); -} diff --git a/setting-service/setting-domain/setting-application-service/src/main/resources/application.properties b/setting-service/setting-domain/setting-application-service/src/main/resources/application.properties deleted file mode 100644 index a26058ff..00000000 --- a/setting-service/setting-domain/setting-application-service/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=setting-application-service diff --git a/setting-service/setting-domain/setting-domain-core/build.gradle b/setting-service/setting-domain/setting-domain-core/build.gradle index c049d055..1f712dad 100644 --- a/setting-service/setting-domain/setting-domain-core/build.gradle +++ b/setting-service/setting-domain/setting-domain-core/build.gradle @@ -1,6 +1,6 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':common:common-domain:common-domain-core') + + // TODO - api, 구현체 분리 + implementation 'org.springframework.boot:spring-boot-starter-logging' } diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/NotificationDomainService.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/NotificationDomainService.java new file mode 100644 index 00000000..85ecdb7d --- /dev/null +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/NotificationDomainService.java @@ -0,0 +1,9 @@ +package com.project.imdang.setting.domain; + +import com.project.imdang.setting.domain.entity.Notification; +import com.project.imdang.setting.domain.event.NotificationCreatedEvent; + +public interface NotificationDomainService { + NotificationCreatedEvent createNotification(Notification notification); + void updateNotificationAsChecked(Notification notification); +} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/NotificationDomainServiceImpl.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/NotificationDomainServiceImpl.java similarity index 75% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/NotificationDomainServiceImpl.java rename to setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/NotificationDomainServiceImpl.java index 4b187b09..c9993800 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/NotificationDomainServiceImpl.java +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/NotificationDomainServiceImpl.java @@ -1,7 +1,7 @@ -package com.project.imdang.setting.service.domain; +package com.project.imdang.setting.domain; -import com.project.imdang.setting.service.domain.entity.Notification; -import com.project.imdang.setting.service.domain.event.NotificationCreatedEvent; +import com.project.imdang.setting.domain.entity.Notification; +import com.project.imdang.setting.domain.event.NotificationCreatedEvent; import lombok.extern.slf4j.Slf4j; import java.time.ZoneId; diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/TermsDomainService.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/TermsDomainService.java new file mode 100644 index 00000000..e806a6bd --- /dev/null +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/TermsDomainService.java @@ -0,0 +1,9 @@ +package com.project.imdang.setting.domain; + +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.entity.Terms; +import com.project.imdang.setting.domain.entity.TermsAgreement; + +public interface TermsDomainService { + TermsAgreement agreeTerms(Terms terms, MemberId memberId); +} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/TermsDomainServiceImpl.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/TermsDomainServiceImpl.java similarity index 64% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/TermsDomainServiceImpl.java rename to setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/TermsDomainServiceImpl.java index aa065197..0085053f 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/TermsDomainServiceImpl.java +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/TermsDomainServiceImpl.java @@ -1,8 +1,8 @@ -package com.project.imdang.setting.service.domain; +package com.project.imdang.setting.domain; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.entity.Terms; -import com.project.imdang.setting.service.domain.entity.TermsAgreement; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.entity.Terms; +import com.project.imdang.setting.domain.entity.TermsAgreement; import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/Notification.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/Notification.java similarity index 76% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/Notification.java rename to setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/Notification.java index 7a10d251..8087dd6d 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/Notification.java +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/Notification.java @@ -1,10 +1,10 @@ -package com.project.imdang.setting.service.domain.entity; +package com.project.imdang.setting.domain.entity; -import com.project.imdang.domain.entity.AggregateRoot; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.exception.NotificationDomainException; -import com.project.imdang.setting.service.domain.valueobject.NotificationCategory; -import com.project.imdang.setting.service.domain.valueobject.NotificationId; +import com.project.imdang.common.domain.entity.AggregateRoot; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.exception.NotificationDomainException; +import com.project.imdang.common.domain.valueobject.NotificationCategory; +import com.project.imdang.common.domain.valueobject.NotificationId; import lombok.Builder; import lombok.Getter; diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/Terms.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/Terms.java similarity index 71% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/Terms.java rename to setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/Terms.java index 09907cf7..5f5a207e 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/Terms.java +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/Terms.java @@ -1,8 +1,8 @@ -package com.project.imdang.setting.service.domain.entity; +package com.project.imdang.setting.domain.entity; -import com.project.imdang.domain.entity.AggregateRoot; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.valueobject.TermsId; +import com.project.imdang.common.domain.entity.AggregateRoot; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.TermsId; import lombok.Builder; import lombok.Getter; diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/TermsAgreement.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/TermsAgreement.java similarity index 71% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/TermsAgreement.java rename to setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/TermsAgreement.java index 3e14e9ec..352429ea 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/entity/TermsAgreement.java +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/entity/TermsAgreement.java @@ -1,9 +1,9 @@ -package com.project.imdang.setting.service.domain.entity; +package com.project.imdang.setting.domain.entity; -import com.project.imdang.domain.entity.BaseEntity; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.valueobject.TermsAgreementId; -import com.project.imdang.setting.service.domain.valueobject.TermsId; +import com.project.imdang.common.domain.entity.BaseEntity; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.TermsAgreementId; +import com.project.imdang.common.domain.valueobject.TermsId; import lombok.Builder; import lombok.Getter; diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/event/NotificationCreatedEvent.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/event/NotificationCreatedEvent.java similarity index 65% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/event/NotificationCreatedEvent.java rename to setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/event/NotificationCreatedEvent.java index 43f26acf..998af6d7 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/event/NotificationCreatedEvent.java +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/event/NotificationCreatedEvent.java @@ -1,7 +1,7 @@ -package com.project.imdang.setting.service.domain.event; +package com.project.imdang.setting.domain.event; -import com.project.imdang.setting.service.domain.entity.Notification; +import com.project.imdang.setting.domain.entity.Notification; import java.time.ZonedDateTime; diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/event/NotificationEvent.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/event/NotificationEvent.java new file mode 100644 index 00000000..ffcee8c5 --- /dev/null +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/event/NotificationEvent.java @@ -0,0 +1,15 @@ +package com.project.imdang.setting.domain.event; + +import com.project.imdang.common.domain.event.DomainEventMessage; +import com.project.imdang.setting.domain.entity.Notification; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.time.ZonedDateTime; + +@Getter +@RequiredArgsConstructor +public abstract class NotificationEvent implements DomainEventMessage { + private final Notification notification; + private final ZonedDateTime createdAt; +} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/exception/NotificationDomainException.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/exception/NotificationDomainException.java similarity index 69% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/exception/NotificationDomainException.java rename to setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/exception/NotificationDomainException.java index 7b3acb23..7bd81b0a 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/exception/NotificationDomainException.java +++ b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/domain/exception/NotificationDomainException.java @@ -1,6 +1,6 @@ -package com.project.imdang.setting.service.domain.exception; +package com.project.imdang.setting.domain.exception; -import com.project.imdang.domain.exception.DomainException; +import com.project.imdang.common.domain.exception.DomainException; public class NotificationDomainException extends DomainException { diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/NotificationDomainService.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/NotificationDomainService.java deleted file mode 100644 index 41f3e4e0..00000000 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/NotificationDomainService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.setting.service.domain; - -import com.project.imdang.setting.service.domain.entity.Notification; -import com.project.imdang.setting.service.domain.event.NotificationCreatedEvent; - -public interface NotificationDomainService { - NotificationCreatedEvent createNotification(Notification notification); - void updateNotificationAsChecked(Notification notification); -} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/TermsDomainService.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/TermsDomainService.java deleted file mode 100644 index 360444c1..00000000 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/TermsDomainService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.setting.service.domain; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.entity.Terms; -import com.project.imdang.setting.service.domain.entity.TermsAgreement; - -public interface TermsDomainService { - TermsAgreement agreeTerms(Terms terms, MemberId memberId); -} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/event/NotificationEvent.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/event/NotificationEvent.java deleted file mode 100644 index 4b7b5446..00000000 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/event/NotificationEvent.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.project.imdang.setting.service.domain.event; - -import com.project.imdang.domain.event.DomainEvent; -import com.project.imdang.setting.service.domain.entity.Notification; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.time.ZonedDateTime; - -@Getter -@RequiredArgsConstructor -public abstract class NotificationEvent implements DomainEvent { - private final Notification notification; - private final ZonedDateTime createdAt; -} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/MemberInfo.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/MemberInfo.java deleted file mode 100644 index 43863d66..00000000 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/MemberInfo.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.project.imdang.setting.service.domain.valueobject; - -import com.project.imdang.domain.valueobject.MemberId; -import lombok.Builder; - -@Builder -public record MemberInfo(MemberId memberId, - String deviceToken, - String nickname) { -} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/NotificationCategory.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/NotificationCategory.java deleted file mode 100644 index 8982d318..00000000 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/NotificationCategory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.project.imdang.setting.service.domain.valueobject; - -import com.project.imdang.setting.service.domain.exception.NotificationDomainException; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -@Getter -@AllArgsConstructor -public enum NotificationCategory { - // 다른 사람이 나에게 인사이트 교환을 요청했을 경우 - REQUESTED("교환 요청", "ExchangeRequestCreatedEvent","누군가가 내 인사이트에 교환을 요청했어요\uD83E\uDD13 지금 눌러서 확인하기.", - "%s님이 인사이트 교환을 요청했어요.\n인사이트 확인 후 수락 및 거절을 선택해주세요."), - // 내가 교환을 요청했을 때 상대방이 수락하는 경우 - ACCEPTED("교환 수락", "ExchangeRequestAcceptedEvent","요청하신 인사이트 교환이 수락됐어요\uD83E\uDD73 지금 눌러서 확인하기.", - "%s님이 인사이트 교환을 수락했어요.\n교환한 인사이트를 보관함에서 확인해보세요."), - // 내가 교환을 요청했을 때 상대방이 거절하는 경우 - REJECTED("교환 거절", "ExchangeRequestRejectedEvent", "요청하신 인사이트 교환이 거절됐어요\uD83D\uDE22 지금 눌러서 확인하기.", - "%s님이 인사이트 교환을 거절했어요."), - - REQUESTED_BY_COUPON("교환 요청", "ExchangeRequestByCouponCreatedEvent","누군가가 내 인사이트에 교환을 요청했어요\uD83E\uDD13 지금 눌러서 확인하기.", - "%s님이 패스권을 사용하여 인사이트 교환을 요청했어요.\n인사이트 확인 후 수락 및 거절을 선택해주세요."); - - private final String title; - private final String type; - private final String pushNotificationContent; - private final String notificationContent; - - public static NotificationCategory getType(String type) { - return Arrays.stream(NotificationCategory.values()) - .filter(t -> t.getType().equals(type)) - .findFirst() - .orElseThrow(() -> new NotificationDomainException("Not exist NotificationType")); - } -} \ No newline at end of file diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/TermsId.java b/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/TermsId.java deleted file mode 100644 index 97e72c8d..00000000 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/valueobject/TermsId.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.project.imdang.setting.service.domain.valueobject; - -import com.project.imdang.domain.valueobject.BaseId; - -public class TermsId extends BaseId { - public TermsId(Long value) { - super(value); - } -} diff --git a/setting-service/setting-domain/setting-domain-core/src/main/resources/application.properties b/setting-service/setting-domain/setting-domain-core/src/main/resources/application.properties deleted file mode 100644 index d81eb493..00000000 --- a/setting-service/setting-domain/setting-domain-core/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=setting-domain-core diff --git a/setting-service/setting-persistence/build.gradle b/setting-service/setting-persistence/build.gradle index c049d055..f544edc9 100644 --- a/setting-service/setting-persistence/build.gradle +++ b/setting-service/setting-persistence/build.gradle @@ -1,6 +1,18 @@ -bootJar { - enabled = false -} -jar { - enabled = true +dependencies { + implementation project(':setting-service:setting-domain:setting-application-service') + implementation project(':setting-service:setting-domain:setting-domain-core') + implementation project(':common:common-domain:common-domain-core') + + implementation project(':member-service:member-service-client:member-service-client-api') + implementation project(':member-service:member-service-client:member-service-client-api-impl') + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + runtimeOnly 'com.mysql:mysql-connector-j' + + implementation 'org.springframework.retry:spring-retry' + implementation 'org.springframework:spring-aspects' + + implementation 'com.google.firebase:firebase-admin:9.2.0' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.0' } diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/NotificationRepositoryImpl.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/NotificationRepositoryImpl.java similarity index 75% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/NotificationRepositoryImpl.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/NotificationRepositoryImpl.java index e7fc1795..ede5505d 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/NotificationRepositoryImpl.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/NotificationRepositoryImpl.java @@ -1,11 +1,11 @@ -package com.project.imdang.setting.service.persistence.adapter; +package com.project.imdang.setting.persistence.adapter; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.entity.Notification; -import com.project.imdang.setting.service.domain.ports.output.repository.NotificationRepository; -import com.project.imdang.setting.service.persistence.entity.NotificationEntity; -import com.project.imdang.setting.service.persistence.mapper.NotificationPersistenceMapper; -import com.project.imdang.setting.service.persistence.repository.NotificationJpaRepository; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.entity.Notification; +import com.project.imdang.setting.domain.ports.output.repository.NotificationRepository; +import com.project.imdang.setting.persistence.repository.NotificationJpaRepository; +import com.project.imdang.setting.persistence.entity.NotificationEntity; +import com.project.imdang.setting.persistence.mapper.NotificationPersistenceMapper; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/TermsAgreementRepositoryImpl.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/TermsAgreementRepositoryImpl.java similarity index 60% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/TermsAgreementRepositoryImpl.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/TermsAgreementRepositoryImpl.java index 05bc5e35..f6601f63 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/TermsAgreementRepositoryImpl.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/TermsAgreementRepositoryImpl.java @@ -1,10 +1,10 @@ -package com.project.imdang.setting.service.persistence.adapter; +package com.project.imdang.setting.persistence.adapter; -import com.project.imdang.setting.service.domain.entity.TermsAgreement; -import com.project.imdang.setting.service.domain.ports.output.repository.TermsAgreementRepository; -import com.project.imdang.setting.service.persistence.entity.TermsAgreementEntity; -import com.project.imdang.setting.service.persistence.mapper.TermsAgreementPersistenceMapper; -import com.project.imdang.setting.service.persistence.repository.TermsAgreementJpaRepository; +import com.project.imdang.setting.domain.entity.TermsAgreement; +import com.project.imdang.setting.domain.ports.output.repository.TermsAgreementRepository; +import com.project.imdang.setting.persistence.repository.TermsAgreementJpaRepository; +import com.project.imdang.setting.persistence.entity.TermsAgreementEntity; +import com.project.imdang.setting.persistence.mapper.TermsAgreementPersistenceMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/TermsRepositoryImpl.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/TermsRepositoryImpl.java similarity index 60% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/TermsRepositoryImpl.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/TermsRepositoryImpl.java index 58781e3a..86228879 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/TermsRepositoryImpl.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/adapter/TermsRepositoryImpl.java @@ -1,15 +1,16 @@ -package com.project.imdang.setting.service.persistence.adapter; +package com.project.imdang.setting.persistence.adapter; -import com.project.imdang.domain.valueobject.BaseId; -import com.project.imdang.setting.service.domain.entity.Terms; -import com.project.imdang.setting.service.domain.ports.output.repository.TermsRepository; -import com.project.imdang.setting.service.domain.valueobject.TermsId; -import com.project.imdang.setting.service.persistence.mapper.TermsPersistenceMapper; -import com.project.imdang.setting.service.persistence.repository.TermsJpaRepository; +import com.project.imdang.common.domain.valueobject.BaseId; +import com.project.imdang.common.domain.valueobject.TermsId; +import com.project.imdang.setting.domain.entity.Terms; +import com.project.imdang.setting.domain.ports.output.repository.TermsRepository; +import com.project.imdang.setting.persistence.mapper.TermsPersistenceMapper; +import com.project.imdang.setting.persistence.repository.TermsJpaRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; @RequiredArgsConstructor @@ -27,7 +28,7 @@ public List findAll() { } @Override - public List findAllByIds(List termsIds) { + public List findAllByIds(Set termsIds) { List ids = termsIds.stream() .map(BaseId::getValue).toList(); return termsJpaRepository.findAllById(ids).stream() diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/configuration/FcmConfiguration.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/configuration/FcmConfiguration.java new file mode 100644 index 00000000..a824d27b --- /dev/null +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/configuration/FcmConfiguration.java @@ -0,0 +1,46 @@ +package com.project.imdang.setting.persistence.configuration; + +import com.google.firebase.FirebaseApp; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Slf4j +@Configuration +public class FcmConfiguration { + + @Value("${firebase.config.path}") + private String firebaseConfigPath; + + @Bean + public FirebaseApp firebaseApp() { + return null; +// try { +// InputStream serviceAccount = new ClassPathResource(firebaseConfigPath).getInputStream(); +// +// FirebaseOptions options = FirebaseOptions.builder() +// .setCredentials(GoogleCredentials.fromStream(serviceAccount)) +// .build(); +// log.info("Initialize Firebase Admin SDK complete"); +// return FirebaseApp.initializeApp(options); +// } catch (FileNotFoundException e) { +// throw new IllegalStateException(); +// } catch (IOException e) { +// throw new FirebaseException("Failed initialize Firebase Admin SDK"); +// } + } + +// @Bean +// public FirebaseMessaging firebaseMessaging() { +// try { +// return FirebaseMessaging.getInstance(firebaseApp()); +// } catch (IllegalStateException e) { +// throw new FirebaseException("Failed initialize FirebaseApp" + e.getMessage()); +// } catch (NullPointerException e) { +// throw new FirebaseException("Failed load FirebaseApp" + e.getMessage()); +// } catch (Exception e) { +// throw new IllegalArgumentException("Failed read FirebaseConfigPath" + e.getMessage()); +// } +// } +} diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/NotificationEntity.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/NotificationEntity.java similarity index 88% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/NotificationEntity.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/NotificationEntity.java index dbef3ba8..855d4b6c 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/NotificationEntity.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/NotificationEntity.java @@ -1,6 +1,6 @@ -package com.project.imdang.setting.service.persistence.entity; +package com.project.imdang.setting.persistence.entity; -import com.project.imdang.setting.service.domain.valueobject.NotificationCategory; +import com.project.imdang.common.domain.valueobject.NotificationCategory; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/TermsAgreementEntity.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/TermsAgreementEntity.java similarity index 93% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/TermsAgreementEntity.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/TermsAgreementEntity.java index f95d44b2..0e500f8f 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/TermsAgreementEntity.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/TermsAgreementEntity.java @@ -1,4 +1,4 @@ -package com.project.imdang.setting.service.persistence.entity; +package com.project.imdang.setting.persistence.entity; import jakarta.persistence.Column; import jakarta.persistence.Entity; diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/TermsEntity.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/TermsEntity.java similarity index 91% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/TermsEntity.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/TermsEntity.java index 2ef07d31..963c4271 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/entity/TermsEntity.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/entity/TermsEntity.java @@ -1,4 +1,4 @@ -package com.project.imdang.setting.service.persistence.entity; +package com.project.imdang.setting.persistence.entity; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/exception/FirebaseException.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/exception/FirebaseException.java similarity index 56% rename from setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/exception/FirebaseException.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/exception/FirebaseException.java index 1be41b4c..0ea3df50 100644 --- a/setting-service/setting-domain/setting-domain-core/src/main/java/com/project/imdang/setting/service/domain/exception/FirebaseException.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/exception/FirebaseException.java @@ -1,6 +1,7 @@ -package com.project.imdang.setting.service.domain.exception; +package com.project.imdang.setting.persistence.exception; -public class FirebaseException extends NotificationDomainException{ +// TODO - 예외 처리 +public class FirebaseException extends RuntimeException { public FirebaseException(String message) { super(message); } diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/fcm/FcmNotificationSender.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/fcm/FcmNotificationSender.java new file mode 100644 index 00000000..34647c33 --- /dev/null +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/fcm/FcmNotificationSender.java @@ -0,0 +1,74 @@ +package com.project.imdang.setting.persistence.fcm; + +import com.google.firebase.messaging.AndroidConfig; +import com.google.firebase.messaging.AndroidNotification; +import com.google.firebase.messaging.FirebaseMessaging; +import com.google.firebase.messaging.FirebaseMessagingException; +import com.google.firebase.messaging.Message; +import com.google.firebase.messaging.Notification; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.member.domain.client.MemberData; +import com.project.imdang.member.domain.client.MemberDataResolver; +import com.project.imdang.member.domain.client.exception.MemberNotFoundException; +import com.project.imdang.setting.domain.ports.output.sender.NotificationRequest; +import com.project.imdang.setting.domain.ports.output.sender.NotificationSender; +import lombok.RequiredArgsConstructor; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Component; + +import java.time.ZonedDateTime; + +@RequiredArgsConstructor +@Component +public class FcmNotificationSender implements NotificationSender { + + private final FirebaseMessaging firebaseMessaging; + private final MemberDataResolver memberResolver; + + @Retryable( + retryFor = FirebaseMessagingException.class, + maxAttempts = 3, + backoff = @Backoff(delay = 1000)) + @Override + public void send(NotificationRequest notificationRequest) { + + final MemberId receiverId = new MemberId(notificationRequest.getReceiverId()); + final String title = notificationRequest.getTitle(); + final String body = notificationRequest.getBody(); + Notification notification = Notification.builder() + .setTitle(title) + .setBody(body) + .build(); + + MemberData memberData = memberResolver.resolve(receiverId) + .orElseThrow(() -> new MemberNotFoundException(receiverId)); + + // TODO - CHECK : Android Configuration + AndroidConfig androidConfig = getAndroidConfig(title, body); + // TODO - CHECK : APNs Configuration + + Message message = Message.builder() + .setToken(memberData.getDeviceToken()) + .setNotification(notification) + .putData("time", ZonedDateTime.now().toString()) + .setAndroidConfig(androidConfig) + .build(); + try { + firebaseMessaging.send(message); + } catch (FirebaseMessagingException e) { + // TODO - 예외 처리 + throw new RuntimeException(e); + } + } + + private AndroidConfig getAndroidConfig(String title, String body) { + return AndroidConfig.builder() + .setPriority(AndroidConfig.Priority.HIGH) + .setNotification(AndroidNotification.builder() + .setTitle(title) + .setBody(body) + .build()) + .build(); + } +} diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/NotificationPersistenceMapper.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/NotificationPersistenceMapper.java similarity index 78% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/NotificationPersistenceMapper.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/NotificationPersistenceMapper.java index 7cce5009..14d356e9 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/NotificationPersistenceMapper.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/NotificationPersistenceMapper.java @@ -1,9 +1,9 @@ -package com.project.imdang.setting.service.persistence.mapper; +package com.project.imdang.setting.persistence.mapper; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.entity.Notification; -import com.project.imdang.setting.service.domain.valueobject.NotificationId; -import com.project.imdang.setting.service.persistence.entity.NotificationEntity; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.entity.Notification; +import com.project.imdang.common.domain.valueobject.NotificationId; +import com.project.imdang.setting.persistence.entity.NotificationEntity; import org.springframework.stereotype.Component; @Component diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/TermsAgreementPersistenceMapper.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/TermsAgreementPersistenceMapper.java similarity index 71% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/TermsAgreementPersistenceMapper.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/TermsAgreementPersistenceMapper.java index 968bf9a8..de8e7891 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/TermsAgreementPersistenceMapper.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/TermsAgreementPersistenceMapper.java @@ -1,10 +1,10 @@ -package com.project.imdang.setting.service.persistence.mapper; +package com.project.imdang.setting.persistence.mapper; -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.setting.service.domain.entity.TermsAgreement; -import com.project.imdang.setting.service.domain.valueobject.TermsAgreementId; -import com.project.imdang.setting.service.domain.valueobject.TermsId; -import com.project.imdang.setting.service.persistence.entity.TermsAgreementEntity; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.setting.domain.entity.TermsAgreement; +import com.project.imdang.common.domain.valueobject.TermsAgreementId; +import com.project.imdang.common.domain.valueobject.TermsId; +import com.project.imdang.setting.persistence.entity.TermsAgreementEntity; import org.springframework.stereotype.Component; import java.util.Objects; diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/TermsPersistenceMapper.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/TermsPersistenceMapper.java similarity index 73% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/TermsPersistenceMapper.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/TermsPersistenceMapper.java index 90ea60fa..dc003ba8 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/mapper/TermsPersistenceMapper.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/mapper/TermsPersistenceMapper.java @@ -1,8 +1,8 @@ -package com.project.imdang.setting.service.persistence.mapper; +package com.project.imdang.setting.persistence.mapper; -import com.project.imdang.setting.service.domain.entity.Terms; -import com.project.imdang.setting.service.domain.valueobject.TermsId; -import com.project.imdang.setting.service.persistence.entity.TermsEntity; +import com.project.imdang.setting.domain.entity.Terms; +import com.project.imdang.common.domain.valueobject.TermsId; +import com.project.imdang.setting.persistence.entity.TermsEntity; import org.springframework.stereotype.Component; @Component diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/NotificationJpaRepository.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/NotificationJpaRepository.java similarity index 81% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/NotificationJpaRepository.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/NotificationJpaRepository.java index 96dad3ca..64423325 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/NotificationJpaRepository.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/NotificationJpaRepository.java @@ -1,6 +1,6 @@ -package com.project.imdang.setting.service.persistence.repository; +package com.project.imdang.setting.persistence.repository; -import com.project.imdang.setting.service.persistence.entity.NotificationEntity; +import com.project.imdang.setting.persistence.entity.NotificationEntity; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/TermsAgreementJpaRepository.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/TermsAgreementJpaRepository.java similarity index 60% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/TermsAgreementJpaRepository.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/TermsAgreementJpaRepository.java index 1e293cda..3a271d52 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/TermsAgreementJpaRepository.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/TermsAgreementJpaRepository.java @@ -1,6 +1,6 @@ -package com.project.imdang.setting.service.persistence.repository; +package com.project.imdang.setting.persistence.repository; -import com.project.imdang.setting.service.persistence.entity.TermsAgreementEntity; +import com.project.imdang.setting.persistence.entity.TermsAgreementEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/TermsJpaRepository.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/TermsJpaRepository.java similarity index 59% rename from setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/TermsJpaRepository.java rename to setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/TermsJpaRepository.java index fe26d542..fca47086 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/repository/TermsJpaRepository.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/repository/TermsJpaRepository.java @@ -1,6 +1,6 @@ -package com.project.imdang.setting.service.persistence.repository; +package com.project.imdang.setting.persistence.repository; -import com.project.imdang.setting.service.persistence.entity.TermsEntity; +import com.project.imdang.setting.persistence.entity.TermsEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/SettingMemberLookupImpl.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/SettingMemberLookupImpl.java deleted file mode 100644 index 53fe46c9..00000000 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/service/persistence/adapter/SettingMemberLookupImpl.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.project.imdang.setting.service.persistence.adapter; - -import com.project.imdang.domain.valueobject.MemberId; -import com.project.imdang.feign.MemberFeignClient; -import com.project.imdang.feign.MemberInfoResponse; -import com.project.imdang.setting.service.domain.ports.output.lookup.SettingMemberLookup; -import com.project.imdang.setting.service.domain.valueobject.MemberInfo; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpEntity; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Component; - -import java.util.Optional; -import java.util.UUID; - -@RequiredArgsConstructor -@Component -public class SettingMemberLookupImpl implements SettingMemberLookup { - - private final MemberFeignClient memberFeignClient; - - @Override - public Optional lookupByMemberId(MemberId _memberId) { - UUID memberId = _memberId.getValue(); - try { - ResponseEntity responseEntity = memberFeignClient.getMemberInfo(memberId); - return Optional.ofNullable(responseEntity) - .map(HttpEntity::getBody) - .map(memberInfoResponse -> MemberInfo.builder() - .memberId(new MemberId(memberInfoResponse.getMemberId())) - .deviceToken(memberInfoResponse.getDeviceToken()) - .nickname(memberInfoResponse.getNickname()) - .build()); - } catch (Exception e) { - // TODO - 예외 처리 - throw new RuntimeException(e.getMessage()); - } - } -} diff --git a/setting-service/setting-persistence/src/main/resources/application.properties b/setting-service/setting-persistence/src/main/resources/application.properties deleted file mode 100644 index fcb97a2d..00000000 --- a/setting-service/setting-persistence/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=setting-persistence diff --git a/settings.gradle b/settings.gradle index 2e1458c6..e779ef46 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,9 +5,9 @@ include("imdang-container") include("infrastructure") include("infrastructure:aws") include("infrastructure:aws:s3") -include("infrastructure:event") include("infrastructure:saga") include(':infrastructure:feign') +include(':infrastructure:kafka') include("common") include("common:common-application") @@ -16,8 +16,11 @@ include("common:common-domain:common-application-service") include("common:common-domain:common-domain-core") include("insight-service") -include("insight-service:insight-container") include("insight-service:insight-messaging") +include("insight-service:insight-messaging:listener") +include("insight-service:insight-messaging:publisher") +include("insight-service:insight-messaging:message") + include("insight-service:insight-persistence") include("insight-service:insight-application") include("insight-service:insight-domain") @@ -25,7 +28,14 @@ include("insight-service:insight-domain:insight-application-service") include("insight-service:insight-domain:insight-domain-core") include("member-service") -include("member-service:member-container") +include("member-service:member-service-client") +include("member-service:member-service-client:member-service-client-api") +include("member-service:member-service-client:member-service-client-api-impl") + +include("member-service:member-messaging") +include("member-service:member-messaging:listener") +include("member-service:member-messaging:publisher") +include("member-service:member-messaging:message") include("member-service:member-persistence") include("member-service:member-application") include("member-service:member-domain") @@ -33,7 +43,6 @@ include("member-service:member-domain:member-application-service") include("member-service:member-domain:member-domain-core") include("setting-service") -include("setting-service:setting-container") include("setting-service:setting-persistence") include("setting-service:setting-application") include("setting-service:setting-domain") diff --git a/test.puml b/test.puml new file mode 100644 index 00000000..0c4589ea --- /dev/null +++ b/test.puml @@ -0,0 +1,10 @@ +@startuml +'https://plantuml.com/sequence-diagram + + +Alice -> Bob: Authentication Request +Bob --> Alice: Authentication Response + +Alice -> Bob: Another authentication Request +Alice <-- Bob: another authentication Response +@enduml From c833506233ebfab672a2d8ebb73e882663d1906f Mon Sep 17 00:00:00 2001 From: "DESKTOP-0N7JBUG\\user" Date: Sun, 18 May 2025 23:56:43 +0900 Subject: [PATCH 2/4] temp --- imdang-container/build.gradle | 6 ++++++ .../domain/client/MemberInfoResolverImpl.java | 18 ++++++++++-------- .../persistence/fcm/FcmNotificationSender.java | 14 +++++++------- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/imdang-container/build.gradle b/imdang-container/build.gradle index 98ac0806..bfe64364 100644 --- a/imdang-container/build.gradle +++ b/imdang-container/build.gradle @@ -16,11 +16,17 @@ dependencies { implementation project(':insight-service:insight-persistence') implementation project(':insight-service:insight-domain:insight-application-service') implementation project(':insight-service:insight-domain:insight-domain-core') + implementation project(':insight-service:insight-messaging:listener') + implementation project(':insight-service:insight-messaging:message') + implementation project(':insight-service:insight-messaging:publisher') implementation project(':member-service:member-application') implementation project(':member-service:member-persistence') implementation project(':member-service:member-domain:member-application-service') implementation project(':member-service:member-domain:member-domain-core') + implementation project(':member-service:member-messaging:listener') + implementation project(':member-service:member-messaging:message') + implementation project(':member-service:member-messaging:publisher') implementation project(':setting-service:setting-application') implementation project(':setting-service:setting-persistence') diff --git a/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java index 70f0391f..e44bf99e 100644 --- a/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java +++ b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java @@ -13,20 +13,22 @@ @Component public class MemberInfoResolverImpl implements MemberDataResolver { - private final MemberFeignClient memberFeignClient; +// private final MemberFeignClient memberFeignClient; @Override public Optional resolve(MemberId memberId) { - UUID id = memberId.getValue(); - MemberData memberData = memberFeignClient.getMemberData(id).getBody(); - return Optional.ofNullable(memberData); + return Optional.empty(); +// UUID id = memberId.getValue(); +// MemberData memberData = memberFeignClient.getMemberData(id).getBody(); +// return Optional.ofNullable(memberData); } @Override public List resolve(List memberIds) { - List ids = memberIds.stream() - .map(BaseId::getValue) - .toList(); - return memberFeignClient.listMemberData(ids).getBody(); + return null; +// List ids = memberIds.stream() +// .map(BaseId::getValue) +// .toList(); +// return memberFeignClient.listMemberData(ids).getBody(); } } diff --git a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/fcm/FcmNotificationSender.java b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/fcm/FcmNotificationSender.java index 34647c33..c195b58a 100644 --- a/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/fcm/FcmNotificationSender.java +++ b/setting-service/setting-persistence/src/main/java/com/project/imdang/setting/persistence/fcm/FcmNotificationSender.java @@ -23,7 +23,7 @@ @Component public class FcmNotificationSender implements NotificationSender { - private final FirebaseMessaging firebaseMessaging; +// private final FirebaseMessaging firebaseMessaging; private final MemberDataResolver memberResolver; @Retryable( @@ -54,12 +54,12 @@ public void send(NotificationRequest notificationRequest) { .putData("time", ZonedDateTime.now().toString()) .setAndroidConfig(androidConfig) .build(); - try { - firebaseMessaging.send(message); - } catch (FirebaseMessagingException e) { - // TODO - 예외 처리 - throw new RuntimeException(e); - } +// try { +// firebaseMessaging.send(message); +// } catch (FirebaseMessagingException e) { +// // TODO - 예외 처리 +// throw new RuntimeException(e); +// } } private AndroidConfig getAndroidConfig(String title, String body) { From 721024309add1b445e7d80d748638d59d66cf0ce Mon Sep 17 00:00:00 2001 From: heoj10272 Date: Mon, 16 Jun 2025 17:02:05 +0900 Subject: [PATCH 3/4] =?UTF-8?q?EZTX-21:=20=EC=9D=B8=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EA=B2=80=ED=86=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/project/imdang/jwt/JwtAuthFilter.java | 4 +- .../src/main/resources/imdang_test.sql | 152 +++++++++++++++++ .../src/main/resources/logback.xml | 18 --- .../imdang/insight/InsightControllerTest.java | 27 +++- .../com/project/imdang/insight/TestData.java | 56 ++++++- .../src/test/resources/imdang_test.sql | 153 ++++++++++++++++++ .../dto/insight/CreateInsightRequest.java | 6 +- .../mapper/InsightRequestResolver.java | 8 +- .../application/rest/InsightController.java | 54 ++++++- .../insight/create/CreateInsightCommand.java | 5 +- .../insight/detail/InsightDetailResult.java | 3 +- .../dto/insight/list/InsightResult.java | 3 +- .../insight/update/UpdateInsightCommand.java | 3 +- .../insight/CreateInsightCommandHandler.java | 24 +-- .../insight/UpdateInsightCommandHandler.java | 17 +- .../insight/domain/helper/InsightHelper.java | 7 +- .../domain/mapper/InsightDataMapper.java | 7 +- .../repository/InsightImageRepository.java | 30 ++++ .../insight/domain/InsightDomainService.java | 5 +- .../domain/InsightDomainServiceImpl.java | 15 +- .../imdang/insight/domain/entity/Insight.java | 38 +++-- .../insight/domain/entity/InsightImage.java | 36 +++++ .../adapter/InsightImageRepositoryImpl.java | 104 ++++++++++++ .../persistence/entity/InsightEntity.java | 5 +- .../entity/InsightImageEntity.java | 41 +++++ .../mapper/InsightImagePersistenceMapper.java | 48 ++++++ .../mapper/InsightPersistenceMapper.java | 4 - .../repository/InsightImageJpaRepository.java | 28 ++++ .../ports/output/provider/TokenProvider.java | 2 + 29 files changed, 809 insertions(+), 94 deletions(-) create mode 100644 imdang-container/src/main/resources/imdang_test.sql create mode 100644 imdang-container/src/test/resources/imdang_test.sql create mode 100644 insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightImageRepository.java create mode 100644 insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/InsightImage.java create mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightImageRepositoryImpl.java create mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightImageEntity.java create mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightImagePersistenceMapper.java create mode 100644 insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightImageJpaRepository.java diff --git a/imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthFilter.java b/imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthFilter.java index 38a230be..89ff82d9 100644 --- a/imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthFilter.java +++ b/imdang-container/src/main/java/com/project/imdang/jwt/JwtAuthFilter.java @@ -51,8 +51,8 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse try { if (StringUtils.hasText(token) && tokenProvider.verifyToken(token)) { // 3-1. 토큰 파싱해서 사용자 정보 가져오기 - String memberId = null; -// String memberId = tokenProvider.extractSubject(token); +// String memberId = null; + String memberId = tokenProvider.extractSubject(token); // 3-2. MemberId로 Authentication 정보 생성 Authentication auth = new UsernamePasswordAuthenticationToken(UUID.fromString(memberId), "", Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER"))); diff --git a/imdang-container/src/main/resources/imdang_test.sql b/imdang-container/src/main/resources/imdang_test.sql new file mode 100644 index 00000000..871e995a --- /dev/null +++ b/imdang-container/src/main/resources/imdang_test.sql @@ -0,0 +1,152 @@ +-- -------------------------------------------------------- +-- 호스트: 127.0.0.1 +-- 서버 버전: 8.0.31 - MySQL Community Server - GPL +-- 서버 OS: Win64 +-- HeidiSQL 버전: 12.5.0.6677 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- 테이블 imdang.district 구조 내보내기 +CREATE TABLE IF NOT EXISTS `district` ( + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `si_do` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `si_gun_gu` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `eup_myeon_dong` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `li` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `rank` int DEFAULT NULL, + `created_at` date DEFAULT NULL, + `deleted_at` date DEFAULT NULL, + `ex_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.insight 구조 내보내기 +CREATE TABLE IF NOT EXISTS `insight_test` ( + `view_count` int unsigned NOT NULL, + `visit_at` date NOT NULL, + `created_at` datetime(6) NOT NULL, + `id` char(36) COLLATE utf8mb4_general_ci NOT NULL, + `member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `address_building_number` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `address_detail` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `address_eup_myeon_dong` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `address_road_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `address_si_do` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `address_si_gun_gu` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `complex_environment` json NOT NULL, + `complex_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, +# `favorable_news` json NOT NULL, + `infra` json NOT NULL, + `summary` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `visit_methods` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `visit_times` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `access` enum('자유로움','제한됨','허락시_가능') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `address_latitude` double DEFAULT NULL, + `address_longitude` double DEFAULT NULL, + `is_deleted` bit(1) NOT NULL, + PRIMARY KEY (`id`), + KEY `fk_insight_member_1` (`member_id`), + CONSTRAINT `fk_insight_member_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE TABLE IF NOT EXISTS `insight_image` ( + `insight_id` char(36) NOT NULL, + `type` int NOT NULL, + `sort_num` int NOT NULL, + `image` varchar(255) NOT NULL, + `created_at` datetime(6) NOT NULL, + CONSTRAINT `pk_insight_image` PRIMARY KEY (`image`), + CONSTRAINT `fk_insight_image_insight_1` FOREIGN KEY (`insight_id`) REFERENCES insight_test (id) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.member 구조 내보내기 +CREATE TABLE IF NOT EXISTS `member` ( + `id` char(36) COLLATE utf8mb4_general_ci NOT NULL, + `auth_id` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, + `auth_type` enum('APPLE','GOOGLE','KAKAO','MOCK') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `birth_date` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `device_token` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `exchange_count` int unsigned NOT NULL, + `gender` tinyint DEFAULT NULL, + `insight_count` int unsigned NOT NULL, + `is_deleted` bit(1) DEFAULT NULL, + `is_login` bit(1) DEFAULT NULL, + `nickname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `refresh_token` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `accused_count` int unsigned NOT NULL, + `penalty_from` date DEFAULT NULL, + `penalty_to` date DEFAULT NULL, + `rejected_count` int unsigned NOT NULL, + `status` enum('ACTIVE','EXCHANGE_RESTRICTED','PERMANENT_BANNED','TEMPORARY_BANNED') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_member_1` (`nickname`), + UNIQUE KEY `unique_member_2` (`auth_id`,`auth_type`,`is_deleted`), + CONSTRAINT `member_chk_1` CHECK ((`gender` between 0 and 1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.notification 구조 내보내기 +CREATE TABLE IF NOT EXISTS `notification` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `category` enum('ACCEPTED','REJECTED','REQUESTED') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `checked_at` datetime(6) DEFAULT NULL, + `created_at` datetime(6) NOT NULL, + `is_checked` bit(1) NOT NULL, + `message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `receiver_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + KEY `fk_notification_member_1` (`receiver_id`), + CONSTRAINT `fk_notification_member_1` FOREIGN KEY (`receiver_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.recommend 구조 내보내기 +CREATE TABLE IF NOT EXISTS `recommend` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime(6) NOT NULL, + `recommend_member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `recommended_insight_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `recommended_member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_recommend_1` (`recommend_member_id`,`recommended_insight_id`), + KEY `fk_recommend_insight` (`recommended_insight_id`), + KEY `fk_recommend_member_2` (`recommended_member_id`), + CONSTRAINT `fk_recommend_insight` FOREIGN KEY (`recommended_insight_id`) REFERENCES `insight` (`id`) ON DELETE RESTRICT, + CONSTRAINT `fk_recommend_member_1` FOREIGN KEY (`recommend_member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT, + CONSTRAINT `fk_recommend_member_2` FOREIGN KEY (`recommended_member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.terms 구조 내보내기 +CREATE TABLE IF NOT EXISTS `terms` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `is_essential` bit(1) NOT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.terms_agreement 구조 내보내기 +CREATE TABLE IF NOT EXISTS `terms_agreement` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime(6) NOT NULL, + `member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `terms_id` bigint NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_terms_agreement_1` (`member_id`,`terms_id`), + KEY `fk_terms_agreement_terms_1` (`terms_id`), + CONSTRAINT `fk_terms_agreement_member_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT, + CONSTRAINT `fk_terms_agreement_terms_1` FOREIGN KEY (`terms_id`) REFERENCES `terms` (`id`) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */; +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */; diff --git a/imdang-container/src/main/resources/logback.xml b/imdang-container/src/main/resources/logback.xml index 3ae4192f..3f54eaea 100644 --- a/imdang-container/src/main/resources/logback.xml +++ b/imdang-container/src/main/resources/logback.xml @@ -2,16 +2,6 @@ - - - ${DISCORD_WEBHOOK_URL} - - %d{HH:mm:ss} [%thread] [%-5level] %logger{36} - %msg%n - - log - false - - ${CONSOLE_LOG_PATTERN} @@ -19,15 +9,7 @@ - - - - ERROR - - - - diff --git a/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java b/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java index 7d1399de..595548a2 100644 --- a/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java +++ b/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java @@ -1,6 +1,7 @@ package com.project.imdang.insight; import com.fasterxml.jackson.databind.ObjectMapper; +import com.project.imdang.insight.application.dto.insight.CreateInsightRequest; import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; @@ -17,10 +18,12 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.mock.web.MockMultipartFile; +import org.springframework.test.context.jdbc.Sql; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import java.nio.charset.StandardCharsets; +import java.util.List; import java.util.UUID; import static org.hamcrest.core.IsNull.notNullValue; @@ -32,7 +35,8 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @AutoConfigureMockMvc -@SpringBootTest(classes = TestConfiguration.class) +@SpringBootTest +@Sql(scripts = "/imdang_test.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) class InsightControllerTest { @Autowired @@ -97,18 +101,25 @@ void detail() throws Exception { void createInsight() throws Exception { // given - CreateInsightCommand createInsightCommand = new TestData().createInsightCommand(); - String valueAsString = objectMapper.writeValueAsString(createInsightCommand); +// CreateInsightCommand createInsightCommand = new TestData().createInsightCommand(); + CreateInsightRequest createInsightrequest = new TestData().createInsightRequest(); + String valueAsString = objectMapper.writeValueAsString(createInsightrequest); byte[] bytes = "content".getBytes(); - MockMultipartFile mainImage = new MockMultipartFile("mainImage", "", "text/plain", bytes); +// MockMultipartFile mainImage = new MockMultipartFile("mainImages", "mainImage.png", "image/png", bytes); + List mainImages = List.of( + new MockMultipartFile("mainImages", "img1.png", "image/png", "img1".getBytes()), + new MockMultipartFile("mainImages", "img2.png", "image/png", "img2".getBytes()) + ); // when // then mockMvc.perform(MockMvcRequestBuilders.multipart("/insights/create") - .file(mainImage) - .file(new MockMultipartFile("createInsightCommand", "", "application/json", valueAsString.getBytes(StandardCharsets.UTF_8))) + .file(mainImages.get(0)) + .file(mainImages.get(1)) + .file(new MockMultipartFile( + "createInsightRequest", "createInsightRequest.json", "application/json", valueAsString.getBytes(StandardCharsets.UTF_8))) .header("Authorization", "Bearer " + memberToken)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.insightId", notNullValue())); + .andExpect(status().isOk()); +// .andExpect(jsonPath("$.insightId", notNullValue())); } @Test diff --git a/imdang-container/src/test/java/com/project/imdang/insight/TestData.java b/imdang-container/src/test/java/com/project/imdang/insight/TestData.java index d764f5c0..155bf9f0 100644 --- a/imdang-container/src/test/java/com/project/imdang/insight/TestData.java +++ b/imdang-container/src/test/java/com/project/imdang/insight/TestData.java @@ -10,6 +10,7 @@ import com.project.imdang.common.domain.valueobject.ObjectiveItem; import com.project.imdang.common.domain.valueobject.VisitMethod; import com.project.imdang.common.domain.valueobject.VisitTime; +import com.project.imdang.insight.application.dto.insight.*; import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; @@ -23,7 +24,8 @@ public class TestData { - public final static UUID memberId = UUID.fromString("3eff967b-84b8-4ec4-941b-ef3f0a26c0b9"); +// public final static UUID memberId = UUID.fromString("3eff967b-84b8-4ec4-941b-ef3f0a26c0b9"); + public final static UUID memberId = UUID.fromString("01637237-636f-42b3-b268-03366d28b0ea"); private InsightId insightId; public TestData() {} @@ -37,7 +39,6 @@ CreateInsightCommand createInsightCommand() { // MockMultipartFile mainImage = new MockMultipartFile("mainImage-1", bytes); return CreateInsightCommand.builder() .memberId(new MemberId(memberId)) - .score(80) // .mainImage(mainImage) .title("title-1") .address(TestData.address) @@ -52,6 +53,25 @@ CreateInsightCommand createInsightCommand() { .build(); } + CreateInsightRequest createInsightRequest() { +// byte[] bytes = "content".getBytes(); +// MockMultipartFile mainImage = new MockMultipartFile("mainImage-1", bytes); + return CreateInsightRequest.builder() + .score(80) +// .mainImage(mainImage) + .title("title-1") + .address(TestData.addressDTO) + .apartmentComplex(TestData.apartmentComplexDTO) + .visitAt(LocalDate.now().minusDays(14)) + .visitTimes(Set.of(VisitTime.아침)) + .visitMethods(Set.of(VisitMethod.대중교통)) + .summary("지하철역과 도보 10분 거리로 접근성이 좋지만, 근처 공사로 소음 문제가 있을 수 있을 것 같아요. 지하철역과 도보 10분 거리로 접근성이 좋지만, 근처 공사로 소음 문제가 있을 수 있을 것 같아요. 하지만 단지 내 공원이 잘 조성되어 있어 가족 단위 거주자에게 적합할 것 같아요.") + .access(Access.허락시_가능) + .infra(TestData.infraDTO) + .complexEnvironment(TestData.complexEnvironmentDTO) + .build(); + } + UpdateInsightCommand updateInsightCommand() { Assert.notNull(insightId, "InsightId must not be null!"); return UpdateInsightCommand.builder() @@ -99,10 +119,26 @@ AccuseInsightCommand accuseInsightCommand() { .eupMyeonDong("신논현동") .buildingNumber("1") .build(); + + static AddressDTO addressDTO = new AddressDTO( + "서울특별시", + "종로구", + "효제동", + "율곡로", + "191", + "101동 202호", + 12.345678, + 123.45678 + ); + static ApartmentComplex apartmentComplex = ApartmentComplex.builder() .name("신논현 더 센트럴 푸르지오") .build(); + static ApartmentComplexDTO apartmentComplexDTO = new ApartmentComplexDTO( + "신논현 더 센트럴 푸르지오" + ); + static Infra infra = Infra.builder() .transportations(Set.of(Infra.Transportation.버스_정류장_주변, Infra.Transportation.주차_편리)) .schoolDistricts(Set.of(Infra.SchoolDistrict.고등학교)) @@ -112,6 +148,15 @@ AccuseInsightCommand accuseInsightCommand() { .text("infra_text") .build(); + static InfraDTO infraDTO = new InfraDTO( + Set.of(Infra.Transportation.버스_정류장_주변, Infra.Transportation.주차_편리), + Set.of(Infra.SchoolDistrict.고등학교), + Set.of(Infra.Amenity.병원), + Set.of(Infra.Facility.도서관,Infra.Facility.수영장), + Set.of(Infra.Surroundings.강,Infra.Surroundings.교회), + "infra_text" + ); + static ComplexEnvironment complexEnvironment = ComplexEnvironment.builder() .buildingCondition(ObjectiveItem.좋아요) .security(ObjectiveItem.평범해요) @@ -119,6 +164,13 @@ AccuseInsightCommand accuseInsightCommand() { .text("complex_environment_text") .build(); + public static final ComplexEnvironmentDTO complexEnvironmentDTO = new ComplexEnvironmentDTO( + ObjectiveItem.좋아요, + ObjectiveItem.평범해요, + ObjectiveItem.최고예요, + "complex_environment_text" + ); + static Infra updatedInfra = Infra.builder() .transportations(Set.of(Infra.Transportation.해당_없음)) .schoolDistricts(Set.of(Infra.SchoolDistrict.어린이집, Infra.SchoolDistrict.초품아)) diff --git a/imdang-container/src/test/resources/imdang_test.sql b/imdang-container/src/test/resources/imdang_test.sql new file mode 100644 index 00000000..dea9fd04 --- /dev/null +++ b/imdang-container/src/test/resources/imdang_test.sql @@ -0,0 +1,153 @@ +-- -------------------------------------------------------- +-- 호스트: 127.0.0.1 +-- 서버 버전: 8.0.31 - MySQL Community Server - GPL +-- 서버 OS: Win64 +-- HeidiSQL 버전: 12.5.0.6677 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- 테이블 imdang.district 구조 내보내기 +CREATE TABLE IF NOT EXISTS `district` ( + `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `si_do` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `si_gun_gu` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `eup_myeon_dong` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `li` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `rank` int DEFAULT NULL, + `created_at` date DEFAULT NULL, + `deleted_at` date DEFAULT NULL, + `ex_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + PRIMARY KEY (`code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.insight 구조 내보내기 +CREATE TABLE IF NOT EXISTS `insight_test` ( + `accused_count` int unsigned NOT NULL, + `recommended_count` int unsigned NOT NULL, + `view_count` int unsigned NOT NULL, + `visit_at` date NOT NULL, + `created_at` datetime(6) NOT NULL, + `id` char(36) COLLATE utf8mb4_general_ci NOT NULL, + `member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `address_building_number` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `address_detail` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `address_eup_myeon_dong` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `address_road_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `address_si_do` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `address_si_gun_gu` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `complex_environment` json NOT NULL, + `complex_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `infra` json NOT NULL, + `summary` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `visit_methods` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `visit_times` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `access` enum('자유로움','제한됨','허락시_가능') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `address_latitude` double DEFAULT NULL, + `address_longitude` double DEFAULT NULL, + `is_deleted` bit(1) NOT NULL, + PRIMARY KEY (`id`), + KEY `fk_insight_test_member_1` (`member_id`), + CONSTRAINT `fk_insight_test_member_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +CREATE TABLE IF NOT EXISTS `insight_image` ( + `insight_id` char(36) NOT NULL, + `type` int NOT NULL, + `sort_num` int NOT NULL, + `image` varchar(255) NOT NULL, + `created_at` datetime(6) NOT NULL, + CONSTRAINT `pk_insight_image` PRIMARY KEY (`image`), + CONSTRAINT `fk_insight_image_insight_1` FOREIGN KEY (`insight_id`) REFERENCES insight_test (id) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.member 구조 내보내기 +CREATE TABLE IF NOT EXISTS `member` ( + `id` char(36) COLLATE utf8mb4_general_ci NOT NULL, + `auth_id` varchar(255) COLLATE utf8mb4_general_ci NOT NULL, + `auth_type` enum('APPLE','GOOGLE','KAKAO','MOCK') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `birth_date` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `device_token` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `exchange_count` int unsigned NOT NULL, + `gender` tinyint DEFAULT NULL, + `insight_count` int unsigned NOT NULL, + `is_deleted` bit(1) DEFAULT NULL, + `is_login` bit(1) DEFAULT NULL, + `nickname` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `refresh_token` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, + `accused_count` int unsigned NOT NULL, + `penalty_from` date DEFAULT NULL, + `penalty_to` date DEFAULT NULL, + `rejected_count` int unsigned NOT NULL, + `status` enum('ACTIVE','EXCHANGE_RESTRICTED','PERMANENT_BANNED','TEMPORARY_BANNED') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_member_1` (`nickname`), + UNIQUE KEY `unique_member_2` (`auth_id`,`auth_type`,`is_deleted`), + CONSTRAINT `member_chk_1` CHECK ((`gender` between 0 and 1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.notification 구조 내보내기 +CREATE TABLE IF NOT EXISTS `notification` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `category` enum('ACCEPTED','REJECTED','REQUESTED') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `checked_at` datetime(6) DEFAULT NULL, + `created_at` datetime(6) NOT NULL, + `is_checked` bit(1) NOT NULL, + `message` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `receiver_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + KEY `fk_notification_member_1` (`receiver_id`), + CONSTRAINT `fk_notification_member_1` FOREIGN KEY (`receiver_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.recommend 구조 내보내기 +CREATE TABLE IF NOT EXISTS `recommend` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime(6) NOT NULL, + `recommend_member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `recommended_insight_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `recommended_member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_recommend_1` (`recommend_member_id`,`recommended_insight_id`), + KEY `fk_recommend_insight` (`recommended_insight_id`), + KEY `fk_recommend_member_2` (`recommended_member_id`), + CONSTRAINT `fk_recommend_insight` FOREIGN KEY (`recommended_insight_id`) REFERENCES `insight` (`id`) ON DELETE RESTRICT, + CONSTRAINT `fk_recommend_member_1` FOREIGN KEY (`recommend_member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT, + CONSTRAINT `fk_recommend_member_2` FOREIGN KEY (`recommended_member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.terms 구조 내보내기 +CREATE TABLE IF NOT EXISTS `terms` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `is_essential` bit(1) NOT NULL, + `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +-- 테이블 imdang.terms_agreement 구조 내보내기 +CREATE TABLE IF NOT EXISTS `terms_agreement` ( + `id` bigint NOT NULL AUTO_INCREMENT, + `created_at` datetime(6) NOT NULL, + `member_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `terms_id` bigint NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `unique_terms_agreement_1` (`member_id`,`terms_id`), + KEY `fk_terms_agreement_terms_1` (`terms_id`), + CONSTRAINT `fk_terms_agreement_member_1` FOREIGN KEY (`member_id`) REFERENCES `member` (`id`) ON DELETE RESTRICT, + CONSTRAINT `fk_terms_agreement_terms_1` FOREIGN KEY (`terms_id`) REFERENCES `terms` (`id`) ON DELETE RESTRICT +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + +/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */; +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */; diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/CreateInsightRequest.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/CreateInsightRequest.java index ee139b05..c8a7762f 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/CreateInsightRequest.java +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/CreateInsightRequest.java @@ -8,13 +8,13 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.PositiveOrZero; import jakarta.validation.constraints.Size; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDate; import java.util.Set; +@Builder +@AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class CreateInsightRequest { diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java index 96d357ab..4acdd7a0 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java @@ -17,6 +17,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import java.util.List; import java.util.UUID; @RequiredArgsConstructor @@ -24,12 +25,11 @@ public class InsightRequestResolver { public CreateInsightCommand toCreateInsightCommand(UUID memberId, - File mainImage, + List mainImages, CreateInsightRequest createInsightRequest) { return CreateInsightCommand.builder() .memberId(new MemberId(memberId)) - .score(createInsightRequest.getScore()) - .mainImage(mainImage) + .images(mainImages) .title(createInsightRequest.getTitle()) .address(toAddress(createInsightRequest.getAddress())) .apartmentComplex(toApartmentComplex(createInsightRequest.getApartmentComplex())) @@ -44,7 +44,7 @@ public CreateInsightCommand toCreateInsightCommand(UUID memberId, } public UpdateInsightCommand toUpdateInsightCommand(UUID memberId, - File mainImage, + List mainImage, UpdateInsightRequest updateInsightRequest) { return UpdateInsightCommand.builder() .memberId(new MemberId(memberId)) diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java index 596ce528..50dd2347 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java @@ -43,6 +43,7 @@ import java.io.IOException; import java.time.LocalDate; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; @@ -157,10 +158,10 @@ public ResponseEntity detail(@AuthenticationPrincipal UUID @ApiResponse(responseCode = "200", description = "인사이트가 작성 완료") @PostMapping("/create") public ResponseEntity createInsight(@AuthenticationPrincipal UUID memberId, - @RequestPart("createInsightCommand") @Valid CreateInsightRequest createInsightRequest, - @RequestPart("mainImage") MultipartFile mainImage) { - File file = validateFile(mainImage); - CreateInsightCommand createInsightCommand = resolver.toCreateInsightCommand(memberId, file, createInsightRequest); + @RequestPart("createInsightRequest") @Valid CreateInsightRequest createInsightRequest, + @RequestPart("mainImages") List mainImages) { + List files = validateFiles(mainImages); + CreateInsightCommand createInsightCommand = resolver.toCreateInsightCommand(memberId, files, createInsightRequest); InsightId insightId = insightApplicationService.createInsight(createInsightCommand); log.info("Insight[id: {}] is created.", insightId); return ResponseEntity.ok().build(); @@ -171,10 +172,10 @@ public ResponseEntity createInsight(@AuthenticationPrincipal UUID memberId @PostMapping("/update") public ResponseEntity updateInsight(@AuthenticationPrincipal UUID memberId, // TODO - CHANGE - @RequestPart("updateInsightCommand") @Valid UpdateInsightRequest updateInsightRequest, - @RequestPart(value = "mainImage", required = false) MultipartFile mainImage) { - File file = validateFile(mainImage); - UpdateInsightCommand updateInsightCommand = resolver.toUpdateInsightCommand(memberId, file, updateInsightRequest); + @RequestPart("updateInsightRequest") @Valid UpdateInsightRequest updateInsightRequest, + @RequestPart(value = "mainImages", required = false) List mainImages) { + List files = validateFiles(mainImages); + UpdateInsightCommand updateInsightCommand = resolver.toUpdateInsightCommand(memberId, files, updateInsightRequest); InsightId insightId = insightApplicationService.updateInsight(updateInsightCommand); log.info("Insight[id: {}] is updated.", insightId); return ResponseEntity.ok().build(); @@ -249,6 +250,43 @@ private File validateFile(MultipartFile file) { } } + private List validateFiles(List files) { + if (files == null || files.isEmpty()) { + // TODO - 예외 처리 + throw new RuntimeException("No files detected."); + } + + List result = new ArrayList<>(); + for (MultipartFile multipartFile : files) { + if (multipartFile.isEmpty()) { + // TODO - 예외 처리 + throw new RuntimeException("One of the files is empty."); + } + + String originalFilename = multipartFile.getOriginalFilename(); + if (originalFilename == null) { + throw new RuntimeException("One of the files has no filename."); + } + + validateFileExtension(originalFilename); // 기존 확장자 검증 재사용 + + try { + File file = File.builder() + .originalFilename(originalFilename) + .size(multipartFile.getSize()) + .contentType(multipartFile.getContentType()) + .inputStream(multipartFile.getInputStream()) + .build(); + + result.add(file); + } catch (IOException e) { + throw new RuntimeException("File processing error: " + e.getMessage(), e); + } + } + + return result; + } + private void validateFileExtension(String originalFilename) { int lastIndex = originalFilename.lastIndexOf("."); if (lastIndex == -1) { diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/create/CreateInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/create/CreateInsightCommand.java index 0e67c3cc..80c92048 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/create/CreateInsightCommand.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/create/CreateInsightCommand.java @@ -9,6 +9,7 @@ import com.project.imdang.common.domain.valueobject.MemberId; import com.project.imdang.common.domain.valueobject.VisitMethod; import com.project.imdang.common.domain.valueobject.VisitTime; +import com.project.imdang.insight.domain.entity.InsightImage; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -16,6 +17,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDate; +import java.util.List; import java.util.Set; @Builder @@ -24,8 +26,7 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class CreateInsightCommand { private MemberId memberId; // createdBy - private int score; - private File mainImage; + private List images; private String title; private Address address; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java index 5b1e718d..fa52bce8 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java @@ -17,6 +17,7 @@ import java.time.LocalDate; import java.time.ZonedDateTime; +import java.util.List; import java.util.Set; @Builder @@ -30,7 +31,7 @@ public class InsightDetailResult { private InsightId insightId; - private String mainImage; + private List mainImage; private String title; private Address address; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java index 14e8a042..3c23eed0 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java @@ -9,6 +9,7 @@ import lombok.NoArgsConstructor; import java.time.ZonedDateTime; +import java.util.List; @Builder @AllArgsConstructor @@ -19,7 +20,7 @@ public class InsightResult { private Integer recommendedCount; private Address address; private String title; - private String mainImage; + private List mainImage; private String memberNickname; private ZonedDateTime createdAt; } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java index 7f4c2744..def9b7ca 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java @@ -17,6 +17,7 @@ import lombok.NoArgsConstructor; import java.time.LocalDate; +import java.util.List; import java.util.Set; @Builder @@ -32,7 +33,7 @@ public class UpdateInsightCommand { private int score; private String title; - private File mainImage; + private List mainImage; private String summary; private LocalDate visitAt; diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/CreateInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/CreateInsightCommandHandler.java index 7db7b966..39952321 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/CreateInsightCommandHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/CreateInsightCommandHandler.java @@ -17,6 +17,8 @@ import org.springframework.transaction.annotation.Transactional; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; @Slf4j @RequiredArgsConstructor @@ -33,12 +35,13 @@ public class CreateInsightCommandHandler { @Transactional public InsightId createInsight(CreateInsightCommand createInsightCommand) { Insight insight = insightDataMapper.createInsightCommandToInsight(createInsightCommand); + List uploadImages = uploadImages(createInsightCommand.getImages()); + Insight created = insightDomainService.createInsight(insight, uploadImages); - String mainImage = uploadImage(createInsightCommand.getMainImage()); - Insight created = insightDomainService.createInsight(insight, mainImage); Insight savedInsight = insightHelper.save(created); log.info("Insight[id: {}] is created.", savedInsight.getId().getValue()); + // publish InsightCreatedEventMessage insightCreatedEventMessage = new InsightCreatedEventMessage(savedInsight.getId().getValue(), savedInsight.getMemberId().getValue()); @@ -46,13 +49,16 @@ public InsightId createInsight(CreateInsightCommand createInsightCommand) { return savedInsight.getId(); } - private String uploadImage(File mainImageFile) { - String mainImage; - try { - mainImage = fileService.upload(mainImageFile); - } catch (IOException e) { - throw new InsightDomainException(e.getMessage()); + private List uploadImages(List images) { + List uploadedImages = new ArrayList<>(); + for (File file : images) { + try { + String uploadedUrl = fileService.upload(file); + uploadedImages.add(uploadedUrl); + } catch (IOException e) { + throw new InsightDomainException("이미지 업로드 실패: " + e.getMessage()); + } } - return mainImage; + return uploadedImages; } } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java index dd430d53..a80cb0f0 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java @@ -16,6 +16,8 @@ import org.springframework.transaction.annotation.Transactional; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; @Slf4j @RequiredArgsConstructor @@ -34,7 +36,7 @@ public InsightId updateInsight(UpdateInsightCommand updateInsightCommand) { // validation check MemberId updatedBy = updateInsightCommand.getMemberId(); - String mainImage = uploadImage(updateInsightCommand.getMainImage()); + List mainImage = uploadImages(updateInsightCommand.getMainImage()); InsightUpdatedEvent insightUpdatedEvent = insightDomainService.updateInsight( insight, updatedBy, @@ -65,4 +67,17 @@ private String uploadImage(File mainImageFile) { } return mainImage; } + + private List uploadImages(List imageFiles) { + List uploadedImages = new ArrayList<>(); + for (File imageFile : imageFiles) { + try { + String uploadedUrl = fileService.upload(imageFile); + uploadedImages.add(uploadedUrl); + } catch (IOException e) { + throw new InsightDomainException("이미지 업로드 실패: " + e.getMessage()); + } + } + return uploadedImages; + } } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java index b3ae8292..14b3e97a 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java @@ -2,13 +2,16 @@ import com.project.imdang.common.domain.valueobject.InsightId; import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.InsightImage; import com.project.imdang.insight.domain.exception.InsightDomainException; import com.project.imdang.insight.domain.exception.InsightNotFoundException; +import com.project.imdang.insight.domain.ports.output.repository.InsightImageRepository; import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.List; import java.util.Optional; @Slf4j @@ -17,6 +20,7 @@ public class InsightHelper { private final InsightRepository insightRepository; + private final InsightImageRepository insightImageRepository; public Insight get(InsightId insightId) { Optional insightResult = insightRepository.findById(insightId); @@ -28,7 +32,8 @@ public Insight get(InsightId insightId) { public Insight save(Insight insight) { Insight saved = insightRepository.save(insight); - if (saved == null) { + List imageSaved = insightImageRepository.saveAll(insight.getImages()); // 추가됨. + if (saved == null || imageSaved == null) { String errorMessage = "Could not save insight!"; log.error(errorMessage); throw new InsightDomainException(errorMessage); diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java index 52cb1e9b..6ea2a3cc 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java @@ -4,8 +4,11 @@ import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; import com.project.imdang.insight.domain.dto.insight.list.InsightResult; import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.InsightImage; import org.springframework.stereotype.Component; +import java.util.List; + @Component public class InsightDataMapper { @@ -15,7 +18,6 @@ public InsightResult insightToInsightResponse(Insight insight, String memberNick .recommendedCount(insight.getRecommendedCount()) .address(insight.getAddress()) .title(insight.getTitle()) - .mainImage(insight.getMainImage()) .memberNickname(memberNickname) .createdAt(insight.getCreatedAt()) .build(); @@ -34,7 +36,6 @@ public Insight createInsightCommandToInsight(CreateInsightCommand createInsightC .summary(createInsightCommand.getSummary()) .infra(createInsightCommand.getInfra()) .complexEnvironment(createInsightCommand.getComplexEnvironment()) - .score(createInsightCommand.getScore()) .build(); } @@ -47,7 +48,6 @@ public InsightDetailResult insightToDetailInsightResponse(Insight insight, .memberId(insight.getMemberId()) .memberNickname(memberNickname) .insightId(insight.getId()) - .mainImage(insight.getMainImage()) .title(insight.getTitle()) .address(insight.getAddress()) .apartmentComplex(insight.getApartmentComplex()) @@ -63,7 +63,6 @@ public InsightDetailResult insightToDetailInsightResponse(Insight insight, .recommendedCount(insight.getRecommendedCount()) .accusedCount(insight.getAccusedCount()) .viewCount(insight.getViewCount()) - .score(insight.getScore()) .createdAt(insight.getCreatedAt()) .createdByMe(createdByMe) .build(); diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightImageRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightImageRepository.java new file mode 100644 index 00000000..7ba20883 --- /dev/null +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightImageRepository.java @@ -0,0 +1,30 @@ +package com.project.imdang.insight.domain.ports.output.repository; + +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.common.domain.valueobject.District; +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.InsightImage; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; + +public interface InsightImageRepository { + +// Page findAll(PageRequest pageRequest); +// Page findAllByDate(LocalDate date, PageRequest pageRequest); +// List findAllByIds(List insightIds); +// +// Page findAllByDistrict(District district, PageRequest pageRequest); +// Page findAllByApartmentComplex(ApartmentComplex apartmentComplex, PageRequest pageRequest); +// Optional findById(InsightId insightId); + + InsightImage save(InsightImage image); + List saveAll(List images); + +// List findDistinctApartmentComplexByMemberId(MemberId memberId); +} diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java index d01b983d..39133e5d 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java @@ -15,13 +15,14 @@ import com.project.imdang.insight.domain.event.InsightUpdatedEvent; import java.time.LocalDate; +import java.util.List; import java.util.Set; public interface InsightDomainService { - Insight createInsight(Insight insight, String mainImage); + Insight createInsight(Insight insight, List uploadImages); InsightUpdatedEvent updateInsight(Insight insight, MemberId memberId, - String mainImage, + List mainImage, String title, Address address, ApartmentComplex apartmentComplex, diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java index 8841bc08..b61ee61b 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java @@ -10,6 +10,7 @@ import com.project.imdang.common.domain.valueobject.VisitTime; import com.project.imdang.insight.domain.entity.Accuse; import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.InsightImage; import com.project.imdang.insight.domain.entity.Recommend; import com.project.imdang.insight.domain.event.InsightAccusedEvent; import com.project.imdang.insight.domain.event.InsightDeletedEvent; @@ -21,15 +22,18 @@ import java.time.LocalDate; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.IntStream; @Slf4j public class InsightDomainServiceImpl implements InsightDomainService { // TODO - CHECK : 왜 DomainServiceImpl을 bean으로 등록하는가? @Override - public Insight createInsight(Insight insight, String mainImage) { - insight.initialize(mainImage); + public Insight createInsight(Insight insight, List images) { + insight.initialize(images); log.info("Insight[id: {}] is created.", insight.getId().getValue()); return insight; } @@ -37,7 +41,7 @@ public Insight createInsight(Insight insight, String mainImage) { @Override public InsightUpdatedEvent updateInsight(Insight insight, MemberId memberId, - String mainImage, + List images, String title, Address address, ApartmentComplex apartmentComplex, @@ -49,9 +53,10 @@ public InsightUpdatedEvent updateInsight(Insight insight, Infra infra, ComplexEnvironment complexEnvironment, int score) { - insight.update(memberId, mainImage, title, address, apartmentComplex, + insight.urlsToInsightImages(insight.getId(), images); + insight.update(memberId, insight.getImages(), title, address, apartmentComplex, visitAt, visitTimes, visitMethods, access, summary, - infra, complexEnvironment, score); + infra, complexEnvironment); log.info("Insight[id: {}] is updated.", insight.getId().getValue()); return new InsightUpdatedEvent(insight, ZonedDateTime.now(ZoneId.of("UTC"))); } diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java index 4935c465..baec3638 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java @@ -17,15 +17,18 @@ import java.time.LocalDate; import java.time.ZonedDateTime; +import java.util.List; import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.IntStream; @Getter public class Insight extends AggregateRoot { private final MemberId memberId; // createdBy - private String mainImage; + private List images; private String title; private Address address; @@ -48,8 +51,6 @@ public class Insight extends AggregateRoot { private int accusedCount; private int viewCount; - // 완성도 - private int score; private ZonedDateTime createdAt; // TODO - CHECK : updatedAt; @@ -58,7 +59,7 @@ public class Insight extends AggregateRoot { @Builder public Insight(InsightId id, MemberId memberId, - String mainImage, + List images, String title, Address address, ApartmentComplex apartmentComplex, @@ -72,12 +73,11 @@ public Insight(InsightId id, int recommendedCount, int accusedCount, int viewCount, - int score, ZonedDateTime createdAt, boolean isDeleted) { setId(id); this.memberId = memberId; - this.mainImage = mainImage; + this.images = images; this.title = title; this.address = address; this.apartmentComplex = apartmentComplex; @@ -91,15 +91,14 @@ public Insight(InsightId id, this.recommendedCount = recommendedCount; this.accusedCount = accusedCount; this.viewCount = viewCount; - this.score = score; this.createdAt = createdAt; this.isDeleted = isDeleted; } - public void initialize(String mainImage) { + public void initialize(List imageUrls) { InsightId insightId = new InsightId(UUID.randomUUID()); setId(insightId); - this.mainImage = mainImage; + urlsToInsightImages(insightId, imageUrls); this.recommendedCount = 0; this.accusedCount = 0; this.viewCount = 0; @@ -107,7 +106,7 @@ public void initialize(String mainImage) { } public Insight update(MemberId updatedBy, - String mainImage, + List images, String title, Address address, ApartmentComplex apartmentComplex, @@ -117,15 +116,14 @@ public Insight update(MemberId updatedBy, Access access, String summary, Infra infra, - ComplexEnvironment complexEnvironment, - int score) { + ComplexEnvironment complexEnvironment) { if (!updatedBy.equals(this.memberId)) { throw new InsightDomainException("Author does not match!"); } - if (mainImage != null) { - this.mainImage = mainImage; + if (images != null) { + this.images = images; } this.title = title; this.address = address; @@ -137,7 +135,6 @@ public Insight update(MemberId updatedBy, this.summary = summary; this.infra = infra; this.complexEnvironment = complexEnvironment; - this.score = score; return this; } @@ -161,4 +158,15 @@ public Accuse accuse(MemberId accusedBy) { public void view() { this.viewCount++; } + + public void urlsToInsightImages(InsightId insightId, List imageUrls) { + this.images = IntStream.range(0, imageUrls.size()) + .mapToObj(i -> InsightImage.createNewInsightImage( + insightId, + 0, // type: 메인이미지 + i, // 정렬 순서 + imageUrls.get(i) + )) + .collect(Collectors.toList()); + } } diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/InsightImage.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/InsightImage.java new file mode 100644 index 00000000..7a180695 --- /dev/null +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/InsightImage.java @@ -0,0 +1,36 @@ +package com.project.imdang.insight.domain.entity; + +import com.project.imdang.common.domain.valueobject.InsightId; +import lombok.Builder; +import lombok.Getter; + +import java.time.ZonedDateTime; + +@Getter +public class InsightImage { + + private final InsightId insightId; + private final int type; + private final int sortNum; + private final String image; + private final ZonedDateTime createdAt; + + @Builder + public InsightImage(InsightId insightId, int type, int sortNum, String image, ZonedDateTime createdAt) { + this.insightId = insightId; + this.type = type; + this.sortNum = sortNum; + this.image = image; + this.createdAt = createdAt; + } + + static InsightImage createNewInsightImage(InsightId insightId, int type, int sortNum, String image) { + return InsightImage.builder() + .insightId(insightId) + .type(type) + .sortNum(sortNum) + .image(image) + .createdAt(ZonedDateTime.now()) + .build(); + } +} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightImageRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightImageRepositoryImpl.java new file mode 100644 index 00000000..58c21057 --- /dev/null +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightImageRepositoryImpl.java @@ -0,0 +1,104 @@ +package com.project.imdang.insight.persistence.adapter; + +import com.project.imdang.common.domain.valueobject.*; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.InsightImage; +import com.project.imdang.insight.domain.ports.output.repository.InsightImageRepository; +import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; +import com.project.imdang.insight.persistence.entity.InsightEntity; +import com.project.imdang.insight.persistence.entity.InsightImageEntity; +import com.project.imdang.insight.persistence.mapper.InsightImagePersistenceMapper; +import com.project.imdang.insight.persistence.mapper.InsightPersistenceMapper; +import com.project.imdang.insight.persistence.repository.InsightImageJpaRepository; +import com.project.imdang.insight.persistence.repository.InsightJpaRepository; +import com.project.imdang.insight.persistence.repository.InsightSpecification; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; + +@RequiredArgsConstructor +@Component +public class InsightImageRepositoryImpl implements InsightImageRepository { + + private final InsightImageJpaRepository insightImageJpaRepository; + private final InsightImagePersistenceMapper insightImagePersistenceMapper; + +// @Override +// public Page findAll(PageRequest pageRequest) { +// return insightJpaRepository.findAll(pageRequest) +// .map(insightPersistenceMapper::insightEntityToInsight); +// } +// +// @Override +// public Page findAllByDate(LocalDate date, PageRequest pageRequest) { +// final ZoneId zoneId = ZoneId.systemDefault(); +// ZonedDateTime startOfDay = date.atStartOfDay(zoneId); +// ZonedDateTime endOfDay = date.atTime(LocalTime.MAX).atZone(zoneId); +// return insightJpaRepository.findAllByCreatedAtBetween(startOfDay, endOfDay, pageRequest) +// .map(insightPersistenceMapper::insightEntityToInsight); +// } +// +// @Override +// public List findAllByIds(List insightIds) { +// Set _insightIds = insightIds.stream() +// .map(BaseId::getValue) +// .collect(Collectors.toSet()); +// return insightJpaRepository.findAllByIdIn(_insightIds).stream() +// .map(insightPersistenceMapper::insightEntityToInsight) +// .toList(); +// } +// +// @Override +// public Page findAllByDistrict(District district, PageRequest pageRequest) { +// Specification specification = +// Specification.where(InsightSpecification.equalsSiDo(district.getSiDo())) +// .and(InsightSpecification.equalsSiGunGu(district.getSiGunGu())) +// .and(InsightSpecification.equalsEupMyeonDong(district.getEupMyeonDong())); +// return insightJpaRepository.findAll(specification, pageRequest) +// .map(insightPersistenceMapper::insightEntityToInsight); +// } +// +// @Override +// public Page findAllByApartmentComplex(ApartmentComplex apartmentComplex, PageRequest pageRequest) { +// Specification specification = Specification.where(InsightSpecification.equalsApartmentComplexName(apartmentComplex.getName())); +// return insightJpaRepository.findAll(specification, pageRequest) +// .map(insightPersistenceMapper::insightEntityToInsight); +// } +// +// @Override +// public Optional findById(InsightId insightId) { +// UUID _insightId = insightId.getValue(); +// return insightJpaRepository.findById(_insightId) +// .map(insightPersistenceMapper::insightEntityToInsight); +// } + + @Override + public InsightImage save(InsightImage image) { + InsightImageEntity insightImageEntity = insightImagePersistenceMapper.toEntity(image); + InsightImageEntity saved = insightImageJpaRepository.save(insightImageEntity); + return insightImagePersistenceMapper.toDomain(saved); + } + @Override + public List saveAll(List images) { + List entities = insightImagePersistenceMapper.toEntities(images); + List saved = insightImageJpaRepository.saveAll(entities); + return insightImagePersistenceMapper.toDomains(saved); + } + +// @Override +// public List findDistinctApartmentComplexByMemberId(MemberId memberId) { +// return insightJpaRepository.findDistinctApartmentComplexByMemberId(memberId.getValue()); +// } +} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightEntity.java index 02ab6695..357d38cf 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightEntity.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightEntity.java @@ -39,7 +39,7 @@ @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Setter -@Table(name = "insight") +@Table(name = "insight_test") @Entity public class InsightEntity { @@ -53,7 +53,6 @@ public class InsightEntity { @JdbcTypeCode(SqlTypes.CHAR) private UUID memberId; - private String mainImage; private String title; @Embedded @@ -99,7 +98,7 @@ public class InsightEntity { private int accusedCount; private int viewCount; - private int score; +// private int score; // TODO - BaseEntity? private ZonedDateTime createdAt; diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightImageEntity.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightImageEntity.java new file mode 100644 index 00000000..5bfb7293 --- /dev/null +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/entity/InsightImageEntity.java @@ -0,0 +1,41 @@ +package com.project.imdang.insight.persistence.entity; + +import com.project.imdang.insight.domain.entity.InsightImage; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import lombok.*; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; + +import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.util.UUID; + +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +@Setter +@Table(name = "insight_image") +@Entity +public class InsightImageEntity { + + @Id + @Column(name = "image", length = 255, nullable = false) + private String image; + + @Column(name = "insight_id", columnDefinition = "char(36)", nullable = false) + @JdbcTypeCode(SqlTypes.CHAR) + private UUID insightId; + + @Column(name = "type", nullable = false) + private int type; + + @Column(name = "sort_num", nullable = false) + private int sortNum; + + @Column(name = "created_at", columnDefinition = "datetime(6)", nullable = false) + private ZonedDateTime createdAt; +} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightImagePersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightImagePersistenceMapper.java new file mode 100644 index 00000000..2763fec7 --- /dev/null +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightImagePersistenceMapper.java @@ -0,0 +1,48 @@ +package com.project.imdang.insight.persistence.mapper; + +import com.project.imdang.common.domain.valueobject.InsightId; +import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.InsightImage; +import com.project.imdang.insight.persistence.entity.InsightEntity; +import com.project.imdang.insight.persistence.entity.InsightImageEntity; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class InsightImagePersistenceMapper { + + public InsightImageEntity toEntity(InsightImage image) { + return InsightImageEntity.builder() + .image(image.getImage()) + .insightId(image.getInsightId().getValue()) + .type(image.getType()) + .sortNum(image.getSortNum()) + .createdAt(image.getCreatedAt()) + .build(); + } + + public List toEntities(List images) { + return images.stream() + .map(this::toEntity) + .collect(Collectors.toList()); + } + + public InsightImage toDomain(InsightImageEntity entity) { + return InsightImage.builder() + .image(entity.getImage()) + .insightId(new InsightId(entity.getInsightId())) + .type(entity.getType()) + .sortNum(entity.getSortNum()) + .createdAt(entity.getCreatedAt()) + .build(); + } + + public List toDomains(List entities) { + return entities.stream() + .map(this::toDomain) + .collect(Collectors.toList()); + } +} diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java index b1b429a1..0e8564ef 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java @@ -13,7 +13,6 @@ public InsightEntity insightToInsightEntity(Insight insight) { return InsightEntity.builder() .id(insight.getId().getValue()) .memberId(insight.getMemberId().getValue()) - .mainImage(insight.getMainImage()) .title(insight.getTitle()) .address(insight.getAddress()) .apartmentComplex(insight.getApartmentComplex()) @@ -27,7 +26,6 @@ public InsightEntity insightToInsightEntity(Insight insight) { .recommendedCount(insight.getRecommendedCount()) .accusedCount(insight.getAccusedCount()) .viewCount(insight.getViewCount()) - .score(insight.getScore()) .createdAt(insight.getCreatedAt()) .build(); } @@ -36,7 +34,6 @@ public Insight insightEntityToInsight(InsightEntity insightEntity) { return Insight.builder() .id(new InsightId(insightEntity.getId())) .memberId(new MemberId(insightEntity.getMemberId())) - .mainImage(insightEntity.getMainImage()) .title(insightEntity.getTitle()) .address(insightEntity.getAddress()) .apartmentComplex(insightEntity.getApartmentComplex()) @@ -50,7 +47,6 @@ public Insight insightEntityToInsight(InsightEntity insightEntity) { .recommendedCount(insightEntity.getRecommendedCount()) .accusedCount(insightEntity.getAccusedCount()) .viewCount(insightEntity.getViewCount()) - .score(insightEntity.getScore()) .createdAt(insightEntity.getCreatedAt()) .build(); } diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightImageJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightImageJpaRepository.java new file mode 100644 index 00000000..5b947d5e --- /dev/null +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightImageJpaRepository.java @@ -0,0 +1,28 @@ +package com.project.imdang.insight.persistence.repository; + +import com.project.imdang.common.domain.valueobject.ApartmentComplex; +import com.project.imdang.insight.persistence.entity.InsightEntity; +import com.project.imdang.insight.persistence.entity.InsightImageEntity; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.time.ZonedDateTime; +import java.util.List; +import java.util.Set; +import java.util.UUID; + +@Repository +public interface InsightImageJpaRepository extends JpaRepository, JpaSpecificationExecutor { + +// Page findAll(Specification specification, Pageable pageable); +// Page findAllByCreatedAtBetween(ZonedDateTime start, ZonedDateTime end, Pageable pageable); +// List findAllByIdIn(Set ids); +// +// @Query("select distinct i.apartmentComplex from InsightEntity i where i.memberId = :memberId") +// List findDistinctApartmentComplexByMemberId(UUID memberId); +} diff --git a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/provider/TokenProvider.java b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/provider/TokenProvider.java index 87662d77..b8c191e4 100644 --- a/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/provider/TokenProvider.java +++ b/member-service/member-domain/member-application-service/src/main/java/com/project/imdang/member/domain/ports/output/provider/TokenProvider.java @@ -18,4 +18,6 @@ public interface TokenProvider { * 토큰 유효성 검증 */ boolean verifyToken(String token); + + String extractSubject(String token); } From 7285ceeb2e0eef018aba096efb3235e7f70d6e71 Mon Sep 17 00:00:00 2001 From: heoj10272 Date: Mon, 23 Jun 2025 18:25:24 +0900 Subject: [PATCH 4/4] insight crud --- imdang-container/build.gradle | 2 + .../imdang/insight/InsightControllerTest.java | 96 +++++++++++--- .../com/project/imdang/insight/TestData.java | 33 ++++- .../dto/insight/DeleteInsightRequest.java | 6 +- .../dto/insight/UpdateInsightRequest.java | 11 +- .../mapper/InsightRequestResolver.java | 11 +- .../application/rest/InsightController.java | 33 +++-- .../domain/InsightApplicationServiceImpl.java | 26 ++-- .../insight/detail/InsightDetailResult.java | 4 + .../dto/insight/list/InsightResult.java | 4 +- .../insight/update/UpdateInsightCommand.java | 9 +- .../insight/DeleteInsightCommandHandler.java | 2 +- .../insight/DetailInsightQueryHandler.java | 10 +- .../insight/ListInsightQueryHandler.java | 119 ++++++++++++++++-- .../insight/UpdateInsightCommandHandler.java | 10 +- .../insight/domain/helper/InsightHelper.java | 28 +++++ .../domain/mapper/InsightDataMapper.java | 20 ++- .../service/InsightApplicationService.java | 14 +-- .../repository/InsightImageRepository.java | 17 +-- .../output/repository/InsightRepository.java | 6 +- .../insight/domain/InsightDomainService.java | 3 +- .../domain/InsightDomainServiceImpl.java | 3 +- .../imdang/insight/domain/entity/Insight.java | 4 + .../adapter/InsightImageRepositoryImpl.java | 32 +++-- .../adapter/InsightRepositoryImpl.java | 16 ++- .../mapper/InsightPersistenceMapper.java | 1 + .../repository/InsightImageJpaRepository.java | 10 +- .../domain/client/MemberFeignClient.java | 4 +- .../domain/client/MemberInfoResolverImpl.java | 18 ++- 29 files changed, 414 insertions(+), 138 deletions(-) diff --git a/imdang-container/build.gradle b/imdang-container/build.gradle index bfe64364..64ced899 100644 --- a/imdang-container/build.gradle +++ b/imdang-container/build.gradle @@ -33,6 +33,8 @@ dependencies { implementation project(':setting-service:setting-domain:setting-application-service') implementation project(':setting-service:setting-domain:setting-domain-core') + testImplementation project(':member-service:member-service-client:member-service-client-api') + implementation project(':common:common-application') implementation project(':common:common-domain:common-application-service') implementation project(':common:common-domain:common-domain-core') diff --git a/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java b/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java index 595548a2..e43084e1 100644 --- a/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java +++ b/imdang-container/src/test/java/com/project/imdang/insight/InsightControllerTest.java @@ -1,12 +1,16 @@ package com.project.imdang.insight; import com.fasterxml.jackson.databind.ObjectMapper; +import com.project.imdang.common.domain.valueobject.MemberId; import com.project.imdang.insight.application.dto.insight.CreateInsightRequest; +import com.project.imdang.insight.application.dto.insight.DeleteInsightRequest; +import com.project.imdang.insight.application.dto.insight.UpdateInsightRequest; import com.project.imdang.insight.domain.dto.insight.accuse.AccuseInsightCommand; import com.project.imdang.insight.domain.dto.insight.create.CreateInsightCommand; import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; +import com.project.imdang.member.domain.client.MemberData; import com.project.imdang.member.persistence.provider.JwtTokenProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -20,19 +24,24 @@ import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import java.nio.charset.StandardCharsets; import java.util.List; +import java.util.Optional; import java.util.UUID; import static org.hamcrest.core.IsNull.notNullValue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.project.imdang.member.domain.client.MemberDataResolver; @AutoConfigureMockMvc @SpringBootTest @@ -50,6 +59,9 @@ class InsightControllerTest { private final String memberToken = "member-token"; + @MockBean + private MemberDataResolver memberDataResolver; + @BeforeEach void init() { // given @@ -61,33 +73,74 @@ void init() { @Test void list() throws Exception { - mockMvc.perform(get("/insights") + MvcResult result = mockMvc.perform(get("/insights") .header("Authorization", "Bearer " + memberToken) -// .param("pageNumber", "0") -// .param("pageSize", "10") + .param("pageNumber", "0") + .param("pageSize", "10") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(print()) .andReturn(); + + String responseBody = result.getResponse().getContentAsString(); + + TestUtils.printPrettyJson(responseBody); } @Test void listByApartmentComplex() throws Exception { - mockMvc.perform(get("/insights/by-apartment-complex") + MvcResult result = mockMvc.perform(get("/insights/by-apartment-complex") .param("apartmentComplexName", TestData.apartmentComplex.getName()) .header("Authorization", "Bearer " + memberToken) -// .param("pageNumber", "0") -// .param("pageSize", "10") + .param("pageNumber", "0") + .param("pageSize", "10") .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) // .andExpect(jsonPath("$.content.length()").value(1)) .andDo(print()) .andReturn(); + + String responseBody = result.getResponse().getContentAsString(); + + TestUtils.printPrettyJson(responseBody); + } + + @Test + void listByAddress() throws Exception { + MvcResult result = mockMvc.perform(get("/insights/by-address") + .param("siDo", TestData.address.getSiDo()) + .param("siGunGu", TestData.address.getSiGunGu()) + .param("eupMyeonDong", TestData.address.getEupMyeonDong()) + .header("Authorization", "Bearer " + memberToken) + .param("pageNumber", "0") + .param("pageSize", "10") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) +// .andExpect(jsonPath("$.content.length()").value(1)) + .andDo(print()) + .andReturn(); + + String responseBody = result.getResponse().getContentAsString(); + + TestUtils.printPrettyJson(responseBody); } @Test void detail() throws Exception { - String insightId = "f509ce55-a67a-4c97-8846-0dee0c754c38"; + String insightId = "6383c5ad-7407-4f77-b095-0b7f817e389d"; + given(memberDataResolver.resolve(any(MemberId.class))) + .willReturn(Optional.of( + MemberData.builder() + .memberId(UUID.fromString("fb2b3270-65e3-4006-a994-71e74a676a8a")) + .nickname("테스트유저") + .birthDate("19981215") + .gender("0") + .deviceToken("dummy-token") + .accusedCount(0) + .insightCount(5) + .build() + )); + mockMvc.perform(get("/insights/detail") .header("Authorization", "Bearer " + memberToken) .param("insightId", insightId) @@ -126,20 +179,25 @@ void createInsight() throws Exception { void updateInsight() throws Exception { // given - UUID insightId = UUID.fromString("b434b945-5e39-4439-b0eb-ff953b777118"); - UpdateInsightCommand updateInsightCommand = new TestData(insightId).updateInsightCommand(); - String valueAsString = objectMapper.writeValueAsString(updateInsightCommand); + UUID insightId = UUID.fromString("3a07af28-be1e-45a1-8f5a-0b8a61269bd5"); + UpdateInsightRequest updateInsightRequest = new TestData(insightId).updateInsightRequest(); + String valueAsString = objectMapper.writeValueAsString(updateInsightRequest); byte[] bytes = "content".getBytes(); - MockMultipartFile mainImage = new MockMultipartFile("mainImage", "", "text/plain", bytes); + List mainImages = List.of( + new MockMultipartFile("mainImages", "img1.png", "image/png", "img1".getBytes()), + new MockMultipartFile("mainImages", "img2.png", "image/png", "img2".getBytes()) + ); // when // then - mockMvc.perform(multipart("/insights/update") - .file(mainImage) - .file(new MockMultipartFile("updateInsightCommand", "", "application/json", valueAsString.getBytes(StandardCharsets.UTF_8))) + mockMvc.perform(MockMvcRequestBuilders.multipart("/insights/update") + .file(mainImages.get(0)) + .file(mainImages.get(1)) + .file(new MockMultipartFile("updateInsightRequest", "updateInsightRequest.json", "application/json", valueAsString.getBytes(StandardCharsets.UTF_8))) .header("Authorization", "Bearer " + memberToken)) .andExpect(status().isOk()) // HTTP 상태 확인 - .andExpect(jsonPath("$.insightId", notNullValue())); +// .andExpect(jsonPath("$.insightId", notNullValue())); + .andDo(print()); } @Test @@ -168,13 +226,13 @@ void accuseInsight() throws Exception { @Test void deleteInsight() throws Exception { - UUID insightId = UUID.fromString("b434b945-5e39-4439-b0eb-ff953b777118"); - DeleteInsightCommand deleteInsightCommand = new TestData(insightId).deleteInsightCommand(); + UUID insightId = UUID.fromString("85159b48-c1e4-4b06-91ba-ba4905ead5fe"); + DeleteInsightRequest deleteInsightRequest = new TestData(insightId).deleteInsightRequest(); mockMvc.perform(post("/insights/delete") .header("Authorization", "Bearer " + memberToken) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(deleteInsightCommand))) // 요청 본문 직렬화 + .content(objectMapper.writeValueAsString(deleteInsightRequest))) // 요청 본문 직렬화 .andExpect(status().isOk()) // HTTP 상태 확인 - .andExpect(jsonPath("$.insightId", notNullValue())); + ; } } diff --git a/imdang-container/src/test/java/com/project/imdang/insight/TestData.java b/imdang-container/src/test/java/com/project/imdang/insight/TestData.java index 155bf9f0..3b149e86 100644 --- a/imdang-container/src/test/java/com/project/imdang/insight/TestData.java +++ b/imdang-container/src/test/java/com/project/imdang/insight/TestData.java @@ -25,7 +25,7 @@ public class TestData { // public final static UUID memberId = UUID.fromString("3eff967b-84b8-4ec4-941b-ef3f0a26c0b9"); - public final static UUID memberId = UUID.fromString("01637237-636f-42b3-b268-03366d28b0ea"); + public final static UUID memberId = UUID.fromString("fb2b3270-65e3-4006-a994-71e74a676a8a"); private InsightId insightId; public TestData() {} @@ -76,7 +76,6 @@ UpdateInsightCommand updateInsightCommand() { Assert.notNull(insightId, "InsightId must not be null!"); return UpdateInsightCommand.builder() .insightId(insightId) - .score(95) // .mainImage(updatedMainImage) .title("updated-title-1") .address(TestData.address) @@ -91,6 +90,23 @@ UpdateInsightCommand updateInsightCommand() { .build(); } + UpdateInsightRequest updateInsightRequest() { + Assert.notNull(insightId, "InsightId must not be null!"); + return UpdateInsightRequest.builder() + .insightId(insightId.getValue()) + .title("updated-title-1") + .address(TestData.addressDTO) + .apartmentComplex(TestData.apartmentComplexDTO) + .visitAt(LocalDate.now().minusDays(13)) + .visitTimes(Set.of(VisitTime.저녁)) + .visitMethods(Set.of(VisitMethod.자차, VisitMethod.도보)) + .access(Access.허락시_가능) + .summary("수정 - 지하철역과 도보 10분 거리로 접근성이 좋지만, 근처 공사로 소음 문제가 있을 수 있을 것 같아요. 지하철역과 도보 10분 거리로 접근성이 좋지만, 근처 공사로 소음 문제가 있을 수 있을 것 같아요. 하지만 단지 내 공원이 잘 조성되어 있어 가족 단위 거주자에게 적합할 것 같아요.") + .infra(TestData.infraDTO) + .complexEnvironment(TestData.complexEnvironmentDTO) + .build(); + } + DeleteInsightCommand deleteInsightCommand() { Assert.notNull(insightId, "InsightId must not be null!"); return DeleteInsightCommand.builder() @@ -98,6 +114,13 @@ DeleteInsightCommand deleteInsightCommand() { .build(); } + DeleteInsightRequest deleteInsightRequest() { + Assert.notNull(insightId, "InsightId must not be null!"); + return DeleteInsightRequest.builder() + .insightId(insightId.getValue()) + .build(); + } + RecommendInsightCommand recommendInsightCommand() { Assert.notNull(insightId, "InsightId must not be null!"); return RecommendInsightCommand.builder() @@ -114,9 +137,9 @@ AccuseInsightCommand accuseInsightCommand() { } static Address address = Address.builder() - .siDo("서울시") - .siGunGu("강남구") - .eupMyeonDong("신논현동") + .siDo("서울특별시") + .siGunGu("종로구") + .eupMyeonDong("효제동") .buildingNumber("1") .build(); diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DeleteInsightRequest.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DeleteInsightRequest.java index 6c3f72f3..e6a48d9a 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DeleteInsightRequest.java +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/DeleteInsightRequest.java @@ -2,12 +2,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.util.UUID; +@Builder +@AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DeleteInsightRequest { diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/UpdateInsightRequest.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/UpdateInsightRequest.java index 601381a9..634596bd 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/UpdateInsightRequest.java +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/dto/insight/UpdateInsightRequest.java @@ -8,14 +8,14 @@ import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.PositiveOrZero; import jakarta.validation.constraints.Size; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDate; import java.util.Set; import java.util.UUID; +@Builder +@AllArgsConstructor @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) public class UpdateInsightRequest { @@ -25,11 +25,6 @@ public class UpdateInsightRequest { private AddressDTO address; private ApartmentComplexDTO apartmentComplex; - @Schema(description = "인사이트 작성 점수") - @NotNull - @PositiveOrZero - private int score; - @Schema(description = "제목") @NotBlank @Size(min = 1, max = 20) diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java index 4acdd7a0..e43a071f 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/mapper/InsightRequestResolver.java @@ -1,11 +1,6 @@ package com.project.imdang.insight.application.mapper; -import com.project.imdang.common.domain.valueobject.Address; -import com.project.imdang.common.domain.valueobject.ApartmentComplex; -import com.project.imdang.common.domain.valueobject.ComplexEnvironment; -import com.project.imdang.common.domain.valueobject.File; -import com.project.imdang.common.domain.valueobject.Infra; -import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.*; import com.project.imdang.insight.application.dto.insight.AddressDTO; import com.project.imdang.insight.application.dto.insight.ApartmentComplexDTO; import com.project.imdang.insight.application.dto.insight.ComplexEnvironmentDTO; @@ -47,9 +42,9 @@ public UpdateInsightCommand toUpdateInsightCommand(UUID memberId, List mainImage, UpdateInsightRequest updateInsightRequest) { return UpdateInsightCommand.builder() + .insightId(new InsightId(updateInsightRequest.getInsightId())) .memberId(new MemberId(memberId)) - .score(updateInsightRequest.getScore()) - .mainImage(mainImage) + .images(mainImage) .title(updateInsightRequest.getTitle()) .address(toAddress(updateInsightRequest.getAddress())) .apartmentComplex(toApartmentComplex(updateInsightRequest.getApartmentComplex())) diff --git a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java index 50dd2347..69540485 100644 --- a/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java +++ b/insight-service/insight-application/src/main/java/com/project/imdang/insight/application/rest/InsightController.java @@ -4,7 +4,7 @@ import com.project.imdang.common.domain.valueobject.InsightId; import com.project.imdang.common.domain.valueobject.MemberId; import com.project.imdang.insight.application.dto.insight.AccuseInsightRequest; -import com.project.imdang.insight.domain.dto.insight.list.ApartmentComplexResult; +import com.project.imdang.insight.domain.dto.insight.list.*; import com.project.imdang.insight.application.dto.insight.CreateInsightRequest; import com.project.imdang.insight.application.dto.insight.DeleteInsightRequest; import com.project.imdang.insight.application.dto.insight.RecommendInsightRequest; @@ -15,11 +15,6 @@ import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; import com.project.imdang.insight.domain.dto.insight.detail.DetailInsightQuery; import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; -import com.project.imdang.insight.domain.dto.insight.list.InsightResult; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByApartmentComplexQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDateQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDistrictQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightQuery; import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; import com.project.imdang.insight.domain.ports.input.service.InsightApplicationService; @@ -101,7 +96,7 @@ public ResponseEntity> list(@RequestParam(name = "pageNumber .direction("DESC") .properties(new String[]{"recommendedCount"}) .build(); - Page insightResults = insightApplicationService.listInsight(listInsightQuery); + Page insightResults = insightApplicationService.listWithImages(listInsightQuery); return ResponseEntity.ok(insightResults); } @@ -138,7 +133,29 @@ public ResponseEntity> listByApartmentComplex(@RequestParam( .direction("DESC") .properties(new String[]{"createdAt"}) .build(); - Page insightResults = insightApplicationService.listInsightByApartmentComplex(listInsightByApartmentComplexQuery); + Page insightResults = insightApplicationService.listInsightWithImagesByApartmentComplex(listInsightByApartmentComplexQuery); + return ResponseEntity.ok(insightResults); + } + + @Operation(description = "동네(시도-시군구-읍면동) 인사이트 목록 조회 API") + @ApiResponse(responseCode = "200", description = "동네(시도-시군구-읍면동)별 인사이트 목록이 조회되었습니다.") + @GetMapping("/by-address") + public ResponseEntity> listByApartmentComplex(@RequestParam(name = "siDo") String siDo, + @RequestParam(name = "siGunGu") String siGunGu, + @RequestParam(name = "eupMyeonDong") String eupMyeonDong, + @RequestParam(name = "pageNumber", defaultValue = "0") Integer pageNumber, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + + ListInsightByAddressQuery listInsightByAddressQuery = ListInsightByAddressQuery.builder() + .siDo(siDo) + .siGunGu(siGunGu) + .eupMyeonDong(eupMyeonDong) + .pageNumber(pageNumber) + .pageSize(pageSize) + .direction("DESC") + .properties(new String[]{"createdAt"}) + .build(); + Page insightResults = insightApplicationService.listInsightWithImagesByAddress(listInsightByAddressQuery); return ResponseEntity.ok(insightResults); } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/InsightApplicationServiceImpl.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/InsightApplicationServiceImpl.java index bc1e9c02..0c2ed872 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/InsightApplicationServiceImpl.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/InsightApplicationServiceImpl.java @@ -9,16 +9,7 @@ import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; import com.project.imdang.insight.domain.dto.insight.detail.DetailInsightQuery; import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; -import com.project.imdang.insight.domain.dto.insight.list.MyApartmentComplexResult; -import com.project.imdang.insight.domain.dto.insight.list.MyDistrictResult; -import com.project.imdang.insight.domain.dto.insight.list.InsightResult; -import com.project.imdang.insight.domain.dto.insight.list.InsightSimpleResult; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByApartmentComplexQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDateQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDistrictQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightQuery; +import com.project.imdang.insight.domain.dto.insight.list.*; import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; import com.project.imdang.insight.domain.handler.insight.AccuseInsightCommandHandler; @@ -69,6 +60,11 @@ public Page listInsight(ListInsightQuery listInsightQuery) { return listInsightQueryHandler.list(listInsightQuery); } + @Override + public Page listWithImages(ListInsightQuery listInsightQuery) { + return listInsightQueryHandler.listWithImages(listInsightQuery); + } + @Override public Page listInsightByDate(ListInsightByDateQuery listInsightByDateQuery) { return listInsightQueryHandler.listByDate(listInsightByDateQuery); @@ -84,6 +80,16 @@ public Page listInsightByApartmentComplex(ListInsightByApartmentC return listInsightQueryHandler.listByApartmentComplex(listInsightByApartmentComplexQuery); } + @Override + public Page listInsightWithImagesByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery) { + return listInsightQueryHandler.listWithImagesByApartmentComplex(listInsightByApartmentComplexQuery); + } + + @Override + public Page listInsightWithImagesByAddress(ListInsightByAddressQuery listInsightByAddressQuery) { + return listInsightQueryHandler.listInsightWithImagesByAddress(listInsightByAddressQuery); + } + @Override public List listMyVisitedApartmentComplex(MemberId memberId) { return listMyVisitedApartmentComplexQueryHandler.listMyVisitedApartmentComplex(memberId); diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java index fa52bce8..d652e921 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/detail/InsightDetailResult.java @@ -55,6 +55,10 @@ public class InsightDetailResult { private Integer score; private ZonedDateTime createdAt; private Boolean createdByMe; + private List images; // image URL 리스트 + private List types; // 이미지 타입 리스트 + private List sortNums; // 정렬 순서 리스트 + public InsightDetailResult toPreviewInsightResponse() { return InsightDetailResult.builder() diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java index 3c23eed0..c4e8a5fa 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/list/InsightResult.java @@ -20,7 +20,9 @@ public class InsightResult { private Integer recommendedCount; private Address address; private String title; - private List mainImage; + private List images; // image URL 리스트 + private List types; // 이미지 타입 리스트 + private List sortNums; // 정렬 순서 리스트 private String memberNickname; private ZonedDateTime createdAt; } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java index def9b7ca..57e3de98 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/dto/insight/update/UpdateInsightCommand.java @@ -27,18 +27,17 @@ public class UpdateInsightCommand { private InsightId insightId; private MemberId memberId; + private List images; + private String title; private Address address; private ApartmentComplex apartmentComplex; - private int score; - private String title; - private List mainImage; - private String summary; - private LocalDate visitAt; private Set visitTimes; private Set visitMethods; + + private String summary; private Access access; // 인프라 diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DeleteInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DeleteInsightCommandHandler.java index d7b2b784..a830bb93 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DeleteInsightCommandHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DeleteInsightCommandHandler.java @@ -31,7 +31,7 @@ public InsightId deleteInsight(DeleteInsightCommand deleteInsightCommand) { // validation MemberId deletedBy = deleteInsightCommand.getMemberId(); InsightDeletedEvent insightDeletedEvent = insightDomainService.deleteInsight(insight, deletedBy); - Insight deletedInsight = insightHelper.save(insightDeletedEvent.getInsight()); + Insight deletedInsight = insightHelper.delete(insightDeletedEvent.getInsight()); final InsightId deletedInsightId = deletedInsight.getId(); log.info("Insight[id: {}] is deleted.", deletedInsightId.getValue()); diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DetailInsightQueryHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DetailInsightQueryHandler.java index 4917f2e4..2930363f 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DetailInsightQueryHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/DetailInsightQueryHandler.java @@ -5,10 +5,12 @@ import com.project.imdang.insight.domain.dto.insight.detail.DetailInsightQuery; import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.InsightImage; import com.project.imdang.insight.domain.exception.InsightNotFoundException; import com.project.imdang.insight.domain.exception.MemberNotFoundException; import com.project.imdang.insight.domain.mapper.InsightDataMapper; import com.project.imdang.insight.domain.ports.output.repository.AccuseRepository; +import com.project.imdang.insight.domain.ports.output.repository.InsightImageRepository; import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; import com.project.imdang.insight.domain.ports.output.repository.RecommendRepository; import com.project.imdang.member.domain.client.MemberData; @@ -18,12 +20,15 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Slf4j @RequiredArgsConstructor @Component public class DetailInsightQueryHandler { private final InsightRepository insightRepository; + private final InsightImageRepository insightImageRepository; private final InsightDataMapper insightDataMapper; private final RecommendRepository recommendRepository; @@ -39,6 +44,9 @@ public InsightDetailResult detailInsight(DetailInsightQuery detailInsightQuery) Insight insight = insightRepository.findById(insightId) .orElseThrow(() -> new InsightNotFoundException(insightId)); + // 이미지 가져오기 + List images = insightImageRepository.findByInsightId(insightId); + MemberId requestedBy = detailInsightQuery.getMemberId(); boolean recommended = recommendRepository.findByRecommendMemberIdAndRecommendedInsightId(requestedBy, insightId).isPresent(); boolean accused = accuseRepository.findByAccuseMemberIdAndAccusedInsightId(requestedBy, insightId).isPresent(); @@ -47,6 +55,6 @@ public InsightDetailResult detailInsight(DetailInsightQuery detailInsightQuery) .orElseThrow(() -> new MemberNotFoundException(insightCreatedBy)); String memberNickname = member.getNickname(); return insightDataMapper.insightToDetailInsightResponse( - insight, memberNickname, recommended, accused, insightCreatedBy.equals(requestedBy)); + insight, memberNickname, recommended, accused, insightCreatedBy.equals(requestedBy), images); } } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListInsightQueryHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListInsightQueryHandler.java index 7aaa7f95..8353d9e9 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListInsightQueryHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/ListInsightQueryHandler.java @@ -1,17 +1,12 @@ package com.project.imdang.insight.domain.handler.insight; import com.project.imdang.common.domain.utils.PagingUtils; -import com.project.imdang.common.domain.valueobject.ApartmentComplex; -import com.project.imdang.common.domain.valueobject.District; -import com.project.imdang.common.domain.valueobject.InsightId; -import com.project.imdang.common.domain.valueobject.MemberId; -import com.project.imdang.insight.domain.dto.insight.list.InsightResult; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByApartmentComplexQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDateQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDistrictQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightQuery; +import com.project.imdang.common.domain.valueobject.*; +import com.project.imdang.insight.domain.dto.insight.list.*; import com.project.imdang.insight.domain.entity.Insight; +import com.project.imdang.insight.domain.entity.InsightImage; import com.project.imdang.insight.domain.mapper.InsightDataMapper; +import com.project.imdang.insight.domain.ports.output.repository.InsightImageRepository; import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; import com.project.imdang.member.domain.client.MemberData; import com.project.imdang.member.domain.client.MemberDataResolver; @@ -23,6 +18,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; @@ -35,6 +31,7 @@ public class ListInsightQueryHandler { private final InsightRepository insightRepository; + private final InsightImageRepository insightImageRepository; private final InsightDataMapper insightDataMapper; private final MemberDataResolver memberResolver; @@ -51,6 +48,33 @@ public Page list(ListInsightQuery listInsightQuery) { }); } + public Page listWithImages(ListInsightQuery listInsightQuery) { + PageRequest pageRequest = PagingUtils.getPageRequest( + listInsightQuery.getPageNumber(), listInsightQuery.getPageSize(), + listInsightQuery.getDirection(), listInsightQuery.getProperties()); + + Page paged = insightRepository.findAll(pageRequest); + + List insights = paged.getContent(); + List insightIds = insights.stream() + .map(Insight::getId) + .toList(); + + // 이미지 조회 및 맵핑 + List images = insightImageRepository.findByInsightIdIn(insightIds); + Map> imageMap = images.stream() + .collect(Collectors.groupingBy(InsightImage::getInsightId)); + + // 닉네임 조회 + Map memberNicknameMap = getMemberNicknameMap(insights); + + return paged.map(insight -> { + List matchedImages = imageMap.getOrDefault(insight.getId(), List.of()); + String nickname = memberNicknameMap.get(insight.getMemberId()); + return insightDataMapper.insightToInsightResponse(insight, nickname, matchedImages); + }); + } + public Page listByDate(ListInsightByDateQuery listInsightByDateQuery) { PageRequest pageRequest = PagingUtils.getPageRequest( listInsightByDateQuery.getPageNumber(), listInsightByDateQuery.getPageSize(), listInsightByDateQuery.getDirection(), listInsightByDateQuery.getProperties()); @@ -63,6 +87,35 @@ public Page listByDate(ListInsightByDateQuery listInsightByDateQu }); } + public Page listWithImagesByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery) { + + PageRequest pageRequest = PagingUtils.getPageRequest( + listInsightByApartmentComplexQuery.getPageNumber(), listInsightByApartmentComplexQuery.getPageSize(), listInsightByApartmentComplexQuery.getDirection(), listInsightByApartmentComplexQuery.getProperties()); + ApartmentComplex apartmentComplex = ApartmentComplex.builder() + .name(listInsightByApartmentComplexQuery.getApartmentComplexName()) + .build(); + + Page paged = insightRepository.findAllByApartmentComplex(apartmentComplex, pageRequest); + List insights = paged.getContent(); + List insightIds = insights.stream() + .map(Insight::getId) + .toList(); + + // 이미지 조회 및 맵핑 + List images = insightImageRepository.findByInsightIdIn(insightIds); + Map> imageMap = images.stream() + .collect(Collectors.groupingBy(InsightImage::getInsightId)); + + // 닉네임 조회 + Map memberNicknameMap = getMemberNicknameMap(insights); + + return paged.map(insight -> { + List matchedImages = imageMap.getOrDefault(insight.getId(), List.of()); + String nickname = memberNicknameMap.get(insight.getMemberId()); + return insightDataMapper.insightToInsightResponse(insight, nickname, matchedImages); + }); + } + public Page listByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery) { PageRequest pageRequest = PagingUtils.getPageRequest( listInsightByApartmentComplexQuery.getPageNumber(), listInsightByApartmentComplexQuery.getPageSize(), listInsightByApartmentComplexQuery.getDirection(), listInsightByApartmentComplexQuery.getProperties()); @@ -78,6 +131,38 @@ public Page listByApartmentComplex(ListInsightByApartmentComplexQ }); } + public Page listInsightWithImagesByAddress(ListInsightByAddressQuery listInsightByAddressQuery) { + + PageRequest pageRequest = PagingUtils.getPageRequest( + listInsightByAddressQuery.getPageNumber(), listInsightByAddressQuery.getPageSize(), listInsightByAddressQuery.getDirection(), listInsightByAddressQuery.getProperties()); + + Address address = Address.builder() + .siDo(listInsightByAddressQuery.getSiDo()) + .siGunGu(listInsightByAddressQuery.getSiGunGu()) + .eupMyeonDong(listInsightByAddressQuery.getEupMyeonDong()) + .build(); + + Page paged = insightRepository.findAllByAddress(address, pageRequest); + List insights = paged.getContent(); + List insightIds = insights.stream() + .map(Insight::getId) + .toList(); + + // 이미지 조회 및 맵핑 + List images = insightImageRepository.findByInsightIdIn(insightIds); + Map> imageMap = images.stream() + .collect(Collectors.groupingBy(InsightImage::getInsightId)); + + // 닉네임 조회 + Map memberNicknameMap = getMemberNicknameMap(insights); + + return paged.map(insight -> { + List matchedImages = imageMap.getOrDefault(insight.getId(), List.of()); + String nickname = memberNicknameMap.get(insight.getMemberId()); + return insightDataMapper.insightToInsightResponse(insight, nickname, matchedImages); + }); + } + public Page listByDistrict(ListInsightByDistrictQuery listInsightByDistrictQuery) { PageRequest pageRequest = PagingUtils.getPageRequest( listInsightByDistrictQuery.getPageNumber(), listInsightByDistrictQuery.getPageSize(), listInsightByDistrictQuery.getDirection(), listInsightByDistrictQuery.getProperties()); @@ -107,7 +192,19 @@ private Map getMemberNicknameMap(List insights) { List memberIds = insights.stream() .map(Insight::getMemberId) .toList(); - return memberResolver.resolve(memberIds).stream() - .collect(Collectors.toMap(memberData -> new MemberId(memberData.getMemberId()), MemberData::getNickname)); + + List resolved = memberResolver.resolve(memberIds); + if (resolved == null) { + log.warn("memberResolver.resolve() returned null for memberIds: {}", memberIds); + return Collections.emptyMap(); // null 반환에 대한 방어 + } + + return resolved.stream() + .collect(Collectors.toMap( + memberData -> new MemberId(memberData.getMemberId()), + MemberData::getNickname)); + +// return memberResolver.resolve(memberIds).stream() +// .collect(Collectors.toMap(memberData -> new MemberId(memberData.getMemberId()), MemberData::getNickname)); } } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java index a80cb0f0..df2e0e47 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/handler/insight/UpdateInsightCommandHandler.java @@ -33,14 +33,15 @@ public InsightId updateInsight(UpdateInsightCommand updateInsightCommand) { InsightId insightId = updateInsightCommand.getInsightId(); Insight insight = insightHelper.get(insightId); + List uploadImages = uploadImages(updateInsightCommand.getImages()); // validation check MemberId updatedBy = updateInsightCommand.getMemberId(); - List mainImage = uploadImages(updateInsightCommand.getMainImage()); +// List mainImage = uploadImages(updateInsightCommand.getMainImage()); InsightUpdatedEvent insightUpdatedEvent = insightDomainService.updateInsight( insight, updatedBy, - mainImage, + uploadImages, updateInsightCommand.getTitle(), updateInsightCommand.getAddress(), updateInsightCommand.getApartmentComplex(), @@ -50,11 +51,10 @@ public InsightId updateInsight(UpdateInsightCommand updateInsightCommand) { updateInsightCommand.getAccess(), updateInsightCommand.getSummary(), updateInsightCommand.getInfra(), - updateInsightCommand.getComplexEnvironment(), - updateInsightCommand.getScore()); + updateInsightCommand.getComplexEnvironment()); Insight updated = insightUpdatedEvent.getInsight(); log.info("Insight[id: {}] is updated.", updated.getId().getValue()); - Insight savedInsight = insightHelper.save(updated); + Insight savedInsight = insightHelper.update(updated); return savedInsight.getId(); } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java index 14b3e97a..32dc3051 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/helper/InsightHelper.java @@ -41,4 +41,32 @@ public Insight save(Insight insight) { log.info("Insight[id: {}] is saved.", saved.getId().getValue()); return saved; } + + public Insight update(Insight insight) { + InsightId insightId = insight.getId(); + insightImageRepository.deleteByInsightId(insightId.getValue()); + Insight saved = insightRepository.save(insight); + List imageSaved = insightImageRepository.saveAll(insight.getImages()); + if (saved == null || imageSaved == null) { + String errorMessage = "Could not save insight!"; + log.error(errorMessage); + throw new InsightDomainException(errorMessage); + } + + log.info("Insight[id: {}] is saved.", saved.getId().getValue()); + return saved; + } + + public Insight delete(Insight insight) { + InsightId insightId = insight.getId(); + insightImageRepository.deleteByInsightId(insightId.getValue()); + Insight saved = insightRepository.save(insight); + if (saved == null) { + String errorMessage = "Could not save insight!"; + log.error(errorMessage); + throw new InsightDomainException(errorMessage); + } + log.info("Insight[id: {}] is deleted.", saved.getId().getValue()); + return saved; + } } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java index 6ea2a3cc..aa23cac2 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/mapper/InsightDataMapper.java @@ -23,6 +23,20 @@ public InsightResult insightToInsightResponse(Insight insight, String memberNick .build(); } + public InsightResult insightToInsightResponse(Insight insight, String memberNickname, List images) { + return InsightResult.builder() + .insightId(insight.getId()) + .recommendedCount(insight.getRecommendedCount()) + .address(insight.getAddress()) + .title(insight.getTitle()) + .images(images.stream().map(InsightImage::getImage).toList()) + .types(images.stream().map(InsightImage::getType).toList()) + .sortNums(images.stream().map(InsightImage::getSortNum).toList()) + .memberNickname(memberNickname) + .createdAt(insight.getCreatedAt()) + .build(); + } + public Insight createInsightCommandToInsight(CreateInsightCommand createInsightCommand) { return Insight.builder() .memberId(createInsightCommand.getMemberId()) @@ -43,7 +57,8 @@ public InsightDetailResult insightToDetailInsightResponse(Insight insight, String memberNickname, Boolean recommended, Boolean accused, - Boolean createdByMe) { + Boolean createdByMe, + List images) { return InsightDetailResult.builder() .memberId(insight.getMemberId()) .memberNickname(memberNickname) @@ -65,6 +80,9 @@ public InsightDetailResult insightToDetailInsightResponse(Insight insight, .viewCount(insight.getViewCount()) .createdAt(insight.getCreatedAt()) .createdByMe(createdByMe) + .images(images.stream().map(InsightImage::getImage).toList()) + .types(images.stream().map(InsightImage::getType).toList()) + .sortNums(images.stream().map(InsightImage::getSortNum).toList()) .build(); } } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/input/service/InsightApplicationService.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/input/service/InsightApplicationService.java index d8188ebd..a71a5a89 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/input/service/InsightApplicationService.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/input/service/InsightApplicationService.java @@ -9,16 +9,7 @@ import com.project.imdang.insight.domain.dto.insight.delete.DeleteInsightCommand; import com.project.imdang.insight.domain.dto.insight.detail.DetailInsightQuery; import com.project.imdang.insight.domain.dto.insight.detail.InsightDetailResult; -import com.project.imdang.insight.domain.dto.insight.list.MyApartmentComplexResult; -import com.project.imdang.insight.domain.dto.insight.list.MyDistrictResult; -import com.project.imdang.insight.domain.dto.insight.list.InsightResult; -import com.project.imdang.insight.domain.dto.insight.list.InsightSimpleResult; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByApartmentComplexQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDateQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightByDistrictQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListInsightQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightCreatedByMeQuery; -import com.project.imdang.insight.domain.dto.insight.list.ListMyInsightQuery; +import com.project.imdang.insight.domain.dto.insight.list.*; import com.project.imdang.insight.domain.dto.insight.recommend.RecommendInsightCommand; import com.project.imdang.insight.domain.dto.insight.update.UpdateInsightCommand; import org.springframework.data.domain.Page; @@ -27,10 +18,13 @@ public interface InsightApplicationService { Page listInsight(ListInsightQuery listInsightQuery); + Page listWithImages(ListInsightQuery listInsightQuery); Page listInsightByDate(ListInsightByDateQuery listInsightByDateQuery); Page listInsightByDistrict(ListInsightByDistrictQuery listInsightByDistrictQuery); Page listInsightByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery); + Page listInsightWithImagesByApartmentComplex(ListInsightByApartmentComplexQuery listInsightByApartmentComplexQuery); List listMyVisitedApartmentComplex(MemberId memberId); + Page listInsightWithImagesByAddress(ListInsightByAddressQuery listInsightByAddressQuery); Page listDistrict(String siDo, String siGunGu, Integer pageNumber, Integer pageSize); List listMyInsightDistrict(MemberId memberId); diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightImageRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightImageRepository.java index 7ba20883..eccabff7 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightImageRepository.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightImageRepository.java @@ -12,19 +12,22 @@ import java.time.LocalDate; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.UUID; public interface InsightImageRepository { -// Page findAll(PageRequest pageRequest); -// Page findAllByDate(LocalDate date, PageRequest pageRequest); -// List findAllByIds(List insightIds); +// Page findAll(PageRequest pageRequest); +// Page findAllByDate(LocalDate date, PageRequest pageRequest); + List findByInsightId(InsightId insightId); + List findByInsightIdIn(List insightIds); // -// Page findAllByDistrict(District district, PageRequest pageRequest); -// Page findAllByApartmentComplex(ApartmentComplex apartmentComplex, PageRequest pageRequest); -// Optional findById(InsightId insightId); +// Page findAllByDistrict(District district, PageRequest pageRequest); +// Page findAllByApartmentComplex(ApartmentComplex apartmentComplex, PageRequest pageRequest); +// Optional findById(InsightId insightId); InsightImage save(InsightImage image); List saveAll(List images); + void deleteByInsightId(UUID insightId); // 구현체에서 작성할 메서드 -// List findDistinctApartmentComplexByMemberId(MemberId memberId); } diff --git a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightRepository.java b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightRepository.java index c4419eae..a3e99b79 100644 --- a/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightRepository.java +++ b/insight-service/insight-domain/insight-application-service/src/main/java/com/project/imdang/insight/domain/ports/output/repository/InsightRepository.java @@ -1,10 +1,7 @@ package com.project.imdang.insight.domain.ports.output.repository; -import com.project.imdang.common.domain.valueobject.InsightId; -import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.*; import com.project.imdang.insight.domain.entity.Insight; -import com.project.imdang.common.domain.valueobject.ApartmentComplex; -import com.project.imdang.common.domain.valueobject.District; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -20,6 +17,7 @@ public interface InsightRepository { Page findAllByDistrict(District district, PageRequest pageRequest); Page findAllByApartmentComplex(ApartmentComplex apartmentComplex, PageRequest pageRequest); + Page findAllByAddress(Address address, PageRequest pageRequest); Optional findById(InsightId insightId); Insight save(Insight insight); diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java index 39133e5d..48c1907a 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainService.java @@ -32,8 +32,7 @@ InsightUpdatedEvent updateInsight(Insight insight, Access access, String summary, Infra infra, - ComplexEnvironment complexEnvironment, - int score); + ComplexEnvironment complexEnvironment); InsightDeletedEvent deleteInsight(Insight insight, MemberId deletedBy); InsightRecommendedEvent recommendInsight(Insight insight, MemberId recommendedBy); InsightAccusedEvent accuseInsight(Insight insight, MemberId accusedBy); diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java index b61ee61b..9a0511ad 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/InsightDomainServiceImpl.java @@ -51,8 +51,7 @@ public InsightUpdatedEvent updateInsight(Insight insight, Access access, String summary, Infra infra, - ComplexEnvironment complexEnvironment, - int score) { + ComplexEnvironment complexEnvironment) { insight.urlsToInsightImages(insight.getId(), images); insight.update(memberId, insight.getImages(), title, address, apartmentComplex, visitAt, visitTimes, visitMethods, access, summary, diff --git a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java index baec3638..aaf0f124 100644 --- a/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java +++ b/insight-service/insight-domain/insight-domain-core/src/main/java/com/project/imdang/insight/domain/entity/Insight.java @@ -169,4 +169,8 @@ public void urlsToInsightImages(InsightId insightId, List imageUrls) { )) .collect(Collectors.toList()); } + + public void setImages(List images) { + this.images = images; + } } diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightImageRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightImageRepositoryImpl.java index 58c21057..3136bb20 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightImageRepositoryImpl.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightImageRepositoryImpl.java @@ -16,6 +16,9 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Component; import java.time.LocalDate; @@ -50,15 +53,21 @@ public class InsightImageRepositoryImpl implements InsightImageRepository { // .map(insightPersistenceMapper::insightEntityToInsight); // } // -// @Override -// public List findAllByIds(List insightIds) { -// Set _insightIds = insightIds.stream() -// .map(BaseId::getValue) -// .collect(Collectors.toSet()); -// return insightJpaRepository.findAllByIdIn(_insightIds).stream() -// .map(insightPersistenceMapper::insightEntityToInsight) -// .toList(); -// } + @Override + public List findByInsightId(InsightId insightId) { + List entities = insightImageJpaRepository.findByInsightId(insightId.getValue()); + return insightImagePersistenceMapper.toDomains(entities); + } + + @Override + public List findByInsightIdIn(List insightIds) { + Set insightUuidSet = insightIds.stream() + .map(BaseId::getValue) + .collect(Collectors.toSet()); + + List entities = insightImageJpaRepository.findAllByInsightIdIn(insightUuidSet); + return insightImagePersistenceMapper.toDomains(entities); + } // // @Override // public Page findAllByDistrict(District district, PageRequest pageRequest) { @@ -101,4 +110,9 @@ public List saveAll(List images) { // public List findDistinctApartmentComplexByMemberId(MemberId memberId) { // return insightJpaRepository.findDistinctApartmentComplexByMemberId(memberId.getValue()); // } + + @Override + public void deleteByInsightId(UUID insightId) { + insightImageJpaRepository.deleteByInsightId(insightId); + } } diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightRepositoryImpl.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightRepositoryImpl.java index a8a8d3e4..7841cf0c 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightRepositoryImpl.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/adapter/InsightRepositoryImpl.java @@ -1,12 +1,8 @@ package com.project.imdang.insight.persistence.adapter; -import com.project.imdang.common.domain.valueobject.BaseId; -import com.project.imdang.common.domain.valueobject.InsightId; -import com.project.imdang.common.domain.valueobject.MemberId; +import com.project.imdang.common.domain.valueobject.*; import com.project.imdang.insight.domain.entity.Insight; import com.project.imdang.insight.domain.ports.output.repository.InsightRepository; -import com.project.imdang.common.domain.valueobject.ApartmentComplex; -import com.project.imdang.common.domain.valueobject.District; import com.project.imdang.insight.persistence.repository.InsightJpaRepository; import com.project.imdang.insight.persistence.repository.InsightSpecification; import com.project.imdang.insight.persistence.entity.InsightEntity; @@ -76,6 +72,16 @@ public Page findAllByApartmentComplex(ApartmentComplex apartmentComplex .map(insightPersistenceMapper::insightEntityToInsight); } + @Override + public Page findAllByAddress(Address address, PageRequest pageRequest) { + Specification specification = Specification + .where(InsightSpecification.equalsSiDo(address.getSiDo())) + .and(InsightSpecification.equalsSiGunGu(address.getSiGunGu())) + .and(InsightSpecification.equalsEupMyeonDong(address.getEupMyeonDong())); + return insightJpaRepository.findAll(specification, pageRequest) + .map(insightPersistenceMapper::insightEntityToInsight); + } + @Override public Optional findById(InsightId insightId) { UUID _insightId = insightId.getValue(); diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java index 0e8564ef..f56cef64 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/mapper/InsightPersistenceMapper.java @@ -27,6 +27,7 @@ public InsightEntity insightToInsightEntity(Insight insight) { .accusedCount(insight.getAccusedCount()) .viewCount(insight.getViewCount()) .createdAt(insight.getCreatedAt()) + .isDeleted(insight.isDeleted()) .build(); } diff --git a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightImageJpaRepository.java b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightImageJpaRepository.java index 5b947d5e..7665ec8d 100644 --- a/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightImageJpaRepository.java +++ b/insight-service/insight-persistence/src/main/java/com/project/imdang/insight/persistence/repository/InsightImageJpaRepository.java @@ -3,12 +3,15 @@ import com.project.imdang.common.domain.valueobject.ApartmentComplex; import com.project.imdang.insight.persistence.entity.InsightEntity; import com.project.imdang.insight.persistence.entity.InsightImageEntity; +import jakarta.transaction.Transactional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.time.ZonedDateTime; @@ -21,8 +24,13 @@ public interface InsightImageJpaRepository extends JpaRepository findAll(Specification specification, Pageable pageable); // Page findAllByCreatedAtBetween(ZonedDateTime start, ZonedDateTime end, Pageable pageable); -// List findAllByIdIn(Set ids); + List findByInsightId(UUID insightId); + List findAllByInsightIdIn(Set insightIds); // // @Query("select distinct i.apartmentComplex from InsightEntity i where i.memberId = :memberId") // List findDistinctApartmentComplexByMemberId(UUID memberId); + + @Modifying + @Query("DELETE FROM InsightImageEntity i WHERE i.insightId = :insightId") + void deleteByInsightId(@Param("insightId") UUID insightId); } diff --git a/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberFeignClient.java b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberFeignClient.java index 518b97cd..8939c365 100644 --- a/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberFeignClient.java +++ b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberFeignClient.java @@ -14,8 +14,8 @@ public interface MemberFeignClient { @GetMapping("/info") - ResponseEntity getMemberData(@RequestParam UUID memberId); + ResponseEntity getMemberData(@RequestParam("memberId") UUID memberId); @GetMapping - ResponseEntity> listMemberData(@RequestParam List memberIds); + ResponseEntity> listMemberData(@RequestParam("memberIds") List memberIds); } diff --git a/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java index e44bf99e..70f0391f 100644 --- a/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java +++ b/member-service/member-service-client/member-service-client-api-impl/src/main/java/com/project/imdang/member/domain/client/MemberInfoResolverImpl.java @@ -13,22 +13,20 @@ @Component public class MemberInfoResolverImpl implements MemberDataResolver { -// private final MemberFeignClient memberFeignClient; + private final MemberFeignClient memberFeignClient; @Override public Optional resolve(MemberId memberId) { - return Optional.empty(); -// UUID id = memberId.getValue(); -// MemberData memberData = memberFeignClient.getMemberData(id).getBody(); -// return Optional.ofNullable(memberData); + UUID id = memberId.getValue(); + MemberData memberData = memberFeignClient.getMemberData(id).getBody(); + return Optional.ofNullable(memberData); } @Override public List resolve(List memberIds) { - return null; -// List ids = memberIds.stream() -// .map(BaseId::getValue) -// .toList(); -// return memberFeignClient.listMemberData(ids).getBody(); + List ids = memberIds.stream() + .map(BaseId::getValue) + .toList(); + return memberFeignClient.listMemberData(ids).getBody(); } }