Skip to content

Commit 09092e4

Browse files
Merge pull request #198 from prgrms-web-devcourse-final-project/feat/#194
[Artist] 요구사항 구현
2 parents 1da4f21 + fb39d38 commit 09092e4

15 files changed

Lines changed: 223 additions & 69 deletions
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.back.web7_9_codecrete_be.domain.artists.controller;
2+
3+
import com.back.web7_9_codecrete_be.domain.artists.dto.request.CreateRequest;
4+
import com.back.web7_9_codecrete_be.domain.artists.dto.request.UpdateRequest;
5+
import com.back.web7_9_codecrete_be.domain.artists.service.ArtistService;
6+
import com.back.web7_9_codecrete_be.global.rsData.RsData;
7+
import io.swagger.v3.oas.annotations.Operation;
8+
import jakarta.validation.Valid;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.web.bind.annotation.*;
11+
12+
@RestController
13+
@RequestMapping("/api/v1/admin/artists")
14+
@RequiredArgsConstructor
15+
public class ArtistAdminController {
16+
17+
private final ArtistService artistService;
18+
19+
@Operation(summary = "아티스트 생성", description = "아티스트를 등록합니다.")
20+
@PostMapping()
21+
public RsData<Void> create(
22+
@Valid @RequestBody CreateRequest reqBody
23+
) {
24+
artistService.createArtist(reqBody.spotifyId(), reqBody.artistName(), reqBody.artistGroup(), reqBody.artistType(), reqBody.genreName());
25+
return RsData.success("아티스트 생성이 완료되었습니다.", null);
26+
}
27+
28+
@Operation(summary = "아티스트 정보 수정", description = "아티스트 정보를 수정합니다.")
29+
@PatchMapping("/{id}")
30+
public RsData<Void> update(
31+
@PathVariable Long id,
32+
@Valid @RequestBody UpdateRequest reqBody
33+
) {
34+
artistService.updateArtist(id, reqBody);
35+
return RsData.success("아티스트 정보 수정을 완료했습니다.", null);
36+
}
37+
38+
@Operation(summary = "아티스트 정보 삭제", description = "아티스트 정보를 삭제합니다.")
39+
@DeleteMapping("/{id}")
40+
public RsData<Void> delete(
41+
@PathVariable Long id
42+
) {
43+
artistService.delete(id);
44+
return RsData.success("아티스트 정보를 삭제했습니다.", null);
45+
}
46+
47+
}

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

Lines changed: 12 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
package com.back.web7_9_codecrete_be.domain.artists.controller;
22

3+
import com.back.web7_9_codecrete_be.domain.artists.dto.response.*;
34
import com.back.web7_9_codecrete_be.domain.artists.entity.ArtistSort;
45
import com.back.web7_9_codecrete_be.domain.artists.dto.request.CreateRequest;
56
import com.back.web7_9_codecrete_be.domain.artists.dto.request.SearchRequest;
67
import com.back.web7_9_codecrete_be.domain.artists.dto.request.UpdateRequest;
7-
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ArtistListResponse;
8-
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ArtistDetailResponse;
9-
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ConcertListByArtistResponse;
10-
import com.back.web7_9_codecrete_be.domain.artists.dto.response.SearchResponse;
118
import com.back.web7_9_codecrete_be.domain.artists.service.ArtistService;
129
import com.back.web7_9_codecrete_be.domain.artists.service.ArtistEnrichService;
1310
import com.back.web7_9_codecrete_be.domain.users.entity.User;
@@ -18,7 +15,6 @@
1815
import jakarta.validation.Valid;
1916
import lombok.RequiredArgsConstructor;
2017
import org.springframework.data.domain.Pageable;
21-
import org.springframework.data.domain.Slice;
2218
import org.springframework.web.bind.annotation.*;
2319

2420
import java.util.List;
@@ -57,52 +53,24 @@ public RsData<Integer> fetchMusicBrainzIds(
5753
return RsData.success("MusicBrainz ID 수집 성공", updated);
5854
}
5955

