Skip to content

Commit b36ffc2

Browse files
committed
feat: 찜한 아티스트 공연 기록
1 parent 50e5474 commit b36ffc2

6 files changed

Lines changed: 69 additions & 8 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/artists/controller/ArtistsController.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.back.web7_9_codecrete_be.domain.artists.dto.request.UpdateRequest;
66
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ArtistListResponse;
77
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ArtistDetailResponse;
8+
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ConcertListByArtistResponse;
89
import com.back.web7_9_codecrete_be.domain.artists.dto.response.SearchResponse;
910
import com.back.web7_9_codecrete_be.domain.artists.service.ArtistService;
1011
import com.back.web7_9_codecrete_be.domain.artists.service.ArtistEnrichService;
@@ -125,28 +126,31 @@ public RsData<Void> saveConcertArtist(
125126
return RsData.success("아티스트 공연 기록 저장 성공", null);
126127
}
127128

128-
@Operation(summary = "개인화된 공연 리스트 생성", description = "유저가 찜한 아티스트를 기반으로 공연 리스트를 생성합니다.")
129-
@PostMapping("/list")
130-
public void concertList() {}
129+
@Operation(summary = "개인화된 공연 리스트 생성", description = "유저가 찜한 아티스트들의 공연 리스트를 조회합니다. 로그인한 유저만 가능합니다.")
130+
@GetMapping("/list")
131+
public RsData<List<ConcertListByArtistResponse>> concertList() {
132+
User user = rq.getUser();
133+
return RsData.success("찜한 아티스트 공연 리스트 조회 성공", artistService.getConcertList(user.getId()));
134+
}
131135

132-
@Operation(summary = "아티스트 인기 순위", description = "Spotify 인기도를 바탕으로 아티스트 인기 순위 랭킹을 제공합니다.")
136+
@Operation(summary = "아티스트 인기 순위(구현 전)", description = "Spotify 인기도를 바탕으로 아티스트 인기 순위 랭킹을 제공합니다.")
133137
@GetMapping("/ranking")
134138
public void artistRanking() {}
135139

136-
@Operation(summary = "장르 기반 아티스트 추천", description = "찜한 장르를 기반으로 아티스트 추천 리스트를 제공합니다.")
140+
@Operation(summary = "장르 기반 아티스트 추천(구현 전)", description = "찜한 장르를 기반으로 아티스트 추천 리스트를 제공합니다.")
137141
@GetMapping("/recommendation/{genreId}")
138142
public void recommendArtist(
139143
@PathVariable Long genreId
140144
) {}
141145

142-
@Operation(summary = "공연 셋리스트 생성", description = "사용자가 공연 셋리스트를 생성합니다.")
146+
@Operation(summary = "공연 셋리스트 생성(구현 전)", description = "사용자가 공연 셋리스트를 생성합니다.")
143147
@PostMapping("/setlist/{concertId}/{artistId}")
144148
public void makeSetlist(
145149
@PathVariable Long concertId,
146150
@PathVariable Long artistId
147151
) {}
148152

149-
@Operation(summary = "공연 셋리스트 조회", description = "다른 사용자들이 생성한 셋리스트를 조회합니다.")
153+
@Operation(summary = "공연 셋리스트 조회(구현 전)", description = "다른 사용자들이 생성한 셋리스트를 조회합니다.")
150154
@GetMapping("/setlist/{concertId}/{artistId}")
151155
public void getSetlist(
152156
@PathVariable Long concertId,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.back.web7_9_codecrete_be.domain.artists.dto.response;
2+
3+
import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert;
4+
5+
import java.time.LocalDate;
6+
7+
public record ConcertListByArtistResponse(
8+
String concertName,
9+
LocalDate startDate,
10+
String concertPlace
11+
) {
12+
public static ConcertListByArtistResponse from(Concert concert) {
13+
return new ConcertListByArtistResponse(
14+
concert.getName(),
15+
concert.getStartDate(),
16+
concert.getConcertPlace().getPlaceName()
17+
);
18+
}
19+
}

src/main/java/com/back/web7_9_codecrete_be/domain/artists/repository/ArtistLikeRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,22 @@
44
import com.back.web7_9_codecrete_be.domain.artists.entity.ArtistLike;
55
import com.back.web7_9_codecrete_be.domain.users.entity.User;
66
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Query;
8+
import org.springframework.data.repository.query.Param;
79
import org.springframework.stereotype.Repository;
810

11+
import java.util.List;
912
import java.util.Optional;
1013

1114
@Repository
1215
public interface ArtistLikeRepository extends JpaRepository<ArtistLike, Long> {
1316
long countByArtistId(Long artistId);
1417
boolean existsByArtistAndUser(Artist artist, User user);
1518
Optional<ArtistLike> findByArtistAndUser(Artist artist, User user);
19+
@Query("""
20+
select al.artist.id
21+
from ArtistLike al
22+
where al.user.id = :userId
23+
""")
24+
List<Long> findArtistIdsByUserId(@Param("userId") Long userId);
1625
}

src/main/java/com/back/web7_9_codecrete_be/domain/artists/service/ArtistService.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.back.web7_9_codecrete_be.domain.artists.repository.ArtistRepository;
99
import com.back.web7_9_codecrete_be.domain.artists.repository.ArtistLikeRepository;
1010
import com.back.web7_9_codecrete_be.domain.artists.repository.ConcertArtistRepository;
11+
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ConcertListByArtistResponse;
1112
import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert;
1213
import com.back.web7_9_codecrete_be.domain.concerts.repository.ConcertRepository;
1314
import com.back.web7_9_codecrete_be.domain.concerts.service.ConcertService;
@@ -31,6 +32,7 @@ public class ArtistService {
3132
private final ArtistLikeRepository artistLikeRepository;
3233
private final ConcertArtistRepository concertArtistRepository;
3334
private final ConcertRepository concertRepository;
35+
private final ConcertService concertService;
3436

3537
@Transactional(readOnly = true)
3638
public Artist findArtist(Long artistId) {
@@ -158,11 +160,26 @@ public void deleteLikeArtist(Long artistId, User user) {
158160
@Transactional
159161
public void linkArtistConcert(Long artistId, Long concertId) {
160162
Artist artist = findArtist(artistId);
163+
// TODO: 멘토링 질문 남겨놓은 기능이라, 멘토링 후 구현 방향 확정되면 함수 선언 후 Service 사용 예정. 현재는 임시로 Repository 사용
161164
Concert concert = concertRepository.findById(concertId)
162165
.orElseThrow();
163-
164166
concertArtistRepository.save(new ConcertArtist(artist, concert));
165167
}
166168

169+
@Transactional(readOnly = true)
170+
public List<ConcertListByArtistResponse> getConcertList(Long userId) {
171+
List<Long> artistIds =
172+
artistLikeRepository.findArtistIdsByUserId(userId);
173+
174+
// 찜한 아티스트가 없는 경우 빈 배열 반환 -> 예외 처리(Error 던지기) 안 함
175+
if (artistIds.isEmpty()) {
176+
return List.of();
177+
}
178+
List<Concert> concerts = concertService.findConcertsByArtistIds(artistIds);
179+
return concerts.stream()
180+
.map(ConcertListByArtistResponse::from)
181+
.toList();
182+
}
183+
167184

168185
}

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,12 @@ List<ConcertItem> getConcertItemsByKeyword(
207207

208208

209209
Concert getConcertByConcertId(Long concertId);
210+
211+
@Query("""
212+
select distinct c
213+
from Concert c
214+
join ConcertArtist ca on ca.concert = c
215+
where ca.artist.id in :artistIds
216+
""")
217+
List<Concert> findDistinctByArtistIds(@Param("artistIds") List<Long> artistIds);
210218
}

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,8 @@ public void deleteConcert(long concertId) {
145145
concertRepository.deleteById(concertId);
146146
}
147147

148+
public List<Concert> findConcertsByArtistIds(List<Long> artistIds) {
149+
return concertRepository.findDistinctByArtistIds(artistIds);
150+
}
151+
148152
}

0 commit comments

Comments
 (0)