diff --git a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java index 97d9db8..a510a52 100644 --- a/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java +++ b/src/main/java/com/neighbors/tohero/application/sharing/service/SharingService.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; @Service @RequiredArgsConstructor @@ -38,14 +39,16 @@ public BaseResponse getRecommenderCode(String userEm public BaseResponse getSharingPageInfo(long userId){ User user = getUser.getUserForSharing(userId); - String recommendedPeopleName = user.getRecommenders(); - List recommendedPeopleNameList = new ArrayList<>(Arrays.asList(recommendedPeopleName - .split(","))); + List recommendedPeopleName = user.getNameOfRecommendedWriter(); + + if(recommendedPeopleName.size() == 1 && Objects.equals(recommendedPeopleName.get(0), "")){ + recommendedPeopleName = new ArrayList<>(); + } return new BaseResponse<>( BaseResponseStatus.OK, BaseResponseMessage.공유하기_페이지_조회가_성공했습니다.getMessage(), - new GetSharingPageInfoResponse(user.isFirstSharing(), recommendedPeopleNameList.size(), recommendedPeopleNameList) + new GetSharingPageInfoResponse(user.isFirstSharing(), recommendedPeopleName.size(), recommendedPeopleName) ); } diff --git a/src/main/java/com/neighbors/tohero/domain/domain/letter/service/CreateLetter.java b/src/main/java/com/neighbors/tohero/domain/domain/letter/service/CreateLetter.java index 49d6315..d5bdaf7 100644 --- a/src/main/java/com/neighbors/tohero/domain/domain/letter/service/CreateLetter.java +++ b/src/main/java/com/neighbors/tohero/domain/domain/letter/service/CreateLetter.java @@ -13,6 +13,7 @@ import com.neighbors.tohero.domain.query.UserRepository; import lombok.RequiredArgsConstructor; +import java.util.ArrayList; import java.util.List; @DomainService @@ -25,7 +26,11 @@ public class CreateLetter { private final JwtProvider jwtProvider; public long createLetter(long userId, String writer, CreateLetterRequest createLetterRequest){ - User user = userRepository.getUser(repo -> repo.findByUserId(userId)); + String recommenderEmailDividedBySlash = null; + if(createLetterRequest.recommenderCode() != null){ + recommenderEmailDividedBySlash = jwtProvider.getRecommenderEmails(createLetterRequest.recommenderCode()); + } + User user = userRepository.getUserAndUpdateRecommenders(repo -> repo.findByUserId(userId), recommenderEmailDividedBySlash); Letter newLetter; try{ Address address = addressRepository.getAddressById(createLetterRequest.addressId()); @@ -53,7 +58,7 @@ public long createLetter(long userId, String writer, CreateLetterRequest createL } Letter createdLetter = letterRepository.createLetter(newLetter); - reflectRecommendation(writer, createLetterRequest.recommenderCode()); + reflectRecommendation(user, writer, createLetterRequest.recommenderCode()); return createdLetter.getLetterId(); } @@ -100,4 +105,12 @@ private void reflectRecommendation(String writer, String recommenderCode){ userRepository.reflectRecommendation(writer, recommenderEmails); } } + + private void reflectRecommendation(User user, String writer, String recommenderCode){ + if(recommenderCode != null){ + String recommenderEmailsDividedBySlash = jwtProvider.getRecommenderEmails(recommenderCode); + List recommenderEmails = List.of(recommenderEmailsDividedBySlash.split("/")); + userRepository.reflectRecommendation(writer, recommenderEmails); + } + } } diff --git a/src/main/java/com/neighbors/tohero/domain/domain/user/model/User.java b/src/main/java/com/neighbors/tohero/domain/domain/user/model/User.java index 35d313c..c78b9a5 100644 --- a/src/main/java/com/neighbors/tohero/domain/domain/user/model/User.java +++ b/src/main/java/com/neighbors/tohero/domain/domain/user/model/User.java @@ -7,6 +7,8 @@ import lombok.Getter; import lombok.Setter; +import java.util.List; + @Builder @Getter @AllArgsConstructor @@ -15,12 +17,14 @@ public class User { private String userName; private String email; private Role role; + @Setter private String recommenders; @Setter private boolean isFirstSharing; + private List nameOfRecommendedWriter; - public static User of (Long userId, String userName, String email, Role role, String recommenders, boolean isFirstSharing) { - return new User(userId, userName, email, role, recommenders, isFirstSharing); + public static User of (Long userId, String userName, String email, Role role, String recommenders, boolean isFirstSharing, List nameOfRecommendedWriter) { + return new User(userId, userName, email, role, recommenders, isFirstSharing, nameOfRecommendedWriter); } public static User toEntity(AuthenticateUserRequest authenticateUserRequest) { diff --git a/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java b/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java index 58328a2..13fee0b 100644 --- a/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java +++ b/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java @@ -16,4 +16,5 @@ public interface UserRepository { void deleteUser(Consumer findUserConsumer); void reflectRecommendation(String writer, List recommenderEmails); User getUserForSharing(Function> findUserFunction); + User getUserAndUpdateRecommenders(Function> findUserFunction, String recommenderCode); } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/entity/RecommendEntity.java b/src/main/java/com/neighbors/tohero/infrastructure/entity/RecommendEntity.java index 4096202..2a99843 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/entity/RecommendEntity.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/entity/RecommendEntity.java @@ -33,4 +33,11 @@ public void addRecommendedPeopleName(String recommendedPeopleName){ } this.recommendedPeopleName = recommendedPeopleName; } + + public String getRecommendedPeopleName(){ + if(recommendedPeopleName == null){ + return ""; + } + return recommendedPeopleName; + } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java b/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java index 126bbaf..8381a30 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/entity/UserEntity.java @@ -35,6 +35,7 @@ public class UserEntity extends BaseEntity { @Column(name = "recommenders", nullable = true) private String recommenders; + @Setter @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "recommend_id", nullable = true) private RecommendEntity recommendEntity; @@ -64,8 +65,4 @@ public String getRecommenders() { if(recommenders == null) return ""; return recommenders; } - - public void setRecommenders(RecommendEntity recommendEntity) { - this.recommendEntity = recommendEntity; - } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java b/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java index 3f4e9f0..020e3a1 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/mapper/UserMapper.java @@ -5,6 +5,10 @@ import com.neighbors.tohero.infrastructure.entity.UserEntity; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + @Component public class UserMapper { public UserEntity toNewEntity(User user){ @@ -21,13 +25,21 @@ public UserEntity toEntity(User user){ } public User toDomain(UserEntity userEntity){ + List nameOfRecommendedWriter; + if(userEntity.getRecommendEntity() == null){ + nameOfRecommendedWriter = new ArrayList<>(); + } + else{ + nameOfRecommendedWriter = Arrays.stream(userEntity.getRecommendEntity().getRecommendedPeopleName().split(",")).toList(); + } return User.of( userEntity.getUserId(), userEntity.getNickName(), userEntity.getEmail(), userEntity.getRole(), userEntity.getRecommenders(), - userEntity.isFirstSharing() + userEntity.isFirstSharing(), + nameOfRecommendedWriter ); } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java index 5bf52f2..95ce92d 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java @@ -13,7 +13,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -35,7 +34,7 @@ public User createUser(User user) { }catch(UserException e){ UserEntity userEntity = userMapper.toNewEntity(user); RecommendEntity recommendEntity = new RecommendEntity(userEntity); - userEntity.setRecommenders(recommendEntity); + userEntity.setRecommendEntity(recommendEntity); userEntityRepository.save(userEntity); UserEntity createdUserEntity = userEntityRepository.findByEmail(user.getEmail()) @@ -103,4 +102,46 @@ public User getUserForSharing(Function> findUserFunction, String recommenderCode) { + UserEntity userEntity = getUserEntity(findUserFunction); + + if(recommenderCode != null && !recommenderCode.isEmpty()){ + updateUserRecommenders(userEntity, recommenderCode); + } + + return userMapper.toDomain(userEntity); + } + + private void updateUserRecommenders(UserEntity userEntity, String recommenderEmailsDividedBySlash) { + if(userEntity.getRecommenders().isEmpty()){ + userEntity.setRecommenders(recommenderEmailsDividedBySlash); + } + else{ + queueingUserRecommenders(userEntity, recommenderEmailsDividedBySlash); + } + + //이전 사람 이름 저장 + String lastUserEmail = recommenderEmailsDividedBySlash.split("/")[recommenderEmailsDividedBySlash.split("/").length - 1]; + UserEntity lastUserEntity = getUserEntity(repo -> repo.findByEmail(lastUserEmail)); + userEntity.getRecommendEntity().addRecommendedPeopleName(lastUserEntity.getNickName()); + userEntityRepository.save(userEntity); + } + + private void queueingUserRecommenders(UserEntity userEntity, String recommenderEmailsDividedBySlash) { + List existedRecommendersEmail = new java.util.ArrayList<>(Arrays.stream(userEntity.getRecommenders().split("/")).toList()); + List addedRecommendersEmail = Arrays.stream(recommenderEmailsDividedBySlash.split("/")).toList(); + + String result = userEntity.getRecommenders() + "/" + recommenderEmailsDividedBySlash; + if(existedRecommendersEmail.size() + addedRecommendersEmail.size() > 5){ + existedRecommendersEmail.addAll(addedRecommendersEmail); + + int size = existedRecommendersEmail.size(); + List lastFive = existedRecommendersEmail.subList(Math.max(0, size - 5), size); + + result = String.join("/", lastFive); + } + userEntity.setRecommenders(result); + } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/repository/RecommendEntityRepository.java b/src/main/java/com/neighbors/tohero/infrastructure/repository/RecommendEntityRepository.java index dbbf323..50e54f4 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/repository/RecommendEntityRepository.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/repository/RecommendEntityRepository.java @@ -12,4 +12,7 @@ public interface RecommendEntityRepository extends JpaRepository { @Query("SELECT re FROM RecommendEntity re WHERE re.userEntity.email IN :emails") List findAllByUserEmailIn(@Param("emails") List emails); + + @Query("SELECT re FROM RecommendEntity re WHERE re.userEntity.userId = :userId") + RecommendEntity findByUserId(@Param("userId") Long userId); }