Skip to content

Commit 2cedc1d

Browse files
2 parents 973fe1a + b8b72c4 commit 2cedc1d

51 files changed

Lines changed: 1177 additions & 172 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ jobs:
3434
TMAP_API_KEY: ${{ secrets.TMAP_API_KEY }}
3535
KAKAOMAP_API_KEY: ${{ secrets.KAKAOMAP_API_KEY }}
3636

37-
37+
KAKAO_REST_API_KEY: ${{ secrets.KAKAO_REST_API_KEY }}
38+
KAKAO_CLIENT_SECRET: ${{ secrets.KAKAO_CLIENT_SECRET }}
39+
KAKAO_REDIRECT_URI: ${{ secrets.KAKAO_REDIRECT_URI }}
3840

3941
steps:
4042
- name: Checkout

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

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package com.back.web7_9_codecrete_be.domain.artists.controller;
22

33
import com.back.web7_9_codecrete_be.domain.artists.dto.request.CreateRequest;
4+
import com.back.web7_9_codecrete_be.domain.artists.dto.request.SearchRequest;
45
import com.back.web7_9_codecrete_be.domain.artists.dto.request.UpdateRequest;
56
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ArtistListResponse;
67
import com.back.web7_9_codecrete_be.domain.artists.dto.response.ArtistDetailResponse;
8+
import com.back.web7_9_codecrete_be.domain.artists.dto.response.SearchResponse;
79
import com.back.web7_9_codecrete_be.domain.artists.service.ArtistService;
810
import com.back.web7_9_codecrete_be.domain.artists.service.ArtistEnrichService;
11+
import com.back.web7_9_codecrete_be.domain.users.entity.User;
12+
import com.back.web7_9_codecrete_be.global.rq.Rq;
913
import com.back.web7_9_codecrete_be.global.rsData.RsData;
1014
import io.swagger.v3.oas.annotations.Operation;
1115
import io.swagger.v3.oas.annotations.tags.Tag;
16+
import jakarta.validation.Valid;
1217
import lombok.RequiredArgsConstructor;
1318
import org.springframework.web.bind.annotation.*;
1419

