Skip to content

Commit 0984588

Browse files
authored
Merge pull request #181 from ProjectArTrip/ART-177
[REFAC] Add favorite exhibit functionality to exhibit details
2 parents 2c5afbe + 25be121 commit 0984588

File tree

11 files changed

+97
-29
lines changed

11 files changed

+97
-29
lines changed

src/main/java/org/atdev/artrip/domain/exhibit/reponse/ExhibitDetailResponse.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ public class ExhibitDetailResponse {
2626
private Double hallLatitude;
2727
private Double hallLongitude;
2828

29+
private boolean isFavorite;
2930
}

src/main/java/org/atdev/artrip/domain/exhibit/service/ExhibitService.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.atdev.artrip.domain.exhibit.data.Exhibit;
55
import org.atdev.artrip.domain.exhibit.reponse.ExhibitDetailResponse;
66
import org.atdev.artrip.domain.exhibit.repository.ExhibitRepository;
7+
import org.atdev.artrip.domain.favortie.repository.FavoriteExhibitRepository;
78
import org.atdev.artrip.domain.home.converter.HomeConverter;
89
import org.atdev.artrip.global.apipayload.code.status.ExhibitError;
910
import org.atdev.artrip.global.apipayload.exception.GeneralException;
@@ -15,14 +16,20 @@ public class ExhibitService {
1516

1617
private final ExhibitRepository exhibitRepository;
1718
private final HomeConverter homeConverter;
19+
private final FavoriteExhibitRepository favoriteExhibitRepository;
1820

1921

20-
public ExhibitDetailResponse getExhibitDetail(Long exhibitId) {
22+
public ExhibitDetailResponse getExhibitDetail(Long exhibitId, Long userId) {
2123

2224
Exhibit exhibit = exhibitRepository.findById(exhibitId)
2325
.orElseThrow(() -> new GeneralException(ExhibitError._EXHIBIT_NOT_FOUND));
2426

25-
return homeConverter.toHomeExhibitResponse(exhibit);
27+
boolean isFavorite = false;
28+
if (userId != null ) {
29+
isFavorite = favoriteExhibitRepository.existsActive(userId, exhibitId);
30+
}
31+
32+
return homeConverter.toHomeExhibitResponse(exhibit, isFavorite);
2633
}
2734

2835

src/main/java/org/atdev/artrip/domain/exhibit/web/controller/ExhibitController.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import org.springframework.data.domain.Pageable;
1515
import org.springframework.data.web.PageableDefault;
1616
import org.springframework.http.ResponseEntity;
17+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
18+
import org.springframework.security.core.userdetails.UserDetails;
1719
import org.springframework.web.bind.annotation.*;
1820

1921
import java.util.List;
@@ -26,7 +28,9 @@ public class ExhibitController {
2628
private final HomeService homeService;
2729
private final ExhibitService exhibitService;
2830

29-
31+
private Long getUserId(UserDetails userDetails) {
32+
return userDetails != null ? Long.parseLong(userDetails.getUsername()) : null;
33+
}
3034
@Operation(summary = "장르 조회", description = "키워드 장르 데이터 전체 조회")
3135
@ApiErrorResponses(
3236
common = {CommonError._BAD_REQUEST, CommonError._UNAUTHORIZED},
@@ -45,9 +49,11 @@ public ResponseEntity<CommonResponse<List<String>>> getGenres(){
4549
)
4650
@GetMapping("/{id}")
4751
public ResponseEntity<CommonResponse<ExhibitDetailResponse>> getExhibit(
48-
@PathVariable Long id){
52+
@PathVariable Long id,
53+
@AuthenticationPrincipal UserDetails userDetails) {
4954

50-
ExhibitDetailResponse exhibit= exhibitService.getExhibitDetail(id);
55+
Long userId = getUserId(userDetails);
56+
ExhibitDetailResponse exhibit= exhibitService.getExhibitDetail(id, userId);
5157

5258
return ResponseEntity.ok(CommonResponse.onSuccess(exhibit));
5359
}
@@ -86,9 +92,10 @@ public ResponseEntity<CommonResponse<List<String>>> getDomestic(){
8692
@PostMapping("/filter")
8793
public ResponseEntity<FilterResponse> getDomesticFilter(@RequestBody ExhibitFilterRequest dto,
8894
@RequestParam(required = false) Long cursor,
89-
@PageableDefault(size = 20) Pageable pageable){
90-
91-
FilterResponse exhibits = homeService.getFilterExhibit(dto, pageable, cursor);
95+
@PageableDefault(size = 20) Pageable pageable,
96+
@AuthenticationPrincipal UserDetails userDetails) {
97+
Long userId = getUserId(userDetails);
98+
FilterResponse exhibits = homeService.getFilterExhibit(dto, pageable, cursor,userId);
9299

93100
return ResponseEntity.ok(exhibits);
94101

src/main/java/org/atdev/artrip/domain/exhibitHall/repository/ExhibitHallRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public interface ExhibitHallRepository extends JpaRepository<ExhibitHall, Long>
1717
@Query("SELECT DISTINCT e.country FROM ExhibitHall e WHERE e.country <> '한국'")
1818
List<String> findAllOverseasCountries();
1919

20-
@Query("SELECT DISTINCT e.region FROM ExhibitHall e WHERE e.country = '한국'")
20+
@Query("SELECT DISTINCT e.region FROM ExhibitHall e WHERE e.country IN ('한국', '대한민국')")
2121
List<String> findAllDomesticRegions();
2222

2323

src/main/java/org/atdev/artrip/domain/favortie/repository/FavoriteExhibitRepository.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.time.LocalDate;
99
import java.util.List;
1010
import java.util.Optional;
11+
import java.util.Set;
1112

1213
public interface FavoriteExhibitRepository extends JpaRepository<FavoriteExhibit, Long> {
1314
@Query("""
@@ -86,4 +87,11 @@ List<String> findDatesByYearMonth(
8687
AND f.exhibit.exhibitId = :exhibitId
8788
""")
8889
Optional<FavoriteExhibit> findByUserAndExhibit(@Param("userId") Long userId, @Param("exhibitId") Long exhibitId);
90+
91+
@Query("""
92+
SELECT f.exhibit.exhibitId
93+
FROM FavoriteExhibit f
94+
WHERE f.user.userId = :userId AND f.status = true
95+
""")
96+
Set<Long> findActiveExhibitIds(@Param("userId") Long userId);
8997
}

src/main/java/org/atdev/artrip/domain/favortie/service/FavoriteExhibitService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ private FavoriteResponse toFavoriteResponse(FavoriteExhibit favorite) {
182182
.title(exhibit.getTitle())
183183
.posterUrl(exhibit.getPosterUrl())
184184
.exhibitStatus(exhibit.getStatus())
185-
.favoriteStatus(favorite.isStatus())
185+
.active(favorite.isStatus())
186186
.exhibitPeriod(period)
187187
.exhibitHallName(hall != null ? hall.getName() : null )
188188
.country(hall != null ? hall.getCountry() : null)

src/main/java/org/atdev/artrip/domain/favortie/web/dto/response/FavoriteResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class FavoriteResponse {
1515
private String title;
1616
private String posterUrl;
1717
private Status exhibitStatus;
18-
private boolean favoriteStatus;
18+
private boolean active;
1919
private String exhibitPeriod;
2020
private String exhibitHallName;
2121
private String country;

src/main/java/org/atdev/artrip/domain/home/converter/HomeConverter.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ public class HomeConverter {
2020

2121
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
2222

23-
public FilterResponse toFilterResponse(Slice<Exhibit> slice) {
23+
public FilterResponse toFilterResponse(Slice<Exhibit> slice, Set<Long> favorites) {
2424

2525
List<HomeListResponse> postDtos = slice.getContent()
2626
.stream()
27-
.map(this::toHomeExhibitListResponse)
27+
.map(exhibit -> toHomeExhibitListResponse(exhibit, favorites.contains(exhibit.getExhibitId())))
2828
.toList();
2929

3030
Long nextCursor = slice.hasNext()
@@ -35,7 +35,7 @@ public FilterResponse toFilterResponse(Slice<Exhibit> slice) {
3535
}
3636

3737

38-
public HomeListResponse toHomeExhibitListResponse(Exhibit exhibit){
38+
public HomeListResponse toHomeExhibitListResponse(Exhibit exhibit, boolean isFavorite) {
3939

4040
String period = exhibit.getStartDate().format(formatter) + " - " + exhibit.getEndDate().format(formatter);
4141

@@ -45,10 +45,11 @@ public HomeListResponse toHomeExhibitListResponse(Exhibit exhibit){
4545
.posterUrl(exhibit.getPosterUrl())
4646
.status(exhibit.getStatus())
4747
.exhibitPeriod(period)
48+
.isFavorite(isFavorite)
4849
.build();
4950
}
5051

51-
public ExhibitDetailResponse toHomeExhibitResponse(Exhibit exhibit) {
52+
public ExhibitDetailResponse toHomeExhibitResponse(Exhibit exhibit, boolean isFavorite) {
5253

5354
var hall = exhibit.getExhibitHall();
5455
String period = exhibit.getStartDate().format(formatter) + " - " + exhibit.getEndDate().format(formatter);
@@ -64,13 +65,13 @@ public ExhibitDetailResponse toHomeExhibitResponse(Exhibit exhibit) {
6465
.ticketUrl(exhibit.getTicketUrl())
6566
.status(exhibit.getStatus())
6667
.exhibitPeriod(period)
67-
6868
.hallName(hall != null ? hall.getName() : null)// exhibit과 exhibithall이 연결되어있지않아도 체크 가능
6969
.hallAddress(hall != null ? hall.getAddress() : null)
7070
.hallOpeningHours(hall != null ? hall.getOpeningHours() : null)
7171
.hallPhone(hall != null ? hall.getPhone() : null)
7272
.hallLatitude(lat)
7373
.hallLongitude(lng)
74+
.isFavorite(isFavorite)
7475
.build();
7576
}
7677

src/main/java/org/atdev/artrip/domain/home/response/HomeListResponse.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,19 @@ public class HomeListResponse {
2525
private String countryName;
2626
private String regionName;
2727

28+
private boolean isFavorite;
29+
30+
public HomeListResponse(Long exhibit_id, String title, String posterUrl, Status status,
31+
String exhibitPeriod, String hallName, String countryName, String regionName) {
32+
this.exhibit_id = exhibit_id;
33+
this.title = title;
34+
this.posterUrl = posterUrl;
35+
this.status = status;
36+
this.exhibitPeriod = exhibitPeriod;
37+
this.hallName = hallName;
38+
this.countryName = countryName;
39+
this.regionName = regionName;
40+
this.isFavorite = false;
41+
}
2842
}
2943

src/main/java/org/atdev/artrip/domain/home/service/HomeService.java

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.atdev.artrip.domain.exhibit.data.Exhibit;
66
import org.atdev.artrip.domain.exhibit.web.dto.request.ExhibitFilterRequest;
77
import org.atdev.artrip.domain.exhibitHall.repository.ExhibitHallRepository;
8+
import org.atdev.artrip.domain.favortie.repository.FavoriteExhibitRepository;
89
import org.atdev.artrip.domain.home.converter.HomeConverter;
910
import org.atdev.artrip.domain.home.response.FilterResponse;
1011

@@ -22,7 +23,9 @@
2223
import org.springframework.stereotype.Service;
2324
import org.springframework.transaction.annotation.Transactional;
2425

26+
import java.util.Collections;
2527
import java.util.List;
28+
import java.util.Set;
2629

2730
@Service
2831
@RequiredArgsConstructor
@@ -33,8 +36,14 @@ public class HomeService {
3336
private final ExhibitHallRepository exhibitHallRepository;
3437
private final UserRepository userRepository;
3538
private final HomeConverter homeConverter;
39+
private final FavoriteExhibitRepository favoriteExhibitRepository;
3640

37-
41+
private Set<Long> getFavoriteIds(Long userId) {
42+
if (userId == null) {
43+
return Collections.emptySet();
44+
}
45+
return favoriteExhibitRepository.findActiveExhibitIds(userId);
46+
}
3847

3948
// // 큐레이션 전시
4049
// public List<HomeExhibitResponse> getCuratedExhibits() {
@@ -44,6 +53,9 @@ public class HomeService {
4453
// .toList();
4554
// }
4655

56+
private void setFavorites(List<HomeListResponse> result, Set<Long> favoriteIds) {
57+
result.forEach(r -> r.setFavorite(favoriteIds.contains(r.getExhibit_id())));
58+
}
4759

4860
// 장르 전체 조회
4961
public List<String> getAllGenres() {
@@ -62,11 +74,11 @@ public List<String> getDomestic(){
6274

6375

6476
//필터 전체 조회
65-
public FilterResponse getFilterExhibit(ExhibitFilterRequest dto, Pageable pageable, Long cursorId) {
77+
public FilterResponse getFilterExhibit(ExhibitFilterRequest dto, Pageable pageable, Long cursorId, Long userId) {
6678

6779
Slice<Exhibit> slice = exhibitRepository.findExhibitByFilters(dto, pageable, cursorId);
68-
69-
return homeConverter.toFilterResponse(slice);
80+
Set<Long> favoriteIds = getFavoriteIds(userId);
81+
return homeConverter.toFilterResponse(slice, favoriteIds);
7082
}
7183

7284
// 사용자 맞춤 전시 랜덤 추천
@@ -89,6 +101,9 @@ public List<HomeListResponse> getRandomPersonalized(Long userId, PersonalizedReq
89101

90102
List<HomeListResponse> results = exhibitRepository.findRandomExhibits(filter);
91103

104+
Set<Long> favoriteIds = getFavoriteIds(userId);
105+
setFavorites(results, favoriteIds);
106+
92107
adjustLocationFields(
93108
results,
94109
request.getIsDomestic(),
@@ -100,11 +115,14 @@ public List<HomeListResponse> getRandomPersonalized(Long userId, PersonalizedReq
100115
}
101116

102117
// 이번주 랜덤 전시 추천
103-
public List<HomeListResponse> getRandomSchedule(ScheduleRandomRequest request){
118+
public List<HomeListResponse> getRandomSchedule(ScheduleRandomRequest request, Long userId){
104119

105120
RandomExhibitRequest filter = homeConverter.from(request);
106121
List<HomeListResponse> results = exhibitRepository.findRandomExhibits(filter);
107122

123+
Set<Long> favoriteIds = getFavoriteIds(userId);
124+
setFavorites(results, favoriteIds);
125+
108126
adjustLocationFields(
109127
results,
110128
request.getIsDomestic(),
@@ -116,12 +134,15 @@ public List<HomeListResponse> getRandomSchedule(ScheduleRandomRequest request){
116134
}
117135

118136
// 장르별 전시 랜덤 추천
119-
public List<HomeListResponse> getRandomGenre(GenreRandomRequest request){
137+
public List<HomeListResponse> getRandomGenre(GenreRandomRequest request, Long userId){
120138

121139
RandomExhibitRequest filter = homeConverter.fromGenre(request);
122140

123141
List<HomeListResponse> results = exhibitRepository.findRandomExhibits(filter);
124142

143+
Set<Long> favoriteIds = getFavoriteIds(userId);
144+
setFavorites(results, favoriteIds);
145+
125146
adjustLocationFields(
126147
results,
127148
request.getIsDomestic(),
@@ -133,12 +154,15 @@ public List<HomeListResponse> getRandomGenre(GenreRandomRequest request){
133154
}
134155

135156
// 오늘날 전시 랜덤 추천
136-
public List<HomeListResponse> getRandomToday(TodayRandomRequest request){
157+
public List<HomeListResponse> getRandomToday(TodayRandomRequest request, Long userId){
137158

138159
RandomExhibitRequest filter = homeConverter.fromToday(request);
139160

140161
List<HomeListResponse> results = exhibitRepository.findRandomExhibits(filter);
141162

163+
Set<Long> favoriteIds = getFavoriteIds(userId);
164+
setFavorites(results, favoriteIds);
165+
142166
adjustLocationFields(
143167
results,
144168
request.getIsDomestic(),

0 commit comments

Comments
 (0)