60-
@Operation(summary = "아티스트 생성", description = "아티스트를 등록합니다.")
61-
@PostMapping()
62-
public RsData<Void> create(
63-
@Valid @RequestBody CreateRequest reqBody
64-
) {
65-
artistService.createArtist(reqBody.spotifyID(), reqBody.artistName(), reqBody.artistGroup(), reqBody.artistType(), reqBody.genreName());
66-
return RsData.success("아티스트 생성이 완료되었습니다.", null);
67-
}
68-
6956
@Operation(summary = "아티스트 목록 조회",
7057
description = "아티스트 전체 목록을 조회합니다(NAME: 이름순 / LIKE: 인기순 (좋아요 많은 순)")
7158
@GetMapping()
72-
public RsData<Slice<ArtistListResponse>> list(
59+
public RsData<ArtistSliceResponse> list(
7360
Pageable pageable,
7461
@RequestParam(required = false) ArtistSort sort
7562
) {
7663
User user = rq.getUserOrNull(); // 로그인하지 않은 경우 null
77-
return RsData.success("아티스트 전체 목록을 조회했습니다.", artistService.listArtist(pageable, user, sort));
64+
return RsData.success("아티스트 전체 목록을 조회했습니다.",
65+
ArtistSliceResponse.from(artistService.listArtist(pageable, user, sort)));
7866
}
7967

8068
@Operation(summary = "아티스트 상세 조회", description = "아티스트의 상세 정보를 조회합니다.")
8169
@GetMapping("/{id}")
8270
public RsData<ArtistDetailResponse> artist(
8371
@PathVariable Long id
8472
) {
85-
User user = rq.getUserOrNull(); // 로그인하지 않은 경우 null
86-
return RsData.success("아티스트 상세 조회를 성공했습니다.", artistService.getArtistDetail(id, user));
87-
}
88-
89-
@Operation(summary = "아티스트 정보 수정", description = "아티스트 정보를 수정합니다.")
90-
@PatchMapping("/{id}")
91-
public RsData<Void> update(
92-
@PathVariable Long id,
93-
@Valid @RequestBody UpdateRequest reqBody
94-
) {
95-
artistService.updateArtist(id, reqBody);
96-
return RsData.success("아티스트 정보 수정을 완료했습니다.", null);
97-
}
98-
99-
@Operation(summary = "아티스트 정보 삭제", description = "아티스트 정보를 삭제합니다.")
100-
@DeleteMapping("/{id}")
101-
public RsData<Void> delete(
102-
@PathVariable Long id
103-
) {
104-
artistService.delete(id);
105-
return RsData.success("아티스트 정보를 삭제했습니다.", null);
73+
return RsData.success("아티스트 상세 조회를 성공했습니다.", artistService.getArtistDetail(id));
10674
}
10775

10876
@Operation(summary = "아티스트 검색",
@@ -151,6 +119,13 @@ public RsData<List<ConcertListByArtistResponse>> concertList() {
151119
return RsData.success("찜한 아티스트 공연 리스트 조회 성공", artistService.getConcertList(user.getId()));
152120
}
153121

122+
@Operation(summary = "유저가 찜한 아티스트 목록", description = "유저 Id 를 통해 해당 유저가 찜한 아티스트 목록을 조회합니다.")
123+
@GetMapping("/likes")
124+
public RsData<List<LikeArtistResponse>> findLikeArtists() {
125+
User user = rq.getUser();
126+
return RsData.success("유저가 찜한 아티스트 목록 조회 성공", artistService.findArtistsLikeByUserId(user));
127+
}
128+
154129
@Operation(summary = "아티스트 인기 순위(구현 전)", description = "Spotify 인기도를 바탕으로 아티스트 인기 순위 랭킹을 제공합니다.")
155130
@GetMapping("/ranking")
156131
public void artistRanking() {}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.back.web7_9_codecrete_be.domain.artists.controller;
2+
3+
import com.back.web7_9_codecrete_be.domain.artists.dto.response.GenreResponse;
4+
import com.back.web7_9_codecrete_be.domain.artists.service.GenreService;
5+
import com.back.web7_9_codecrete_be.global.rsData.RsData;
6+
import lombok.RequiredArgsConstructor;
7+
import org.springframework.web.bind.annotation.GetMapping;
8+
import org.springframework.web.bind.annotation.RequestMapping;
9+
import org.springframework.web.bind.annotation.RestController;
10+
11+
import java.util.List;
12+
13+
@RestController
14+
@RequestMapping("/api/v1/genre")
15+
@RequiredArgsConstructor
16+
public class GenreController {
17+
18+
private final GenreService genreService;
19+
20+
@GetMapping()
21+
public RsData<List<GenreResponse>> genreList() {
22+
return RsData.success("전체 장르 조회 성공", genreService.genreList());
23+
}
24+
}

src/main/java/com/back/web7_9_codecrete_be/domain/artists/dto/request/CreateRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public record CreateRequest(
1111
@NotBlank
1212
@Size(max = 30, message = "Spotify ID 는 필수로 입력해야합니다.")
1313
@Schema(description = "Spotify ID 입니다.")
14-
String spotifyID,
14+
String spotifyId,
1515

1616
@NotBlank(message = "아티스트 이름은 필수로 입력해야합니다.")
1717
@Size(max = 200, message = "아티스트 이름은 200자를 넘길 수 없습니다.")

src/main/java/com/back/web7_9_codecrete_be/domain/artists/dto/response/ArtistDetailResponse.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@
66
import java.util.List;
77

88
public record ArtistDetailResponse(
9+
@Schema(description = "아티스트 아이디입니다.")
10+
Long id,
11+
912
@Schema(description = "아티스트 이름입니다.")
1013
String artistName,
1114

15+
@Schema(description = "한국어 기준 아티스트 이름입니다.")
16+
String nameKo,
17+
1218
@Schema(description = "아티스트 소속 그룹입니다. 아티스트 이름이 그룹인 경우, null 로 처리됩니다.")
1319
String artistGroup,
1420

@@ -37,9 +43,6 @@ public record ArtistDetailResponse(
3743
List<TopTrackResponse> topTracks,
3844

3945
@Schema(description = "아티스트와 관련 있는 다른 아티스트 목록입니다.")
40-
List<RelatedArtistResponse> relatedArtists,
41-
42-
@Schema(description = "로그인한 유저의 좋아요 여부입니다. 비회원인 경우 false입니다.")
43-
Boolean isLiked
46+
List<RelatedArtistResponse> relatedArtists
4447
) {
4548
}

src/main/java/com/back/web7_9_codecrete_be/domain/artists/dto/response/ArtistListResponse.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ public record ArtistListResponse(
1212
@Schema(description = "아티스트 이름입니다.")
1313
String artistName,
1414

15+
@Schema(description = "한국어 기준 아티스트 이름 입니다.")
16+
String nameKo,
17+
1518
@Schema(description = "아티스트 소속 그룹입니다. 아티스트 이름이 그룹인 경우, null 로 처리됩니다.")
1619
String artistGroup,
1720

@@ -39,6 +42,7 @@ public static ArtistListResponse from(Artist artist) {
3942
return new ArtistListResponse(
4043
artist.getId(),
4144
artist.getArtistName(),
45+
artist.getNameKo(),
4246
artist.getArtistGroup(),
4347
genres,
4448
artist.getLikeCount(),
@@ -52,6 +56,7 @@ public static ArtistListResponse from(Artist artist, boolean isLiked) {
5256
return new ArtistListResponse(
5357
artist.getId(),
5458
artist.getArtistName(),
59+
artist.getNameKo(),
5560
artist.getArtistGroup(),
5661
genres,
5762
artist.getLikeCount(),
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.back.web7_9_codecrete_be.domain.artists.dto.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import org.springframework.data.domain.Slice;
5+
6+
import java.util.List;
7+
8+
public record ArtistSliceResponse(
9+
@Schema(description = "아티스트 정보입니다.")
10+
List<ArtistListResponse> content
11+
) {
12+
public static ArtistSliceResponse from(Slice<ArtistListResponse> slice) {
13+
return new ArtistSliceResponse(
14+
slice.getContent()
15+
);
16+
}
17+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.back.web7_9_codecrete_be.domain.artists.dto.response;
2+
3+
import com.back.web7_9_codecrete_be.domain.artists.entity.Genre;
4+
5+
public record GenreResponse(
6+
Long genreId,
7+
String genreName
8+
) {
9+
public static GenreResponse from(Genre genre) {
10+
return new GenreResponse(
11+
genre.getId(),
12+
genre.getGenreName()
13+
);
14+
}
15+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.back.web7_9_codecrete_be.domain.artists.dto.response;
2+
3+
import com.back.web7_9_codecrete_be.domain.artists.entity.Artist;
4+
5+
public record LikeArtistResponse(
6+
Long artistId,
7+
String artistName,
8+
String nameKo,
9+
String imageUrl,
10+
boolean isLiked
11+
) {
12+
public static LikeArtistResponse from(Artist artist) {
13+
return new LikeArtistResponse(
14+
artist.getId(),
15+
artist.getArtistName(),
16+
artist.getNameKo(),
17+
artist.getImageUrl(),
18+
true
19+
);
20+
}
21+
}

src/main/java/com/back/web7_9_codecrete_be/domain/artists/dto/response/RelatedArtistResponse.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@
33
import io.swagger.v3.oas.annotations.media.Schema;
44

55
public record RelatedArtistResponse(
6+
@Schema(description = "아티스트 id 입니다.")
7+
Long id,
8+
69
@Schema(description = "아티스트 이름입니다.")
710
String artistName,
811

12+
@Schema(description = "한국어 기준 아티스트 이름입니다.")
13+
String nameKo,
14+
915
@Schema(description = "아티스트 사진 URL 입니다.")
1016
String imageUrl,
1117

0 commit comments

Comments
 (0)