From d95a237f357415f345e846918e06940e5f59a2b7 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Sat, 1 Feb 2025 14:03:39 +0900 Subject: [PATCH 1/5] =?UTF-8?q?validation=20:=20=ED=8E=B8=EC=A7=80=20?= =?UTF-8?q?=EB=82=B4=EC=9A=A9=20=EA=B8=80=EC=9E=90=20=EC=88=98=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tohero/application/letter/dto/CreateLetterRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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) From e5b5f53ab86a774a538b98e6520fdb04f84b8c29 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Sat, 1 Feb 2025 14:07:58 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor=20:=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=ED=8E=B8=EC=A7=80=20=EA=B0=9C?= =?UTF-8?q?=EC=88=98=20=EC=A1=B0=ED=9A=8C=EC=97=90=20=EB=B9=84=EA=B3=B5?= =?UTF-8?q?=EA=B0=9C=20=ED=8E=B8=EC=A7=80=EB=8F=84=20=ED=8F=AC=ED=95=A8?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/query/impl/LetterRepositoryImpl.java | 2 +- .../infrastructure/repository/LetterEntityRepository.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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/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); From e1283f8bb8f1157f89d5465e24d7f54073beb779 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Sat, 1 Feb 2025 14:13:39 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor=20:=20=EB=82=B4=EA=B0=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=ED=95=9C=20=ED=8E=B8=EC=A7=80=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EB=B3=B4=EA=B8=B0=20API=20=EC=97=90=EC=84=9C=20DTO?= =?UTF-8?q?=EC=97=90=20=EC=83=9D=EC=84=B1=20=EB=82=A0=EC=A7=9C=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 --- .../application/letter/dto/GetLetterDetailResponse.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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())); } } From e58cd5334eac2f0997a565758b62dbb78bf0e711 Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Sat, 1 Feb 2025 14:23:17 +0900 Subject: [PATCH 4/5] =?UTF-8?q?refactor=20:=20=EC=B6=94=EC=B2=9C=EC=9D=B8?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=A4=91=EB=B3=B5=EC=9D=B4=20?= =?UTF-8?q?=EC=95=88=EB=90=98=EB=8F=84=EB=A1=9D=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tohero/application/sharing/service/SharingService.java | 5 ++++- .../tohero/presentation/controller/SharingController.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) 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/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 From 84e7c1be31da6fb2814e46d34d916cddd95e5d0e Mon Sep 17 00:00:00 2001 From: imscow11253 Date: Sat, 1 Feb 2025 15:54:51 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat=20:=20=EA=B3=B5=EC=9C=A0=ED=95=98?= =?UTF-8?q?=EA=B8=B0=EC=97=90=EC=84=9C=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=EA=B0=80=20=EC=9E=91=EC=84=B1=ED=95=9C=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=B6=94=EC=B2=9C=EC=9D=B8=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EC=95=88=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20(1.30=20QA=20=EB=82=B4=EC=9A=A9=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../letter/service/LetterService.java | 1 + .../domain/letter/service/CreateLetter.java | 3 +- .../tohero/domain/query/UserRepository.java | 1 + .../entity/RecommendEntity.java | 20 ++++++- .../query/impl/UserRepositoryImpl.java | 53 ++++++++++++++----- 5 files changed, 62 insertions(+), 16 deletions(-) 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/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/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)); } }