diff --git a/src/main/java/com/neighbors/tohero/application/letter/dto/CreateLetterRequest.java b/src/main/java/com/neighbors/tohero/application/letter/dto/CreateLetterRequest.java index 7923ed3..0b12430 100644 --- a/src/main/java/com/neighbors/tohero/application/letter/dto/CreateLetterRequest.java +++ b/src/main/java/com/neighbors/tohero/application/letter/dto/CreateLetterRequest.java @@ -8,7 +8,7 @@ public record CreateLetterRequest ( @NotBlank - @Length(min =1, max = 1000) + @Length(min =1, max = 500) String content, @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/src/main/java/com/neighbors/tohero/application/letter/dto/GetLetterDetailResponse.java b/src/main/java/com/neighbors/tohero/application/letter/dto/GetLetterDetailResponse.java index 581ba9a..5449b58 100644 --- a/src/main/java/com/neighbors/tohero/application/letter/dto/GetLetterDetailResponse.java +++ b/src/main/java/com/neighbors/tohero/application/letter/dto/GetLetterDetailResponse.java @@ -2,6 +2,8 @@ import com.neighbors.tohero.domain.domain.mainPage.model.Letter; +import java.time.LocalDate; + public record GetLetterDetailResponse( LetterInfo letterInfo ) { @@ -11,10 +13,11 @@ public record LetterInfo( String from, String to, boolean isOpened, - boolean isPublic + boolean isPublic, + LocalDate createdAt ){} public static GetLetterDetailResponse from(Letter letter) { - return new GetLetterDetailResponse(new LetterInfo(letter.getLetterId(), letter.getLetterContent(), letter.getWriter(), letter.getTargetName(), letter.isOpened(), letter.isPublic())); + return new GetLetterDetailResponse(new LetterInfo(letter.getLetterId(), letter.getLetterContent(), letter.getWriter(), letter.getTargetName(), letter.isOpened(), letter.isPublic(), letter.getCreatedDate().toLocalDate())); } } diff --git a/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java b/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java index ca3b669..5cc5b1f 100644 --- a/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java +++ b/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java @@ -30,6 +30,7 @@ public class LetterService { private final UpdateLetter updateLetter; private final DeleteLetter deleteLetter; + @Transactional public BaseResponse createLetter(final JwtUserDetails jwtUserDetail, final CreateLetterRequest createLetterRequest) { throwExceptionIfAddressIsNotExist(createLetterRequest.addressId()); 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 a510a52..25eceb9 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 @@ -55,7 +55,10 @@ public BaseResponse getSharingPageInfo(long userId){ private String createRecommenderCode(User user){ String recommenderEmailsDividedBySlash = user.getRecommenders(); List recommenderEmails = new java.util.ArrayList<>(List.of(recommenderEmailsDividedBySlash.split("/"))); - recommenderEmails.add(user.getEmail()); + boolean isNotExistEmail = recommenderEmails.stream().noneMatch(email -> email.equals(user.getEmail())); + if(isNotExistEmail) { + recommenderEmails.add(user.getEmail()); + } if (recommenderEmails.size() > 5) { recommenderEmails.remove(0); 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 d5bdaf7..ffe46fc 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 @@ -31,6 +31,7 @@ public long createLetter(long userId, String writer, CreateLetterRequest createL recommenderEmailDividedBySlash = jwtProvider.getRecommenderEmails(createLetterRequest.recommenderCode()); } User user = userRepository.getUserAndUpdateRecommenders(repo -> repo.findByUserId(userId), recommenderEmailDividedBySlash); + Letter newLetter; try{ Address address = addressRepository.getAddressById(createLetterRequest.addressId()); @@ -110,7 +111,7 @@ private void reflectRecommendation(User user, String writer, String recommenderC if(recommenderCode != null){ String recommenderEmailsDividedBySlash = jwtProvider.getRecommenderEmails(recommenderCode); List recommenderEmails = List.of(recommenderEmailsDividedBySlash.split("/")); - userRepository.reflectRecommendation(writer, recommenderEmails); + userRepository.reflectRecommendation(writer, recommenderEmails, user.getUserId()); } } } 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 13fee0b..21b1624 100644 --- a/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java +++ b/src/main/java/com/neighbors/tohero/domain/query/UserRepository.java @@ -15,6 +15,7 @@ public interface UserRepository { User getUser(Function> findUserFunction); void deleteUser(Consumer findUserConsumer); void reflectRecommendation(String writer, List recommenderEmails); + void reflectRecommendation(String writer, List recommenderEmails, long userId); 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 2a99843..d582493 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/entity/RecommendEntity.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/entity/RecommendEntity.java @@ -7,6 +7,7 @@ @Entity @Table(name = "`Recommend`") @NoArgsConstructor +@Getter public class RecommendEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -14,9 +15,11 @@ public class RecommendEntity { private long recommendId; @Column(name = "recommendedPeopleName") - @Getter private String recommendedPeopleName; + @Column(name = "recommendedPeopleId") + private String recommendedPeopleId = null; + @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "user_id", nullable = true) private UserEntity userEntity; @@ -34,10 +37,25 @@ public void addRecommendedPeopleName(String recommendedPeopleName){ this.recommendedPeopleName = recommendedPeopleName; } + public void addRecommendedPeopleId(long recommendedPeopleId){ + if(this.recommendedPeopleId != null){ + this.recommendedPeopleId += "," +recommendedPeopleId; + return; + } + this.recommendedPeopleId = String.valueOf(recommendedPeopleId); + } + public String getRecommendedPeopleName(){ if(recommendedPeopleName == null){ return ""; } return recommendedPeopleName; } + + public String getRecommendedPeopleId(){ + if(recommendedPeopleId == null){ + return ""; + } + return recommendedPeopleId; + } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/LetterRepositoryImpl.java b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/LetterRepositoryImpl.java index 0fa50b9..094c4f4 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/LetterRepositoryImpl.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/LetterRepositoryImpl.java @@ -26,7 +26,7 @@ public class LetterRepositoryImpl implements LetterRepository { @Override public long getTotalLetterNumber() { - return letterEntityRepository.countPublicLetter(); + return letterEntityRepository.countAllLetter(); } @Override 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 95ce92d..fb9cffc 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,9 +13,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.function.Consumer; import java.util.function.Function; @@ -90,6 +88,24 @@ public void reflectRecommendation(String writer, List recommenderEmails) recommendEntityRepository.saveAll(recommendEntities); } + @Override + public void reflectRecommendation(String writer, List recommenderEmails, long userId) { + List recommendEntities = recommendEntityRepository.findAllByUserEmailIn(recommenderEmails); + + String userIdStr = String.valueOf(userId); + recommendEntities.stream() + .filter(entity -> + Arrays.stream(entity.getRecommendedPeopleId().split(",")) + .noneMatch(id -> id.equals(userIdStr)) + ) + .forEach(entity -> { + entity.addRecommendedPeopleId(userId); + entity.addRecommendedPeopleName(writer); + }); + + recommendEntityRepository.saveAll(recommendEntities); + } + @Override public User getUserForSharing(Function> findUserFunction) { UserEntity matchedUserEntity = getUserEntity(findUserFunction); @@ -125,23 +141,32 @@ private void updateUserRecommenders(UserEntity userEntity, String recommenderEma //이전 사람 이름 저장 String lastUserEmail = recommenderEmailsDividedBySlash.split("/")[recommenderEmailsDividedBySlash.split("/").length - 1]; UserEntity lastUserEntity = getUserEntity(repo -> repo.findByEmail(lastUserEmail)); - userEntity.getRecommendEntity().addRecommendedPeopleName(lastUserEntity.getNickName()); + + boolean isNotExistId = false; + isNotExistId = Arrays.stream(userEntity.getRecommendEntity().getRecommendedPeopleId().split(",")) + .noneMatch(id -> id.equals(String.valueOf(lastUserEntity.getUserId()))); + + if(isNotExistId){ + userEntity.getRecommendEntity().addRecommendedPeopleName(lastUserEntity.getNickName()); + userEntity.getRecommendEntity().addRecommendedPeopleId(lastUserEntity.getUserId()); + } 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(); + List existedRecommendersEmail = new ArrayList<>(Arrays.asList(userEntity.getRecommenders().split("/"))); + List addedRecommendersEmail = Arrays.asList(recommenderEmailsDividedBySlash.split("/")); - String result = userEntity.getRecommenders() + "/" + recommenderEmailsDividedBySlash; - if(existedRecommendersEmail.size() + addedRecommendersEmail.size() > 5){ - existedRecommendersEmail.addAll(addedRecommendersEmail); + // 순서를 유지하며 중복 제거 + LinkedHashSet uniqueEmails = new LinkedHashSet<>(existedRecommendersEmail); + uniqueEmails.addAll(addedRecommendersEmail); - int size = existedRecommendersEmail.size(); - List lastFive = existedRecommendersEmail.subList(Math.max(0, size - 5), size); + // 마지막 5개만 유지 + List lastFive = new ArrayList<>(uniqueEmails); + int size = lastFive.size(); + List resultEmails = lastFive.subList(Math.max(0, size - 5), size); - result = String.join("/", lastFive); - } - userEntity.setRecommenders(result); + // 추천인 리스트 업데이트 + userEntity.setRecommenders(String.join("/", resultEmails)); } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java b/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java index 67142a9..a261da2 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java @@ -17,8 +17,8 @@ public interface LetterEntityRepository extends JpaRepository> findPagedLetterEntity(Pageable pageable); - @Query("SELECT COUNT(le) FROM LetterEntity le WHERE le.isPublic = true") - long countPublicLetter(); + @Query("SELECT COUNT(le) FROM LetterEntity le") + long countAllLetter(); @Query("SELECT le FROM LetterEntity le WHERE le.user.userId = :userId") Optional> findAllByUserId(@Param("userId") Long userId); diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java index d00e298..af0a5ec 100644 --- a/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java +++ b/src/main/java/com/neighbors/tohero/presentation/controller/SharingController.java @@ -19,7 +19,7 @@ public class SharingController { private final SharingService sharingService; - @Operation(summary = "공유하기 API", description = "공유하기 메시지보낼 때 사용할 추천인 코드를 생성해주는 API입니다.") + @Operation(summary = "공유하기 API", description = "공유하기 메시지 보낼 때 사용할 추천인 코드를 생성해주는 API입니다.") @GetMapping("/recommenderCode") public ResponseEntity getRecommenderCode( @Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail