Skip to content

Commit 84e7c1b

Browse files
committed
feat : 공유하기에서 로그인 유저가 작성한 경우 추천인 중복 안되도록 설정 (1.30 QA 내용 반영 )
1 parent e58cd53 commit 84e7c1b

File tree

5 files changed

+62
-16
lines changed

5 files changed

+62
-16
lines changed

src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class LetterService {
3030
private final UpdateLetter updateLetter;
3131
private final DeleteLetter deleteLetter;
3232

33+
@Transactional
3334
public BaseResponse<CreateLetterResponse> createLetter(final JwtUserDetails jwtUserDetail, final CreateLetterRequest createLetterRequest) {
3435

3536
throwExceptionIfAddressIsNotExist(createLetterRequest.addressId());

src/main/java/com/neighbors/tohero/domain/domain/letter/service/CreateLetter.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public long createLetter(long userId, String writer, CreateLetterRequest createL
3131
recommenderEmailDividedBySlash = jwtProvider.getRecommenderEmails(createLetterRequest.recommenderCode());
3232
}
3333
User user = userRepository.getUserAndUpdateRecommenders(repo -> repo.findByUserId(userId), recommenderEmailDividedBySlash);
34+
3435
Letter newLetter;
3536
try{
3637
Address address = addressRepository.getAddressById(createLetterRequest.addressId());
@@ -110,7 +111,7 @@ private void reflectRecommendation(User user, String writer, String recommenderC
110111
if(recommenderCode != null){
111112
String recommenderEmailsDividedBySlash = jwtProvider.getRecommenderEmails(recommenderCode);
112113
List<String> recommenderEmails = List.of(recommenderEmailsDividedBySlash.split("/"));
113-
userRepository.reflectRecommendation(writer, recommenderEmails);
114+
userRepository.reflectRecommendation(writer, recommenderEmails, user.getUserId());
114115
}
115116
}
116117
}

src/main/java/com/neighbors/tohero/domain/query/UserRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public interface UserRepository {
1515
User getUser(Function<UserEntityRepository, Optional<UserEntity>> findUserFunction);
1616
void deleteUser(Consumer<UserEntityRepository> findUserConsumer);
1717
void reflectRecommendation(String writer, List<String> recommenderEmails);
18+
void reflectRecommendation(String writer, List<String> recommenderEmails, long userId);
1819
User getUserForSharing(Function<UserEntityRepository, Optional<UserEntity>> findUserFunction);
1920
User getUserAndUpdateRecommenders(Function<UserEntityRepository, Optional<UserEntity>> findUserFunction, String recommenderCode);
2021
}

src/main/java/com/neighbors/tohero/infrastructure/entity/RecommendEntity.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@
77
@Entity
88
@Table(name = "`Recommend`")
99
@NoArgsConstructor
10+
@Getter
1011
public class RecommendEntity {
1112
@Id
1213
@GeneratedValue(strategy = GenerationType.IDENTITY)
1314
@Column(name = "recommend_id")
1415
private long recommendId;
1516

1617
@Column(name = "recommendedPeopleName")
17-
@Getter
1818
private String recommendedPeopleName;
1919

20+
@Column(name = "recommendedPeopleId")
21+
private String recommendedPeopleId = null;
22+
2023
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
2124
@JoinColumn(name = "user_id", nullable = true)
2225
private UserEntity userEntity;
@@ -34,10 +37,25 @@ public void addRecommendedPeopleName(String recommendedPeopleName){
3437
this.recommendedPeopleName = recommendedPeopleName;
3538
}
3639

40+
public void addRecommendedPeopleId(long recommendedPeopleId){
41+
if(this.recommendedPeopleId != null){
42+
this.recommendedPeopleId += "," +recommendedPeopleId;
43+
return;
44+
}
45+
this.recommendedPeopleId = String.valueOf(recommendedPeopleId);
46+
}
47+
3748
public String getRecommendedPeopleName(){
3849
if(recommendedPeopleName == null){
3950
return "";
4051
}
4152
return recommendedPeopleName;
4253
}
54+
55+
public String getRecommendedPeopleId(){
56+
if(recommendedPeopleId == null){
57+
return "";
58+
}
59+
return recommendedPeopleId;
60+
}
4361
}

src/main/java/com/neighbors/tohero/infrastructure/query/impl/UserRepositoryImpl.java

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@
1313
import lombok.RequiredArgsConstructor;
1414
import org.springframework.stereotype.Repository;
1515

16-
import java.util.Arrays;
17-
import java.util.List;
18-
import java.util.Optional;
16+
import java.util.*;
1917
import java.util.function.Consumer;
2018
import java.util.function.Function;
2119

@@ -90,6 +88,24 @@ public void reflectRecommendation(String writer, List<String> recommenderEmails)
9088
recommendEntityRepository.saveAll(recommendEntities);
9189
}
9290

91+
@Override
92+
public void reflectRecommendation(String writer, List<String> recommenderEmails, long userId) {
93+
List<RecommendEntity> recommendEntities = recommendEntityRepository.findAllByUserEmailIn(recommenderEmails);
94+
95+
String userIdStr = String.valueOf(userId);
96+
recommendEntities.stream()
97+
.filter(entity ->
98+
Arrays.stream(entity.getRecommendedPeopleId().split(","))
99+
.noneMatch(id -> id.equals(userIdStr))
100+
)
101+
.forEach(entity -> {
102+
entity.addRecommendedPeopleId(userId);
103+
entity.addRecommendedPeopleName(writer);
104+
});
105+
106+
recommendEntityRepository.saveAll(recommendEntities);
107+
}
108+
93109
@Override
94110
public User getUserForSharing(Function<UserEntityRepository, Optional<UserEntity>> findUserFunction) {
95111
UserEntity matchedUserEntity = getUserEntity(findUserFunction);
@@ -125,23 +141,32 @@ private void updateUserRecommenders(UserEntity userEntity, String recommenderEma
125141
//이전 사람 이름 저장
126142
String lastUserEmail = recommenderEmailsDividedBySlash.split("/")[recommenderEmailsDividedBySlash.split("/").length - 1];
127143
UserEntity lastUserEntity = getUserEntity(repo -> repo.findByEmail(lastUserEmail));
128-
userEntity.getRecommendEntity().addRecommendedPeopleName(lastUserEntity.getNickName());
144+
145+
boolean isNotExistId = false;
146+
isNotExistId = Arrays.stream(userEntity.getRecommendEntity().getRecommendedPeopleId().split(","))
147+
.noneMatch(id -> id.equals(String.valueOf(lastUserEntity.getUserId())));
148+
149+
if(isNotExistId){
150+
userEntity.getRecommendEntity().addRecommendedPeopleName(lastUserEntity.getNickName());
151+
userEntity.getRecommendEntity().addRecommendedPeopleId(lastUserEntity.getUserId());
152+
}
129153
userEntityRepository.save(userEntity);
130154
}
131155

132156
private void queueingUserRecommenders(UserEntity userEntity, String recommenderEmailsDividedBySlash) {
133-
List<String> existedRecommendersEmail = new java.util.ArrayList<>(Arrays.stream(userEntity.getRecommenders().split("/")).toList());
134-
List<String> addedRecommendersEmail = Arrays.stream(recommenderEmailsDividedBySlash.split("/")).toList();
157+
List<String> existedRecommendersEmail = new ArrayList<>(Arrays.asList(userEntity.getRecommenders().split("/")));
158+
List<String> addedRecommendersEmail = Arrays.asList(recommenderEmailsDividedBySlash.split("/"));
135159

136-
String result = userEntity.getRecommenders() + "/" + recommenderEmailsDividedBySlash;
137-
if(existedRecommendersEmail.size() + addedRecommendersEmail.size() > 5){
138-
existedRecommendersEmail.addAll(addedRecommendersEmail);
160+
// 순서를 유지하며 중복 제거
161+
LinkedHashSet<String> uniqueEmails = new LinkedHashSet<>(existedRecommendersEmail);
162+
uniqueEmails.addAll(addedRecommendersEmail);
139163

140-
int size = existedRecommendersEmail.size();
141-
List<String> lastFive = existedRecommendersEmail.subList(Math.max(0, size - 5), size);
164+
// 마지막 5개만 유지
165+
List<String> lastFive = new ArrayList<>(uniqueEmails);
166+
int size = lastFive.size();
167+
List<String> resultEmails = lastFive.subList(Math.max(0, size - 5), size);
142168

143-
result = String.join("/", lastFive);
144-
}
145-
userEntity.setRecommenders(result);
169+
// 추천인 리스트 업데이트
170+
userEntity.setRecommenders(String.join("/", resultEmails));
146171
}
147172
}

0 commit comments

Comments
 (0)