From 5d1a1034a146e466eb959142fcc97673a527c5e8 Mon Sep 17 00:00:00 2001 From: Hwan0518 Date: Tue, 27 Jan 2026 18:36:07 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20'=EB=B3=B8=EC=9D=B8=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=A1=B0=ED=9A=8C=20API'=EC=9D=98=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=EA=B0=92=EC=97=90,=20=EC=B6=94=EC=B2=9C?= =?UTF-8?q?=EC=9D=B8=20=EC=A0=84=ED=99=94=EB=B2=88=ED=98=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/GetUserDataController.java | 8 ++ .../in/web/response/UserProfileResponse.java | 4 +- .../service/GetUserDataService.java | 30 ++++++++ .../GetUserDataServiceUnitTest.java | 74 ++++++++++++++++++- .../PartnerRelationshipFacadeUnitTest.java | 1 + 5 files changed, 115 insertions(+), 2 deletions(-) diff --git a/src/main/java/greenfirst/be/user/adapter/in/web/controller/GetUserDataController.java b/src/main/java/greenfirst/be/user/adapter/in/web/controller/GetUserDataController.java index 3a35e14..650df31 100644 --- a/src/main/java/greenfirst/be/user/adapter/in/web/controller/GetUserDataController.java +++ b/src/main/java/greenfirst/be/user/adapter/in/web/controller/GetUserDataController.java @@ -147,10 +147,14 @@ public BaseResponse getMyProfile(@AuthenticationPrincipal C // user 차량 번호 조회 String vehicleNumber = getUserDataService.getUserVehicleNumber(user.getUserUuid()); + // 추천인 전화번호 조회 + String referrerPhoneNumber = getUserDataService.getReferrerPhoneNumberByUserUuid(user.getUserUuid()); + // mapping UserProfileResponse response = modelMapper.map(user, UserProfileResponse.class) .toBuilder() .vehicleNumber(vehicleNumber) + .referrerPhoneNumber(referrerPhoneNumber) .build(); // result @@ -181,10 +185,14 @@ public BaseResponse getUserProfileByUuid( // 유저 차량 번호 조회 String vehicleNumber = getUserDataService.getUserVehicleNumber(user.getUserUuid()); + // 추천인 전화번호 조회 + String referrerPhoneNumber = getUserDataService.getReferrerPhoneNumberByUserUuid(user.getUserUuid()); + // mapping UserProfileResponse response = modelMapper.map(user, UserProfileResponse.class) .toBuilder() .vehicleNumber(vehicleNumber) + .referrerPhoneNumber(referrerPhoneNumber) .build(); // result diff --git a/src/main/java/greenfirst/be/user/adapter/in/web/response/UserProfileResponse.java b/src/main/java/greenfirst/be/user/adapter/in/web/response/UserProfileResponse.java index 2518ee2..9a1e598 100644 --- a/src/main/java/greenfirst/be/user/adapter/in/web/response/UserProfileResponse.java +++ b/src/main/java/greenfirst/be/user/adapter/in/web/response/UserProfileResponse.java @@ -20,11 +20,12 @@ public class UserProfileResponse { private Long branchId; private String branchName; private String vehicleNumber; + private String referrerPhoneNumber; @Builder(toBuilder = true) public UserProfileResponse(String userName, String userPhoneNumber, String userLoginId, UserAddress userAddress, PartnerOption partnerOption, Long branchId, String branchName, - String vehicleNumber) { + String vehicleNumber, String referrerPhoneNumber) { this.userName = userName; this.userPhoneNumber = userPhoneNumber; this.userLoginId = userLoginId; @@ -33,6 +34,7 @@ public UserProfileResponse(String userName, String userPhoneNumber, String userL this.branchId = branchId; this.branchName = branchName; this.vehicleNumber = vehicleNumber; + this.referrerPhoneNumber = referrerPhoneNumber; } } diff --git a/src/main/java/greenfirst/be/user/application/service/GetUserDataService.java b/src/main/java/greenfirst/be/user/application/service/GetUserDataService.java index 49ca9ff..16d133a 100644 --- a/src/main/java/greenfirst/be/user/application/service/GetUserDataService.java +++ b/src/main/java/greenfirst/be/user/application/service/GetUserDataService.java @@ -12,6 +12,7 @@ import greenfirst.be.user.application.dto.out.WithdrawUserListOutDto; import greenfirst.be.user.application.port.out.repository.UserQueryRepository; import greenfirst.be.user.application.port.out.repository.UserVehicleQueryRepository; +import greenfirst.be.user.domain.model.PartnerRelationship; import greenfirst.be.user.domain.model.Users; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,6 +20,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.Optional; import java.util.UUID; @@ -30,6 +32,7 @@ public class GetUserDataService { // port private final UserQueryRepository userQueryRepository; private final UserVehicleQueryRepository userVehicleQueryRepository; + private final GetPartnerRelationshipDataService getPartnerRelationshipDataService; // util private final ModelMapper modelMapper; @@ -43,6 +46,7 @@ public class GetUserDataService { * 5. 유저 차량 번호 조회 * 6. UUID 리스트로 유저 목록 조회 * 7. (admin) 탈퇴 유저 목록 조회 + * 8. 유저 추천인 전화번호 조회 */ // 1. 유저 uuid로 유저 조회 @@ -104,6 +108,7 @@ public List getUsersByUuidInList(List uuidList) { return userQueryRepository.getUsersByUuidInList(uuidList); } + // 7. (admin) 탈퇴 유저 목록 조회 public WithdrawUserListOutDto getWithdrawUserList(GetWithdrawUserListInDto inDto) { @@ -119,4 +124,29 @@ public WithdrawUserListOutDto getWithdrawUserList(GetWithdrawUserListInDto inDto return userQueryRepository.getWithdrawUserList(inDto); } + + // 8. 유저 추천인 전화번호 조회 + public String getReferrerPhoneNumberByUserUuid(UUID userUuid) { + if (userUuid == null) { + return null; + } + + Optional relationshipOptional = getPartnerRelationshipDataService.getPartnerRelationshipDataOptional(userUuid); + if (relationshipOptional.isEmpty()) { + return null; + } + + UUID referrerUuid = relationshipOptional.get().getReferrerUuid(); + if (referrerUuid == null) { + return null; + } + + List referrerCandidates = userQueryRepository.getUsersByUuidInList(List.of(referrerUuid)); + if (referrerCandidates.isEmpty()) { + return null; + } + + return referrerCandidates.get(0).getUserPhoneNumber(); + } + } diff --git a/src/test/java/greenfirst/be/user/application/GetUserDataServiceUnitTest.java b/src/test/java/greenfirst/be/user/application/GetUserDataServiceUnitTest.java index 53cd66a..b2d4972 100644 --- a/src/test/java/greenfirst/be/user/application/GetUserDataServiceUnitTest.java +++ b/src/test/java/greenfirst/be/user/application/GetUserDataServiceUnitTest.java @@ -8,7 +8,10 @@ import greenfirst.be.user.application.dto.out.UserDataListOutDto; import greenfirst.be.user.application.dto.out.WithdrawUserListOutDto; import greenfirst.be.user.application.service.GetUserDataService; +import greenfirst.be.user.application.service.GetPartnerRelationshipDataService; +import greenfirst.be.user.domain.model.PartnerRelationship; import greenfirst.be.user.domain.model.Users; +import greenfirst.be.users.fake.FakePartnerRelationshipQueryRepository; import greenfirst.be.users.fake.FakeUserQueryRepository; import greenfirst.be.users.fake.FakeUserVehicleQueryRepository; import greenfirst.be.users.fixture.UserTestFixture; @@ -34,6 +37,7 @@ class GetUserDataServiceUnitTest { private GetUserDataService getUserDataService; private FakeUserQueryRepository fakeUserQueryRepository; private FakeUserVehicleQueryRepository fakeUserVehicleQueryRepository; + private FakePartnerRelationshipQueryRepository fakePartnerRelationshipQueryRepository; private ModelMapper modelMapper; @@ -45,13 +49,23 @@ void setUp() { fakeUserVehicleQueryRepository = new FakeUserVehicleQueryRepository(); fakeUserVehicleQueryRepository.clear(); // 각 테스트 전에 초기화 + fakePartnerRelationshipQueryRepository = new FakePartnerRelationshipQueryRepository(); + fakePartnerRelationshipQueryRepository.clear(); // 각 테스트 전에 초기화 + // ModelMapper 설정 modelMapper = new ModelMapper(); modelMapper.getConfiguration() .setFieldMatchingEnabled(true) .setFieldAccessLevel(Configuration.AccessLevel.PRIVATE); - getUserDataService = new GetUserDataService(fakeUserQueryRepository, fakeUserVehicleQueryRepository, modelMapper); + GetPartnerRelationshipDataService getPartnerRelationshipDataService = + new GetPartnerRelationshipDataService(fakePartnerRelationshipQueryRepository); + getUserDataService = new GetUserDataService( + fakeUserQueryRepository, + fakeUserVehicleQueryRepository, + getPartnerRelationshipDataService, + modelMapper + ); } @@ -567,4 +581,62 @@ void getWithdrawUserList_FilterByUserType_Success() { } } + + @Nested + @DisplayName("추천인 전화번호 조회") + class GetReferrerPhoneNumberTest { + + @Test + @DisplayName("관계 없음: null 반환") + void getReferrerPhoneNumber_noRelationship_returnsNull() { + // given + UUID partnerUuid = UUID.randomUUID(); + + // when + String result = getUserDataService.getReferrerPhoneNumberByUserUuid(partnerUuid); + + // then + assertThat(result).isNull(); + } + + + @Test + @DisplayName("추천인 UUID가 null인 관계: null 반환") + void getReferrerPhoneNumber_nullReferrer_returnsNull() { + // given + UUID partnerUuid = UUID.randomUUID(); + fakePartnerRelationshipQueryRepository.save(PartnerRelationship.of(partnerUuid, null)); + + // when + String result = getUserDataService.getReferrerPhoneNumberByUserUuid(partnerUuid); + + // then + assertThat(result).isNull(); + } + + + @Test + @DisplayName("추천인 유저 존재: 추천인 전화번호 반환") + void getReferrerPhoneNumber_referrerExists_returnsPhoneNumber() { + // given + UUID partnerUuid = UUID.randomUUID(); + UUID referrerUuid = UUID.randomUUID(); + String referrerPhoneNumber = "010-9999-0000"; + + fakePartnerRelationshipQueryRepository.save(PartnerRelationship.of(partnerUuid, referrerUuid)); + + Users referrer = UserTestFixture.createPersonalPartner().toBuilder() + .userUuid(referrerUuid) + .userPhoneNumber(referrerPhoneNumber) + .build(); + fakeUserQueryRepository.addUser(referrer); + + // when + String result = getUserDataService.getReferrerPhoneNumberByUserUuid(partnerUuid); + + // then + assertThat(result).isEqualTo(referrerPhoneNumber); + } + } + } diff --git a/src/test/java/greenfirst/be/user/application/facade/PartnerRelationshipFacadeUnitTest.java b/src/test/java/greenfirst/be/user/application/facade/PartnerRelationshipFacadeUnitTest.java index 577c1f9..955eafb 100644 --- a/src/test/java/greenfirst/be/user/application/facade/PartnerRelationshipFacadeUnitTest.java +++ b/src/test/java/greenfirst/be/user/application/facade/PartnerRelationshipFacadeUnitTest.java @@ -54,6 +54,7 @@ void setUp() { GetUserDataService getUserDataService = new GetUserDataService( fakeUserQueryRepository, fakeUserVehicleQueryRepository, + getPartnerRelationshipDataService, new ModelMapper() ); PartnerRelationshipAssembler partnerRelationshipAssembler = new PartnerRelationshipAssembler();