Skip to content

Commit 134a4df

Browse files
committed
[Feat] Add favorite status to search detail API
1 parent 06cbd0b commit 134a4df

3 files changed

Lines changed: 53 additions & 14 deletions

File tree

src/main/java/boombimapi/domain/favorite/repository/FavoriteRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package boombimapi.domain.favorite.repository;
22

33
import boombimapi.domain.favorite.entity.Favorite;
4+
import boombimapi.domain.place.entity.MemberPlace;
45
import boombimapi.domain.place.entity.PlaceType;
56
import java.util.List;
7+
import java.util.Optional;
68

79
import boombimapi.domain.member.domain.entity.Member;
810
import feign.Param;
@@ -27,6 +29,13 @@ List<Favorite> findAllByMemberId(
2729
String memberId
2830
);
2931

32+
// 즐겨 찾기 여부
33+
Optional<Favorite> findByMemberAndPlaceIdAndPlaceType(
34+
Member member,
35+
Long placeId,
36+
PlaceType placeType
37+
);
38+
3039
// @Query("SELECT f FROM Favorite f " +
3140
// "JOIN FETCH f.memberPlace mp " +
3241
// "JOIN FETCH mp.memberCongestions mc " +

src/main/java/boombimapi/domain/search/application/impl/SearchServiceImpl.java

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
import boombimapi.domain.congestion.entity.OfficialCongestion;
55
import boombimapi.domain.congestion.repository.MemberCongestionRepository;
66
import boombimapi.domain.congestion.repository.OfficialCongestionRepository;
7+
import boombimapi.domain.favorite.entity.Favorite;
8+
import boombimapi.domain.favorite.repository.FavoriteRepository;
79
import boombimapi.domain.member.domain.entity.Member;
810
import boombimapi.domain.member.domain.repository.MemberRepository;
911
import boombimapi.domain.place.entity.MemberPlace;
1012
import boombimapi.domain.place.entity.OfficialPlace;
13+
import boombimapi.domain.place.entity.PlaceType;
1114
import boombimapi.domain.place.repository.MemberPlaceRepository;
1215
import boombimapi.domain.place.repository.OfficialPlaceRepository;
1316
import boombimapi.domain.search.application.SearchService;
@@ -49,6 +52,7 @@ public class SearchServiceImpl implements SearchService {
4952
// 혼잡도
5053
private final OfficialCongestionRepository officialCongestionRepository;
5154
private final MemberCongestionRepository memberCongestionRepository;
55+
private final FavoriteRepository favoriteRepository;
5256

5357
@Override
5458
public List<SearchHistoryRes> getSearchHistory(String userId) {
@@ -99,8 +103,11 @@ public List<SearchRelatedRes> getSearchRelated(String posName) {
99103

100104
@Override
101105
public List<SearchRes> getSearch(String posName, String userId) {
106+
Member member = memberRepository.findById(userId)
107+
.orElseThrow(() -> new BoombimException(ErrorCode.USER_NOT_EXIST));
108+
102109
if (!Objects.equals(posName, "")) {
103-
saveSearchWord(posName, userId); // 공백은 저장 X
110+
saveSearchWord(posName, member); // 공백은 저장 X
104111
}
105112

106113

@@ -113,7 +120,7 @@ public List<SearchRes> getSearch(String posName, String userId) {
113120
officialPlaceRepository.findEntitiesByNameContainingIgnoreCase(posName, limit10);
114121

115122

116-
return sortedCongestion(memberPlaceEntities, officialEntities);
123+
return sortedCongestion(memberPlaceEntities, officialEntities, member);
117124

118125
}
119126

@@ -142,9 +149,7 @@ public void deleteAll(String userId) {
142149
}
143150

144151

145-
private void saveSearchWord(String posName, String userId) {
146-
Member member = memberRepository.findById(userId)
147-
.orElseThrow(() -> new BoombimException(ErrorCode.USER_NOT_EXIST));
152+
private void saveSearchWord(String posName, Member member) {
148153

149154
Search findSearch = searchRepository.findBySearchWord(posName).orElse(null);
150155
if (findSearch == null) {
@@ -154,29 +159,50 @@ private void saveSearchWord(String posName, String userId) {
154159
}
155160

156161
// 장소마다 혼잡도 조회해서 정보 넘겨줘야됨
157-
private List<SearchRes> sortedCongestion(List<MemberPlace> memberPlaceEntities, List<OfficialPlace> officialEntities) {
162+
private List<SearchRes> sortedCongestion(List<MemberPlace> memberPlaceEntities, List<OfficialPlace> officialEntities, Member member) {
163+
// 서버에 있는 장소들이 매개변수로 넘어옴
164+
158165
List<SearchRes> result = new ArrayList<>();
159166

167+
160168
for (MemberPlace memberPlace : memberPlaceEntities) {
161169

170+
boolean favoriteFlag = false;
171+
172+
// 해당 장소 즐겨찾기 여부
173+
Favorite favorite = favoriteRepository.findByMemberAndPlaceIdAndPlaceType(member, memberPlace.getId(), PlaceType.MEMBER_PLACE).orElse(null);
174+
if (favorite != null) favoriteFlag = true;
175+
176+
// 혼잡도 정보 때문에 즉 붐빔 키워드랑 최신 반영 날짜 때문에
162177
MemberCongestion latestMember =
163178
memberCongestionRepository.findTop1ByMemberPlaceIdOrderByCreatedAtDesc(memberPlace.getId()).orElse(null);
164179

165180
if (latestMember != null) {
166-
167-
168181
result.add(SearchRes.of(memberPlace.getId(), memberPlace.getName(), latestMember.getCreatedAt(),
169-
latestMember.getCongestionLevel().getName(), memberPlace.getAddress(), memberPlace.getImageUrl(), "사용자"));
182+
latestMember.getCongestionLevel().getName(), memberPlace.getAddress(), memberPlace.getImageUrl(), PlaceType.MEMBER_PLACE, favoriteFlag));
170183
}
171184
}
172185

173186

174187
for (OfficialPlace official : officialEntities) {
188+
189+
190+
boolean favoriteFlag = false;
191+
192+
// 해당 장소 즐겨찾기 여부
193+
Favorite favorite = favoriteRepository.findByMemberAndPlaceIdAndPlaceType(member, official.getId(), PlaceType.OFFICIAL_PLACE).orElse(null);
194+
if (favorite != null) favoriteFlag = true;
195+
175196
OfficialCongestion latestOfficial =
176197
officialCongestionRepository.findTopByOfficialPlaceIdOrderByObservedAtDesc(official.getId()).orElse(null);
198+
199+
// 혼잡도 정보 때문에 즉 붐빔 키워드랑 최신 반영 날짜 때문에 하지만 사용자가 올린거랑 다르게 null 도 존재함 애초에 공식 장소라
177200
if (latestOfficial != null) {
178201
result.add(SearchRes.of(official.getId(), official.getName(), latestOfficial.getObservedAt(),
179-
latestOfficial.getCongestionLevel().getName(), "", official.getImageUrl(), "공식"));
202+
latestOfficial.getCongestionLevel().getName(), null, official.getImageUrl(), PlaceType.OFFICIAL_PLACE, favoriteFlag));
203+
} else {
204+
result.add(SearchRes.of(official.getId(), official.getName(), null,
205+
null, null, official.getImageUrl(), PlaceType.OFFICIAL_PLACE, favoriteFlag));
180206
}
181207
}
182208

src/main/java/boombimapi/domain/search/presentation/dto/res/SearchRes.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.time.LocalDateTime;
44

5+
import boombimapi.domain.place.entity.PlaceType;
56
import io.swagger.v3.oas.annotations.media.Schema;
67

78
@Schema(description = "검색 결과 응답 모델")
@@ -25,21 +26,24 @@ public record SearchRes(
2526
@Schema(description = "이미지 URL // 원래 공식만 주는게 맞는데 나중을 사용자도 올린거 다 주겠음", example = "https://example.com/image.jpg")
2627
String imageUrl,
2728

28-
@Schema(description = "장소 유형", example = "공식 or 사용자가 올린거")
29-
String placeType
29+
@Schema(description = "장소 유형", example = "OFFICIAL_PLACE / MEMBER_PLACE")
30+
PlaceType placeType,
31+
@Schema(description = "즐겨찾기 여부 true면 한거 false면 안한거", example = "true or false")
32+
boolean favoriteFlag
3033

3134
) {
3235
@Schema(description = "SearchRes 객체 생성을 위한 팩토리 메서드")
3336
public static SearchRes of(Long id, String posName, LocalDateTime timeAt,
34-
String answerType, String address, String imageUrl, String placeType) {
37+
String answerType, String address, String imageUrl, PlaceType placeType, boolean favoriteFlag) {
3538
return new SearchRes(
3639
id,
3740
posName,
3841
timeAt,
3942
answerType,
4043
address,
4144
imageUrl,
42-
placeType
45+
placeType,
46+
favoriteFlag
4347
);
4448
}
4549
}

0 commit comments

Comments
 (0)