diff --git a/build.gradle b/build.gradle index 6029d4d..4090654 100644 --- a/build.gradle +++ b/build.gradle @@ -42,6 +42,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'com.h2database:h2:2.1.214' implementation "org.springframework.cloud:spring-cloud-starter-bus-kafka" + implementation 'org.springframework.kafka:spring-kafka' } dependencyManagement { diff --git a/src/main/java/com/bit/lotte/flower/user/social/dto/UserPhoneNumberDto.java b/src/main/java/com/bit/lotte/flower/user/social/dto/UserPhoneNumberDto.java new file mode 100644 index 0000000..4ac7c93 --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/dto/UserPhoneNumberDto.java @@ -0,0 +1,13 @@ +package com.bit.lotte.flower.user.social.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@Getter +@NoArgsConstructor +public class UserPhoneNumberDto { + + private String phoneNumber; +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/dto/command/UpdateUserInfoCommand.java b/src/main/java/com/bit/lotte/flower/user/social/dto/command/UpdateUserInfoCommand.java new file mode 100644 index 0000000..1611781 --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/dto/command/UpdateUserInfoCommand.java @@ -0,0 +1,20 @@ +package com.bit.lotte.flower.user.social.dto.command; + +import javax.annotation.Nullable; +import javax.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class +UpdateUserInfoCommand { + @Nullable + private String nickname; + @Nullable + private String email; + @Nullable + private String phoneNumber; +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserDataDto.java b/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserDataDto.java new file mode 100644 index 0000000..34f60bf --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserDataDto.java @@ -0,0 +1,19 @@ +package com.bit.lotte.flower.user.social.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class UserDataDto { + + private String nickname; + private String phoneNumber; + private String email; + + +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserDataResponse.java b/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserLoginDataResponse.java similarity index 89% rename from src/main/java/com/bit/lotte/flower/user/social/dto/response/UserDataResponse.java rename to src/main/java/com/bit/lotte/flower/user/social/dto/response/UserLoginDataResponse.java index 3f54fc2..8082f5a 100644 --- a/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserDataResponse.java +++ b/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserLoginDataResponse.java @@ -9,7 +9,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor -public class UserDataResponse { +public class UserLoginDataResponse { private String nickname; private boolean isPhoneNumberIsRegistered; private String profileImage; diff --git a/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserMypageResponse.java b/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserMypageResponse.java new file mode 100644 index 0000000..57dc85a --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/dto/response/UserMypageResponse.java @@ -0,0 +1,17 @@ +package com.bit.lotte.flower.user.social.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Builder +@AllArgsConstructor +@Getter +@NoArgsConstructor +public class UserMypageResponse { + Long couponCnt; + Long likesCnt; + T data; + +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/entity/SocialUser.java b/src/main/java/com/bit/lotte/flower/user/social/entity/SocialUser.java index 76bb017..804ba3b 100644 --- a/src/main/java/com/bit/lotte/flower/user/social/entity/SocialUser.java +++ b/src/main/java/com/bit/lotte/flower/user/social/entity/SocialUser.java @@ -21,6 +21,7 @@ public class SocialUser { @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private Long oauthId; + private String email; private String nickname; private String profileImage; private String phoneNumber; diff --git a/src/main/java/com/bit/lotte/flower/user/social/http/controller/SocialUserRestController.java b/src/main/java/com/bit/lotte/flower/user/social/http/controller/SocialUserRestController.java index 9500260..33821bf 100644 --- a/src/main/java/com/bit/lotte/flower/user/social/http/controller/SocialUserRestController.java +++ b/src/main/java/com/bit/lotte/flower/user/social/http/controller/SocialUserRestController.java @@ -1,25 +1,74 @@ package com.bit.lotte.flower.user.social.http.controller; -import com.bit.lotte.flower.user.social.dto.response.UserDataResponse; +import bloomingblooms.response.CommonResponse; +import com.bit.lotte.flower.user.social.dto.UserPhoneNumberDto; +import com.bit.lotte.flower.user.social.dto.command.UpdateUserInfoCommand; import com.bit.lotte.flower.user.social.dto.command.UserLoginCommand; +import com.bit.lotte.flower.user.social.dto.response.UserLoginDataResponse; +import com.bit.lotte.flower.user.social.dto.response.UserDataDto; +import com.bit.lotte.flower.user.social.dto.response.UserMypageResponse; +import com.bit.lotte.flower.user.social.http.message.GetUserCouponCntRequest; +import com.bit.lotte.flower.user.social.http.message.GetUserLikesCntRequest; +import com.bit.lotte.flower.user.social.service.GetUserInfoService; import com.bit.lotte.flower.user.social.service.SocialUserLoginManager; +import com.bit.lotte.flower.user.social.service.SocialUpdateUserService; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; 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.RequestHeader; import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor @RestController public class SocialUserRestController { + private final GetUserLikesCntRequest getUserLikesCntRequest; + private final GetUserCouponCntRequest getUserCouponCntRequest; + private final GetUserInfoService getUserInfoService; private final SocialUserLoginManager socialUserLoginManager; + private final SocialUpdateUserService socialUserService; - @PostMapping("/users/social") - public ResponseEntity userLogin(@RequestBody UserLoginCommand userLoginCommand){ - UserDataResponse response = socialUserLoginManager.process(userLoginCommand); - return ResponseEntity.ok(response); + @PostMapping("/social") + public ResponseEntity userLogin( + @RequestBody UserLoginCommand userLoginCommand) { + UserLoginDataResponse response = socialUserLoginManager.process(userLoginCommand); + return ResponseEntity.ok(response); } + @PutMapping("/social/phone-number") + public CommonResponse userPhoneNumberUpdate( + @RequestBody UserPhoneNumberDto phoneNumberDto, @RequestHeader Long userId) { + socialUserService.updatePhoneNumber(userId, phoneNumberDto.getPhoneNumber()); + return CommonResponse.success("성공"); + } + + @GetMapping("/social") + public CommonResponse> getUserData(@RequestHeader Long userId) { + UserDataDto userDataDto = getUserInfoService.getUserdata(userId); + Long userLikesCnt = getUserLikesCntRequest.request(userId); + Long userCouponCnt = getUserCouponCntRequest.request(userId); + return CommonResponse.success(getUserMypageResponse(userDataDto, userLikesCnt, userCouponCnt)); + } + + @PutMapping("/social") + public CommonResponse updateUserData(@RequestHeader Long userId, + @Valid @RequestBody UpdateUserInfoCommand command) { + socialUserService.updateUserInfo(userId, command.getNickname(), command.getEmail(), + command.getPhoneNumber()); + return CommonResponse.success("업데이트 성공"); + + } + + private UserMypageResponse getUserMypageResponse(UserDataDto userDataDto, Long likesCnt, + Long couponCnt) { + return UserMypageResponse.builder().data(userDataDto).couponCnt(couponCnt) + .likesCnt(likesCnt).build(); + } + + } diff --git a/src/main/java/com/bit/lotte/flower/user/social/http/feign/UserLikesFeignRequest.java b/src/main/java/com/bit/lotte/flower/user/social/http/feign/UserLikesFeignRequest.java new file mode 100644 index 0000000..a55295a --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/http/feign/UserLikesFeignRequest.java @@ -0,0 +1,15 @@ +package com.bit.lotte.flower.user.social.http.feign; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; + + +@FeignClient(name = "get-user-likes-cnt", value = "${service.likes.domain}") +public interface UserLikesFeignRequest { + + @GetMapping("/likes-cnt") + ResponseEntity getUserLikesCnt(@RequestHeader Long userId); + +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/http/feign/UserUsableCouponCntFeignRequest.java b/src/main/java/com/bit/lotte/flower/user/social/http/feign/UserUsableCouponCntFeignRequest.java new file mode 100644 index 0000000..a8c8eb4 --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/http/feign/UserUsableCouponCntFeignRequest.java @@ -0,0 +1,12 @@ +package com.bit.lotte.flower.user.social.http.feign; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +@FeignClient(name = "get-user-usable-coupon-cnt", value = "${service.coupon.domain}") +public interface UserUsableCouponCntFeignRequest { + @GetMapping("/coupons/count") + ResponseEntity getUsableUserCouponCnt(@RequestHeader Long userId); +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserCouponCntRequest.java b/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserCouponCntRequest.java new file mode 100644 index 0000000..cf9bf5e --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserCouponCntRequest.java @@ -0,0 +1,9 @@ +package com.bit.lotte.flower.user.social.http.message; + +import org.springframework.stereotype.Component; + +@Component +public interface GetUserCouponCntRequest { + public Long request(Long userId); + +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserCouponCntRequestImpl.java b/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserCouponCntRequestImpl.java new file mode 100644 index 0000000..37f069f --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserCouponCntRequestImpl.java @@ -0,0 +1,18 @@ +package com.bit.lotte.flower.user.social.http.message; + +import com.bit.lotte.flower.user.social.http.feign.UserUsableCouponCntFeignRequest; +import java.util.Objects; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class GetUserCouponCntRequestImpl implements + GetUserCouponCntRequest { + + private final UserUsableCouponCntFeignRequest feignRequest; + @Override + public Long request(Long userId) { + return feignRequest.getUsableUserCouponCnt(userId).getBody(); + } +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserLikesCntRequest.java b/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserLikesCntRequest.java new file mode 100644 index 0000000..ba53a32 --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserLikesCntRequest.java @@ -0,0 +1,8 @@ +package com.bit.lotte.flower.user.social.http.message; + +import org.springframework.stereotype.Component; + +@Component +public interface GetUserLikesCntRequest { + public Long request(Long userId); +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserLikesCntRequestImpl.java b/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserLikesCntRequestImpl.java new file mode 100644 index 0000000..81e9011 --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/http/message/GetUserLikesCntRequestImpl.java @@ -0,0 +1,17 @@ +package com.bit.lotte.flower.user.social.http.message; + +import com.bit.lotte.flower.user.social.http.feign.UserLikesFeignRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class GetUserLikesCntRequestImpl implements + GetUserLikesCntRequest { + + private final UserLikesFeignRequest userLikesFeignRequest; + @Override + public Long request(Long userId) { + return userLikesFeignRequest.getUserLikesCnt(userId).getBody(); + } +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/mapper/SocialUserMapper.java b/src/main/java/com/bit/lotte/flower/user/social/mapper/SocialUserMapper.java index d660e06..444b21c 100644 --- a/src/main/java/com/bit/lotte/flower/user/social/mapper/SocialUserMapper.java +++ b/src/main/java/com/bit/lotte/flower/user/social/mapper/SocialUserMapper.java @@ -2,9 +2,9 @@ import com.bit.lotte.flower.user.common.DefaultProfileImagerURL; -import com.bit.lotte.flower.user.common.valueobject.AuthId; import com.bit.lotte.flower.user.social.dto.command.UserLoginCommand; -import com.bit.lotte.flower.user.social.dto.response.UserDataResponse; +import com.bit.lotte.flower.user.social.dto.response.UserLoginDataResponse; +import com.bit.lotte.flower.user.social.dto.response.UserDataDto; import com.bit.lotte.flower.user.social.entity.SocialUser; public class SocialUserMapper { @@ -15,28 +15,48 @@ private SocialUserMapper() } - public static UserDataResponse getLoginResponse(String nickName, + public static UserLoginDataResponse getLoginResponse(String nickName, boolean isPhoneNumberRegistered) { - return UserDataResponse.builder() + return UserLoginDataResponse.builder() .nickname(nickName) .isPhoneNumberIsRegistered(isPhoneNumberRegistered).build(); } - public static SocialUser createSocialUserByLoginCommand(UserLoginCommand userCreateCommand) { - return SocialUser.builder().isDeleted(false).nickname(userCreateCommand.getNickname()) + return SocialUser.builder().isDeleted(false).nickname(userCreateCommand.getNickname()).email( + userCreateCommand.getEmail()) .phoneNumber(null).profileImage(DefaultProfileImagerURL.PROFILE_DEFAULT_IMAGE_URL).oauthId( userCreateCommand.getSocialId().getValue()).build(); } - public static UserDataResponse createUserLoginCommandBySocialUser(String profileImage,String nickname, Boolean socialUserPhoneIsRegistered){ - return UserDataResponse.builder().isPhoneNumberIsRegistered(socialUserPhoneIsRegistered).nickname( - nickname).profileImage(profileImage).build(); + public static UserLoginDataResponse createUserLoginCommandBySocialUser(String profileImage, + String nickname, Boolean socialUserPhoneIsRegistered) { + return UserLoginDataResponse.builder().isPhoneNumberIsRegistered(socialUserPhoneIsRegistered) + .nickname( + nickname).profileImage(profileImage).build(); + } + + public static UserDataDto socialUserToUserMyPageDataResponse(SocialUser socialUser) { + return UserDataDto.builder() + .email(socialUser.getEmail()).nickname(socialUser.getNickname()) + .phoneNumber(socialUser.getPhoneNumber()).build(); } - private AuthId getAuthId(Long value){ - return AuthId.builder().value(value).build(); + public static SocialUser updatedUserPhoneNumber(SocialUser socialUser, String phoneNumber) { + return SocialUser.builder().email(socialUser.getEmail()).isDeleted(socialUser.getIsDeleted()) + .nickname( + socialUser.getNickname()) + .phoneNumber(phoneNumber).profileImage(socialUser.getProfileImage()) + .oauthId(socialUser.getOauthId()).id(socialUser.getId()).build(); + } + + + public static SocialUser updateUserInfo(SocialUser socialUser, String nickname, String email, + String phoneNumber) { + return SocialUser.builder().id(socialUser.getId()).oauthId(socialUser.getOauthId()) + .profileImage(socialUser.getProfileImage()).phoneNumber(phoneNumber).email(email) + .nickname(email).isDeleted(socialUser.getIsDeleted()).build(); } } diff --git a/src/main/java/com/bit/lotte/flower/user/social/repository/FindSocialUserByLongIdService.java b/src/main/java/com/bit/lotte/flower/user/social/repository/FindSocialUserByLongIdService.java new file mode 100644 index 0000000..e372fe8 --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/repository/FindSocialUserByLongIdService.java @@ -0,0 +1,20 @@ +package com.bit.lotte.flower.user.social.repository; + + +import com.bit.lotte.flower.user.social.entity.SocialUser; +import com.bit.lotte.flower.user.social.exception.SocialUserDomainException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class FindSocialUserByLongIdService { + + private final SocialUserJpaRepository repository; + + public SocialUser findUserElseThrowError(Long id) { + return repository.findById(id).orElseThrow(() -> { + throw new SocialUserDomainException("존재하지 않는 회원입니다."); + }); + } +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/service/GetUserInfoService.java b/src/main/java/com/bit/lotte/flower/user/social/service/GetUserInfoService.java new file mode 100644 index 0000000..ced4099 --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/service/GetUserInfoService.java @@ -0,0 +1,9 @@ +package com.bit.lotte.flower.user.social.service; + +import com.bit.lotte.flower.user.social.dto.response.UserDataDto; +import org.springframework.stereotype.Service; + +@Service +public interface GetUserInfoService { + UserDataDto getUserdata(Long id); +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/service/GetUserInfoWithService.java b/src/main/java/com/bit/lotte/flower/user/social/service/GetUserInfoWithService.java new file mode 100644 index 0000000..810eefa --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/service/GetUserInfoWithService.java @@ -0,0 +1,19 @@ +package com.bit.lotte.flower.user.social.service; + +import com.bit.lotte.flower.user.social.dto.response.UserDataDto; +import com.bit.lotte.flower.user.social.entity.SocialUser; +import com.bit.lotte.flower.user.social.mapper.SocialUserMapper; +import com.bit.lotte.flower.user.social.repository.FindSocialUserByLongIdService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +@RequiredArgsConstructor +@Service +public class GetUserInfoWithService implements + GetUserInfoService { + private final FindSocialUserByLongIdService findUserByIdService; + @Override + public UserDataDto getUserdata(Long id) { + SocialUser socialUser = findUserByIdService.findUserElseThrowError(id); + return SocialUserMapper.socialUserToUserMyPageDataResponse(socialUser); + } +} diff --git a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUpdateUserService.java b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUpdateUserService.java new file mode 100644 index 0000000..953d4cd --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUpdateUserService.java @@ -0,0 +1,12 @@ +package com.bit.lotte.flower.user.social.service; + +import org.springframework.stereotype.Service; + +@Service +public interface SocialUpdateUserService { + + void updatePhoneNumber(Long userId ,String phoneNumber); + + void updateUserInfo(Long userId, String nickname, String email, String phoneNumber); +} + diff --git a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserDataResponseService.java b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserDataResponseService.java index 1cf673d..184306d 100644 --- a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserDataResponseService.java +++ b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserDataResponseService.java @@ -1,6 +1,6 @@ package com.bit.lotte.flower.user.social.service; -import com.bit.lotte.flower.user.social.dto.response.UserDataResponse; +import com.bit.lotte.flower.user.social.dto.response.UserLoginDataResponse; import com.bit.lotte.flower.user.social.entity.SocialUser; import com.bit.lotte.flower.user.social.exception.SocialUserDomainException; import com.bit.lotte.flower.user.social.mapper.SocialUserMapper; @@ -14,7 +14,7 @@ public class SocialUserDataResponseService { private final SocialUserJpaRepository repository; - public UserDataResponse getUserData(Long oauthId) { + public UserLoginDataResponse getUserData(Long oauthId) { SocialUser socialUser = repository.findByOauthIdAndIsDeletedFalse(oauthId) .orElseThrow(() -> { throw new SocialUserDomainException("존재하지 않은 소셜 유저 계정입니다."); diff --git a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserIdentityManager.java b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserIdentityManager.java index 232ee8b..7f2f17c 100644 --- a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserIdentityManager.java +++ b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserIdentityManager.java @@ -1,7 +1,7 @@ package com.bit.lotte.flower.user.social.service; import com.bit.lotte.flower.user.social.dto.command.UserLoginCommand; -import com.bit.lotte.flower.user.social.dto.response.UserDataResponse; +import com.bit.lotte.flower.user.social.dto.response.UserLoginDataResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,7 +14,7 @@ public class SocialUserIdentityManager { private final SocialUserLoginManager socialUserLoginManager; @Transactional - public UserDataResponse get(UserLoginCommand userLoginCommand) { + public UserLoginDataResponse get(UserLoginCommand userLoginCommand) { socialUserLoginManager.process(userLoginCommand); return userDataResponse.getUserData(userLoginCommand.getSocialId().getValue()); } diff --git a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserLoginManager.java b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserLoginManager.java index 0c226d1..17436db 100644 --- a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserLoginManager.java +++ b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserLoginManager.java @@ -1,7 +1,7 @@ package com.bit.lotte.flower.user.social.service; import com.bit.lotte.flower.user.social.dto.command.UserLoginCommand; -import com.bit.lotte.flower.user.social.dto.response.UserDataResponse; +import com.bit.lotte.flower.user.social.dto.response.UserLoginDataResponse; import com.bit.lotte.flower.user.social.repository.SocialUserJpaRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -20,7 +20,7 @@ public class SocialUserLoginManager { private final SocialUserLoginWhenUserExist socialUserLoginWhenUserExist ; private final SocialUserLoginResponseService socialUserLoginResponseService; - public UserDataResponse process(UserLoginCommand userLoginCommand){ + public UserLoginDataResponse process(UserLoginCommand userLoginCommand){ Long oauthId = userLoginCommand.getSocialId().getValue(); if(!repository.findAllByOauthId(oauthId).isEmpty()){ socialUserLoginWhenUserExist.processUser(userLoginCommand); diff --git a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserLoginResponseService.java b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserLoginResponseService.java index d691e01..5b3d38f 100644 --- a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserLoginResponseService.java +++ b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserLoginResponseService.java @@ -1,6 +1,6 @@ package com.bit.lotte.flower.user.social.service; -import com.bit.lotte.flower.user.social.dto.response.UserDataResponse; +import com.bit.lotte.flower.user.social.dto.response.UserLoginDataResponse; import com.bit.lotte.flower.user.social.entity.SocialUser; import com.bit.lotte.flower.user.social.exception.SocialUserDomainException; import com.bit.lotte.flower.user.social.mapper.SocialUserMapper; @@ -15,7 +15,7 @@ public class SocialUserLoginResponseService { private final SocialUserJpaRepository repository; - public UserDataResponse getUserLoginResponseWithNotSoftDeleted(Long oauthId) { + public UserLoginDataResponse getUserLoginResponseWithNotSoftDeleted(Long oauthId) { SocialUser socialUser = repository.findByOauthIdAndIsDeletedFalse(oauthId).orElseThrow(() -> { throw new SocialUserDomainException("해당 유저를 찾을 수 없습니다."); }); diff --git a/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserUpdateServiceImpl.java b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserUpdateServiceImpl.java new file mode 100644 index 0000000..c236482 --- /dev/null +++ b/src/main/java/com/bit/lotte/flower/user/social/service/SocialUserUpdateServiceImpl.java @@ -0,0 +1,36 @@ +package com.bit.lotte.flower.user.social.service; + +import com.bit.lotte.flower.user.social.entity.SocialUser; +import com.bit.lotte.flower.user.social.exception.SocialUserDomainException; +import com.bit.lotte.flower.user.social.mapper.SocialUserMapper; +import com.bit.lotte.flower.user.social.repository.FindSocialUserByLongIdService; +import com.bit.lotte.flower.user.social.repository.SocialUserJpaRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + + +@Service +@RequiredArgsConstructor +public class SocialUserUpdateServiceImpl implements + SocialUpdateUserService { + + private final FindSocialUserByLongIdService findUserByIdService; + private final SocialUserJpaRepository repository; + + + @Override + public void updatePhoneNumber(Long userId, String phoneNumber) { + SocialUser socialUser = findUserByIdService.findUserElseThrowError(userId); + repository.save( + SocialUserMapper.updatedUserPhoneNumber(socialUser, phoneNumber)); + } + + @Override + public void updateUserInfo(Long userId, String nickname, String email, String phoneNumber) { + SocialUser socialUser = findUserByIdService.findUserElseThrowError(userId); + repository.save( + SocialUserMapper.updateUserInfo(socialUser, nickname, email, phoneNumber) + ); + } + +} diff --git a/src/main/java/com/bit/lotte/flower/user/store/http/controller/StoreUserRestController.java b/src/main/java/com/bit/lotte/flower/user/store/http/controller/StoreUserRestController.java index 11f860b..780d7f8 100644 --- a/src/main/java/com/bit/lotte/flower/user/store/http/controller/StoreUserRestController.java +++ b/src/main/java/com/bit/lotte/flower/user/store/http/controller/StoreUserRestController.java @@ -24,7 +24,7 @@ public class StoreUserRestController { /** * @param signUpCommand Auth서버로부터 만들어지는 스토어 매니저 회원가입이다. */ - @PostMapping("/users/store-manager") + @PostMapping("/store-manager") public CommonResponse storeManagerSignUp( @RequestBody StoreManagerSignUpCommand signUpCommand) { storeManagerCreateService.signUp( @@ -33,7 +33,7 @@ public CommonResponse storeManagerSignUp( } - @GetMapping("/users/store-managers/{storeMangerId}") + @GetMapping("/stores/{storeMangerId}") public ResponseEntity login( @PathVariable Long storeMangerId) { return ResponseEntity.ok(storeManagerLoginResponseService.getStoreManagerResponse(storeMangerId)); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index d37036b..4a4a372 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,15 +1,13 @@ server: - port: ${server.port} + port: 8600 spring: application: name: user-service config: activate: on-profile: dev - datasource: - url: ${spring.datasoure.url} - username: ${spring.datasource.username} - password: ${spring.datasoure.password} + import: optional:configserver:http://localhost:8888 + jpa: show-sql: true hibernate: @@ -21,4 +19,10 @@ feign: default: connectTimeout: 5000 readTimeout: 5000 - loggerLevel: basic \ No newline at end of file + loggerLevel: basic + +service: + coupon: + domain : ${service.coupon.domain} + likes: + domain : ${servive.likes.domain} \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 5dfa8e4..5eeb0e3 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -1,5 +1,3 @@ -server: - port: 8082 spring: config: @@ -23,4 +21,10 @@ feign: default: connectTimeout: 5000 readTimeout: 5000 - loggerLevel: basic \ No newline at end of file + loggerLevel: basic + +service: + coupon: + domain : ${service.coupon.domain} + likes: + domain : ${servive.likes.domain} \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 0000000..1f73b66 --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,28 @@ +server: + port: 8600 +spring: + application: + name: user-service + config: + activate: + on-profile: prod + import: optional:configserver:http://localhost:8888 + + jpa: + show-sql: true + hibernate: + ddl-auto: update + +feign: + client: + config: + default: + connectTimeout: 5000 + readTimeout: 5000 + loggerLevel: basic + +service: + coupon: + domain : ${service.coupon.domain} + likes: + domain : ${servive.likes.domain} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index f5915eb..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,16 +0,0 @@ -server: - port: 8600 -spring: - application: - name: user-service - config: - activate: - on-profile: local, dev, local - import: optional:configserver:http://localhost:8888 -management: - endpoints: - web: - exposure: - include: - - "refresh" - - "bus-refresh" \ No newline at end of file diff --git a/src/test/java/com/bit/lotte/flower/user/social/service/SocialUserLoginIntegrationTest.java b/src/test/java/com/bit/lotte/flower/user/social/service/SocialUserLoginIntegrationTest.java deleted file mode 100644 index 6b6a17d..0000000 --- a/src/test/java/com/bit/lotte/flower/user/social/service/SocialUserLoginIntegrationTest.java +++ /dev/null @@ -1,158 +0,0 @@ -package com.bit.lotte.flower.user.social.service; - - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import com.bit.lotte.flower.user.common.valueobject.AuthId; -import com.bit.lotte.flower.user.social.dto.command.UserLoginCommand; -import com.bit.lotte.flower.user.social.dto.response.UserDataResponse; -import com.bit.lotte.flower.user.social.entity.SocialUser; -import com.bit.lotte.flower.user.social.repository.SocialUserJpaRepository; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.stream.Collectors; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit.jupiter.SpringExtension; -import org.springframework.transaction.annotation.Transactional; - - -@Transactional -@SpringBootTest -@ExtendWith(SpringExtension.class) -class SocialUserLoginIntegrationTest { - - Long testOauthId = 1L; - - Random random; - - @Autowired - SocialUserLoginManager loginManager; - @Autowired - SocialUserJpaRepository repository; - @Autowired - SocialUserCreateService socialUserCreateService; - @Autowired - SocialUserLoginWhenUserExist socialUserLoginWhenUserExist; - @Autowired - SocialUserLoginResponseService socialUserLoginResponseService; - - private static UserLoginCommand getCommand(Long randomLongValue) { - return UserLoginCommand.builder().email("test@gmail.com").nickname("testNickname") - .socialId(new AuthId(randomLongValue)).build(); - } - - @BeforeEach - void setRandom() { - random = new Random(); - } - - @DisplayName("유저가 존재하지 않을 때 유저 생성 테스트") - @Test - void SocialUserLogin_WhenUserIsNotRegistered_CreateUserAndGetUserDataResponse() { - Long userId = getCommand(testOauthId).getSocialId().getValue(); - UserDataResponse response = loginManager.process(getCommand(userId)); - assertTrue(repository.findById(userId).isPresent()); - assertNotNull(response); - - } - - @DisplayName("유저가 존재하고 유저의 상태가 모두 isDeleted인 상태인 경우 새로운 계정 생성하는 테스트 ") - @Test - void SocialUserLogin_WhenUserIsRegisteredAndSameIdUserIsAllDeleted_CreateNewUserWhichIsNotDeletedAndGetResponse() { - List deletedUsers = setAllUsersByStatus(true, testOauthId); - repository.saveAll(deletedUsers); - - Long userId = getCommand(testOauthId).getSocialId().getValue(); - repository.save(saveSocialUserById(testOauthId)); - - UserDataResponse response = loginManager.process(getCommand(userId)); - - List notDeletedUsers = repository.findAllByOauthId(testOauthId) - .stream() - .filter(user -> !user.getIsDeleted()) - .collect(Collectors.toList()); - assertEquals(1, notDeletedUsers.size()); - assertNotNull(response); - - } - - @DisplayName("유저가 존재하고 하나의 유저의 상태가 IsDeleted가 false인 경우 새로운 계정 생성을 하지 않는 테스트") - @Test - void SocialUserLogin_WhenUserIsRegisteredAndThereIsNotDeletedUser_NotCreateUserSameSizeAndGetResponse() { - repository.saveAll(setTwoUserOneUserIsNotDeletedStatus(testOauthId)); - int sizeBeforeInput = repository.findAllByOauthId(testOauthId).size(); - UserDataResponse response = loginManager.process(getCommand(testOauthId)); - int sizeAfterLoginProcess = repository.findAllByOauthId(testOauthId).size(); - - assertEquals(sizeBeforeInput, sizeAfterLoginProcess); - assertNotNull(response); - - } - - private List setAllUsersByStatus(Boolean status, Long oauthId) { - List deletedUsers = new ArrayList<>(); - SocialUser user1 = SocialUser.builder() - .id(1L) - .oauthId(oauthId) - .nickname("User1") - .profileImage("profile1.jpg") - .phoneNumber("1234567890") - .isDeleted(status) - .build(); - deletedUsers.add(user1); - - SocialUser user2 = SocialUser.builder() - .id(2L) - .oauthId(oauthId) - .nickname("User2") - .profileImage("profile2.jpg") - .phoneNumber("9876543210") - .isDeleted(status) - .build(); - deletedUsers.add(user2); - - return deletedUsers; - } - - private List setTwoUserOneUserIsNotDeletedStatus(Long oauthId) { - List deletedUsers = new ArrayList<>(); - SocialUser user1 = SocialUser.builder() - .id(1L) - .oauthId(oauthId) - .nickname("User1") - .profileImage("profile1.jpg") - .phoneNumber("1234567890") - .isDeleted(false) - .build(); - deletedUsers.add(user1); - - SocialUser user2 = SocialUser.builder() - .id(2L) - .oauthId(oauthId) - .nickname("User2") - .profileImage("profile2.jpg") - .phoneNumber("9876543210") - .isDeleted(true) - .build(); - deletedUsers.add(user2); - - return deletedUsers; - } - - - private SocialUser saveSocialUserById(Long id) { - return SocialUser.builder().oauthId(id).profileImage("test.jpg").phoneNumber("1245") - .nickname("testNickname").isDeleted(false).build(); - } - - -} - diff --git a/src/test/java/com/bit/lotte/flower/user/social/service/UserLoginDataResponseTest.java b/src/test/java/com/bit/lotte/flower/user/social/service/UserLoginDataResponseTest.java index ee1e2b9..df6d1be 100644 --- a/src/test/java/com/bit/lotte/flower/user/social/service/UserLoginDataResponseTest.java +++ b/src/test/java/com/bit/lotte/flower/user/social/service/UserLoginDataResponseTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; -import com.bit.lotte.flower.user.social.dto.response.UserDataResponse; +import com.bit.lotte.flower.user.social.dto.response.UserLoginDataResponse; import com.bit.lotte.flower.user.social.entity.SocialUser; import com.bit.lotte.flower.user.social.exception.SocialUserDomainException; import com.bit.lotte.flower.user.social.repository.SocialUserJpaRepository; @@ -51,7 +51,7 @@ void GetUserResponse_WhenUserExisted_GetUserLoginResponse() { when(repository.findByOauthIdAndIsDeletedFalse(testValidOauthId)).thenReturn( Optional.of(savedSocialUser())); - UserDataResponse response =loginResponseService.getUserLoginResponseWithNotSoftDeleted(testValidOauthId); + UserLoginDataResponse response =loginResponseService.getUserLoginResponseWithNotSoftDeleted(testValidOauthId); assertNotNull(response); diff --git a/src/test/java/com/bit/lotte/flower/user/store/service/StoreManagerSignUpTest.java b/src/test/java/com/bit/lotte/flower/user/store/service/StoreManagerSignUpTest.java index 6296fd5..aa6bfee 100644 --- a/src/test/java/com/bit/lotte/flower/user/store/service/StoreManagerSignUpTest.java +++ b/src/test/java/com/bit/lotte/flower/user/store/service/StoreManagerSignUpTest.java @@ -1,10 +1,13 @@ package com.bit.lotte.flower.user.store.service; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.internal.verification.VerificationModeFactory.times; -import com.bit.lotte.flower.user.store.dto.command.StoreManagerSignUpCommand; import com.bit.lotte.flower.user.store.entity.StoreManager; import com.bit.lotte.flower.user.store.repository.StoreManagerJpaRepository; import java.util.Optional; @@ -19,36 +22,22 @@ @ExtendWith(MockitoExtension.class) class StoreManagerSignUpTest { - private final Long testUserId = 1L; @Mock StoreManagerJpaRepository repository; @InjectMocks StoreManagerSignUpService storeManagerSignUpService; - private StoreManagerSignUpCommand createTestStoreManagerAccount() { - return StoreManagerSignUpCommand.builder().businessNumberImage("randomImage") - .email("randomEmail").name("randomName").id(testUserId).build(); - } - - private StoreManager getStoreManagerFromCommand(StoreManagerSignUpCommand signUpCommand) { - return StoreManager.builder().businessNumberImage(signUpCommand.getBusinessNumberImage()).email( - signUpCommand.getEmail()).id(signUpCommand.getId()).name(signUpCommand.getName()).build(); - } - @DisplayName("스토어 매니저 회원가입 테스트") @Test void SignUp_WhenThereIsRequestFromAuthSever_CreateStoreManager() { - StoreManager manager = - getStoreManagerFromCommand(createTestStoreManagerAccount()); - when(repository.save(any(StoreManager.class))).thenReturn(manager); - when(repository.findById(testUserId)).thenReturn(Optional.of(manager)); + when(repository.save(any(StoreManager.class))).thenReturn(mock(StoreManager.class)); - storeManagerSignUpService.signUp(manager); + storeManagerSignUpService.signUp(mock(StoreManager.class)); - assertNotNull(repository.findById(testUserId).orElse(null)); - } + verify(repository, times(1)).save(any(StoreManager.class)); + } }