@@ -21,8 +26,9 @@
2126
public class ArtistsController {
2227
private final ArtistService artistService;
2328
private final ArtistEnrichService enrichService;
29+
private final Rq rq;
2430

25-
@Operation(summary = "아티스트 저장", description = "임의의 가수 300명(or 팀)을 DB에 저장합니다.")
31+
@Operation(summary = "아티스트 저장", description = "임의의 가수(or 팀)을 DB에 저장합니다.")
2632
@GetMapping("/saved")
2733
public RsData<Integer> saveArtist() {
2834
int saved = artistService.setArtist();
@@ -41,9 +47,9 @@ public RsData<Integer> enrich(
4147
@Operation(summary = "아티스트 생성", description = "아티스트를 등록합니다.")
4248
@PostMapping()
4349
public RsData<Void> create(
44-
@RequestBody CreateRequest reqBody
50+
@Valid @RequestBody CreateRequest reqBody
4551
) {
46-
artistService.createArtist(reqBody.artistName(), reqBody.artistGroup(), reqBody.artistGroup(), reqBody.genreName());
52+
artistService.createArtist(reqBody.artistName(), reqBody.artistGroup(), reqBody.artistType(), reqBody.genreName());
4753
return RsData.success("아티스트 생성이 완료되었습니다.", null);
4854
}
4955

@@ -65,7 +71,7 @@ public RsData<ArtistDetailResponse> artist(
6571
@PatchMapping("/{id}")
6672
public RsData<Void> update(
6773
@PathVariable Long id,
68-
@RequestBody UpdateRequest reqBody
74+
@Valid @RequestBody UpdateRequest reqBody
6975
) {
7076
artistService.updateArtist(id, reqBody);
7177
return RsData.success("아티스트 정보 수정을 완료했습니다.", null);
@@ -79,4 +85,62 @@ public RsData<Void> delete(
7985
artistService.delete(id);
8086
return RsData.success("아티스트 정보를 삭제했습니다.", null);
8187
}
88+
89+
@Operation(summary = "아티스트 검색",
90+
description = "아티스트 이름 또는 키워드를 입력하면, 해당 키워드가 포함된 아티스트 목록 또는 이름에 해당하는 아티스트를 조회합니다.")
91+
@PostMapping("/search")
92+
public RsData<List<SearchResponse>> search(
93+
@Valid @RequestBody SearchRequest reqBody
94+
) {
95+
return RsData.success("아티스트 검색에 성공했습니다.", artistService.search(reqBody.artistName()));
96+
}
97+
98+
@Operation(summary = "아티스트 찜하기", description = "id 에 해당하는 특정 아티스트를 찜합니다. 로그인 상태에서만 가능합니다.")
99+
@PostMapping("/likes/{id}")
100+
public RsData<Void> artistLikes(
101+
@PathVariable Long id
102+
) {
103+
User user = rq.getUser();
104+
artistService.likeArtist(id, user);
105+
return RsData.success("아티스트 찜 성공", null);
106+
}
107+
108+
@Operation(summary = "아티스트 찜 해체", description = "id 에 해당하는 아티스트에게 등록했던 찜을 해제합니다.")
109+
@DeleteMapping("/likes/{id}")
110+
public RsData<Void> deleteArtistLikes(
111+
@PathVariable Long id
112+
) {
113+
User user = rq.getUser();
114+
artistService.deleteLikeArtist(id, user);
115+
return RsData.success("아티스트 찜 해제 성공", null);
116+
}
117+
118+
@Operation(summary = "개인화된 공연 리스트 생성", description = "유저가 찜한 아티스트를 기반으로 공연 리스트를 생성합니다.")
119+
@PostMapping("/list")
120+
public void concertList() {}
121+
122+
@Operation(summary = "아티스트 인기 순위", description = "Spotify 인기도를 바탕으로 아티스트 인기 순위 랭킹을 제공합니다.")
123+
@GetMapping("/ranking")
124+
public void artistRanking() {}
125+
126+
@Operation(summary = "장르 기반 아티스트 추천", description = "찜한 장르를 기반으로 아티스트 추천 리스트를 제공합니다.")
127+
@GetMapping("/recommendation/{genreId}")
128+
public void recommendArtist(
129+
@PathVariable Long genreId
130+
) {}
131+
132+
@Operation(summary = "공연 셋리스트 생성", description = "사용자가 공연 셋리스트를 생성합니다.")
133+
@PostMapping("/setlist/{concertId}/{artistId}")
134+
public void makeSetlist(
135+
@PathVariable Long concertId,
136+
@PathVariable Long artistId
137+
) {}
138+
139+
@Operation(summary = "공연 셋리스트 조회", description = "다른 사용자들이 생성한 셋리스트를 조회합니다.")
140+
@GetMapping("/setlist/{concertId}/{artistId}")
141+
public void getSetlist(
142+
@PathVariable Long concertId,
143+
@PathVariable Long artistId
144+
) {}
82145
}
146+
Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
package com.back.web7_9_codecrete_be.domain.artists.dto.request;
22

3+
import com.back.web7_9_codecrete_be.domain.artists.entity.ArtistType;
4+
import jakarta.validation.constraints.NotBlank;
5+
import jakarta.validation.constraints.NotNull;
6+
import jakarta.validation.constraints.Size;
7+
38
public record CreateRequest(
9+
@NotBlank(message = "아티스트 이름은 필수로 입력해야합니다.")
10+
@Size(max = 200, message = "아티스트 이름은 200자를 넘길 수 없습니다.")
411
String artistName,
12+
13+
@Size(max = 150, message = "아티스트 그룹 이름은 150자를 넘길 수 없습니다.")
514
String artistGroup,
6-
String artistType,
15+
16+
@NotNull(message = "아티스트 타입은 필수로 입력해야합니다(SOLO or GROUP)")
17+
ArtistType artistType,
18+
19+
@NotBlank(message = "장르는 필수로 입력해야합니다.")
20+
@Size(max = 30, message = "장르는 30자를 넘길 수 없습니다.")
721
String genreName
822
) {
923
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.back.web7_9_codecrete_be.domain.artists.dto.request;
2+
3+
import jakarta.validation.constraints.NotBlank;
4+
import jakarta.validation.constraints.Size;
5+
6+
public record SearchRequest(
7+
@NotBlank(message = "검색어를 입력해주세요")
8+
@Size(max = 200, message = "아티스트 이름은 200자를 넘길 수 없습니다.")
9+
String artistName
10+
) {
11+
}
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
package com.back.web7_9_codecrete_be.domain.artists.dto.request;
22

3+
import com.back.web7_9_codecrete_be.domain.artists.entity.ArtistType;
4+
import jakarta.validation.constraints.Size;
5+
36
public record UpdateRequest(
7+
@Size(max = 200, message = "아티스트 이름은 200자를 넘길 수 없습니다.")
48
String artistName,
9+
10+
@Size(max = 150, message = "아티스트 그룹 이름은 150자를 넘길 수 없습니다.")
511
String artistGroup,
6-
String artistType,
12+
13+
ArtistType artistType,
14+
15+
@Size(max = 30, message = "장르 이름은 30자를 넘길 수 없습니다.")
716
String genreName
817
) {
918
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.back.web7_9_codecrete_be.domain.artists.dto.response;
22

3+
import com.back.web7_9_codecrete_be.domain.artists.entity.ArtistType;
4+
35
import java.util.List;
46

57
public record ArtistDetailResponse(
68
String artistName,
79
String artistGroup,
8-
String artistType,
10+
ArtistType artistType,
911
String profileImageUrl,
1012
long likeCount,
1113
int totalAlbums,
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 com.back.web7_9_codecrete_be.domain.artists.entity.Artist;
4+
5+
public record SearchResponse(
6+
String artistName,
7+
String artistGroup,
8+
int likeCount
9+
) {
10+
public static SearchResponse from(Artist artist) {
11+
return new SearchResponse(
12+
artist.getArtistName(),
13+
artist.getArtistGroup(),
14+
artist.getLikeCount()
15+
);
16+
}
17+
}

src/main/java/com/back/web7_9_codecrete_be/domain/artists/entity/Artist.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ public class Artist {
2424
@Column(name = "artist_group")
2525
private String artistGroup;
2626

27+
@Enumerated(EnumType.STRING)
2728
@Column(name = "artist_type")
28-
private String artistType;
29+
private ArtistType artistType;
2930

3031
@ManyToOne(fetch = FetchType.LAZY)
3132
private Genre genre;
@@ -36,22 +37,25 @@ public class Artist {
3637
@Column(name = "name_ko", length = 200)
3738
private String nameKo;
3839

39-
public Artist(String spotifyArtistId, String artistName, String artistGroup, String artistType, Genre genre) {
40+
@Column(name = "like_count", nullable = false)
41+
private int likeCount = 0;
42+
43+
public Artist(String spotifyArtistId, String artistName, String artistGroup, ArtistType artistType, Genre genre) {
4044
this.spotifyArtistId = spotifyArtistId;
4145
this.artistName = artistName;
4246
this.artistGroup = artistGroup; // 옵션 B: seed에서는 null
4347
this.artistType = artistType; // 옵션 B: seed에서는 "SINGER"
4448
this.genre = genre;
4549
}
4650

47-
public Artist(String artistName, String artistGroup, String artistType, Genre genre) {
51+
public Artist(String artistName, String artistGroup, ArtistType artistType, Genre genre) {
4852
this.artistName = artistName;
4953
this.artistGroup = artistGroup;
5054
this.artistType = artistType;
5155
this.genre = genre;
5256
}
5357

54-
public void updateProfile(String nameKo, String artistGroup, String artistType) {
58+
public void updateProfile(String nameKo, String artistGroup, ArtistType artistType) {
5559
this.nameKo = nameKo;
5660
this.artistGroup = artistGroup; // nullable
5761
this.artistType = artistType; // "SOLO" / "GROUP"
@@ -65,13 +69,21 @@ public void changeGroup(String group) {
6569
this.artistGroup = group;
6670
}
6771

68-
public void changeType(String type) {
72+
public void changeType(ArtistType type) {
6973
this.artistType = type;
7074
}
7175

7276
public void changeGenre(Genre genre) {
7377
this.genre = genre;
7478
}
7579

80+
public void increaseLikeCount() {
81+
this.likeCount++;
82+
}
7683

84+
public void decreaseLikeCount() {
85+
if (this.likeCount > 0) {
86+
this.likeCount--;
87+
}
88+
}
7789
}
Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,40 @@
11
package com.back.web7_9_codecrete_be.domain.artists.entity;
22

3+
import com.back.web7_9_codecrete_be.domain.users.entity.User;
34
import jakarta.persistence.*;
45
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import org.springframework.data.annotation.CreatedDate;
8+
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
59

610
import java.time.LocalDateTime;
711

12+
813
@Entity
914
@Getter
15+
@NoArgsConstructor
16+
@EntityListeners(AuditingEntityListener.class)
1017
@Table(name = "artist_like")
1118
public class ArtistLike {
1219
@Id
1320
@GeneratedValue(strategy = GenerationType.IDENTITY)
1421
@Column(name = "artist_like_id")
1522
private long id;
1623

24+
@CreatedDate
1725
@Column(name = "created_date", nullable = false)
1826
private LocalDateTime createdDate;
1927

20-
// TODO : 추후 user Entity 보고 확인 예정 우선 주석 처리
21-
/*
2228
@ManyToOne(fetch = FetchType.LAZY)
23-
@JoinColumn(name = "genre_id", nullable = false)
29+
@JoinColumn(name = "user_id", nullable = false)
2430
private User user;
25-
*/
2631

2732
@ManyToOne(fetch = FetchType.LAZY)
2833
@JoinColumn(name = "artist_id", nullable = false)
2934
private Artist artist;
35+
36+
public ArtistLike(Artist artist, User user) {
37+
this.artist = artist;
38+
this.user = user;
39+
}
3040
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.back.web7_9_codecrete_be.domain.artists.entity;
2+
3+
public enum ArtistType {
4+
SOLO,
5+
GROUP
6+
}

0 commit comments

Comments
 (0)