Skip to content

Commit 5c4d60c

Browse files
authored
[BE/feat] Schedule 1차 개발 구현
[BE/feat] Schedule 1차 개발 구현
2 parents 5d98324 + 5aa6e6f commit 5c4d60c

22 files changed

+1246
-129
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package back.kalender.domain.artist.entity;
2+
3+
import back.kalender.global.common.entity.BaseEntityTmp;
4+
import jakarta.persistence.*;
5+
import lombok.AccessLevel;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Entity
11+
@Getter
12+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
13+
@AllArgsConstructor
14+
@Table(name = "artist_follows")
15+
public class ArtistFollowTmp extends BaseEntityTmp {
16+
17+
//TODO: 나중에 꼭 제거해야함
18+
@Column(name = "user_id", nullable = false)
19+
private Long userId;
20+
21+
// @ManyToOne(fetch = FetchType.LAZY)
22+
// @JoinColumn(name = "user_id", nullable = false)
23+
// private User user;
24+
25+
@ManyToOne(fetch = FetchType.LAZY)
26+
@JoinColumn(name = "artist_id",nullable = false)
27+
private ArtistTmp artist;
28+
29+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package back.kalender.domain.artist.entity;
2+
3+
import back.kalender.global.common.entity.BaseEntityTmp;
4+
import jakarta.persistence.*;
5+
import lombok.AccessLevel;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Entity
11+
@Getter
12+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
13+
@AllArgsConstructor
14+
@Table(name = "artists")
15+
public class ArtistTmp extends BaseEntityTmp {
16+
17+
@Column(nullable = false, unique = true)
18+
private String name;
19+
20+
private String imageUrl;
21+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package back.kalender.domain.artist.repository;
2+
3+
import back.kalender.domain.artist.entity.ArtistFollowTmp;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
import java.util.List;
7+
8+
public interface ArtistFollowRepositoryTmp extends JpaRepository<ArtistFollowTmp, Long> {
9+
List<ArtistFollowTmp> findAllByUserId(Long userId);
10+
11+
boolean existsByUserIdAndArtistId(Long userId, Long artistId);
12+
13+
void deleteByUserIdAndArtistId(Long userId, Long artistId);
14+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package back.kalender.domain.artist.repository;
2+
3+
import back.kalender.domain.artist.entity.ArtistTmp;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface ArtistRepositoryTmp extends JpaRepository<ArtistTmp, Long> {
7+
}

src/main/java/back/kalender/domain/schedule/controller/ScheduleController.java

Lines changed: 214 additions & 35 deletions
Large diffs are not rendered by default.

src/main/java/back/kalender/domain/schedule/dto/response/DailyScheduleItem.java

Lines changed: 0 additions & 20 deletions
This file was deleted.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package back.kalender.domain.schedule.dto.response;
2+
3+
import back.kalender.domain.schedule.entity.ScheduleCategory;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
6+
import java.time.LocalDateTime;
7+
import java.util.Optional;
8+
9+
public record DailyScheduleResponse(
10+
@Schema(description = "일정 ID", example = "120")
11+
Long scheduleId,
12+
13+
@Schema(description = "아티스트 이름", example = "NewJeans")
14+
String artistName,
15+
16+
@Schema(description = "일정 제목", example = "뮤직뱅크 출연")
17+
String title,
18+
19+
@Schema(description = "일정 카테고리", example = "BROADCAST")
20+
ScheduleCategory scheduleCategory,
21+
22+
@Schema(description = "일정 시작 시간", example = "2025-12-15T17:00:00")
23+
LocalDateTime scheduleTime,
24+
25+
@Schema(description = "공연 ID (선택 사항)", example = "null")
26+
Optional<Long> performanceId,
27+
28+
@Schema(description = "예매처 또는 관련 링크 (없을 경우 null)", example = "https://ticket.example.com/newjeans")
29+
Optional<String> link,
30+
31+
@Schema(description = "일정 장소 (선택 사항)", example = "KBS 신관 공개홀")
32+
Optional<String> location
33+
) {
34+
public DailyScheduleResponse(
35+
Long scheduleId,
36+
String artistName,
37+
String title,
38+
ScheduleCategory scheduleCategory,
39+
LocalDateTime scheduleTime,
40+
Long performanceId,
41+
String link,
42+
String location
43+
) {
44+
this(
45+
scheduleId,
46+
artistName,
47+
title,
48+
scheduleCategory,
49+
scheduleTime,
50+
Optional.ofNullable(performanceId),
51+
Optional.ofNullable(link),
52+
Optional.ofNullable(location)
53+
);
54+
}
55+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package back.kalender.domain.schedule.dto.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
5+
import java.util.List;
6+
7+
public record DailySchedulesListResponse(
8+
@Schema(description = "해당 날짜의 상세 일정 목록")
9+
List<DailyScheduleResponse> dailySchedules
10+
) {
11+
}

src/main/java/back/kalender/domain/schedule/dto/response/DailySchedulesResponse.java

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package back.kalender.domain.schedule.dto.response;
2+
3+
import back.kalender.domain.schedule.entity.ScheduleCategory;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
6+
import java.time.LocalDateTime;
7+
import java.util.Optional;
8+
9+
public record MonthlyScheduleResponse(
10+
@Schema(description = "일정 ID", example = "101")
11+
Long scheduleId,
12+
13+
@Schema(description = "아티스트 ID", example = "2")
14+
Long artistId,
15+
16+
@Schema(description = "아티스트 이름", example = "BTS")
17+
String artistName,
18+
19+
@Schema(description = "일정 제목", example = "BTS 월드 투어 서울 공연")
20+
String title,
21+
22+
@Schema(description = "일정 카테고리 (CONCERT, BROADCAST, FAN_MEETING 등)", example = "CONCERT")
23+
ScheduleCategory scheduleCategory,
24+
25+
@Schema(description = "일정 시작 시간", example = "2025-11-02T19:00:00")
26+
LocalDateTime scheduleTime,
27+
28+
@Schema(description = "공연 ID (공연 일정인 경우 포함, 없을 경우 null)", example = "501")
29+
Optional<Long> performanceId,
30+
31+
@Schema(description = "일정 장소 (선택 사항)", example = "고척 스카이돔")
32+
Optional<String> location
33+
) {
34+
public MonthlyScheduleResponse(
35+
Long scheduleId,
36+
Long artistId,
37+
String artistName,
38+
String title,
39+
ScheduleCategory scheduleCategory,
40+
LocalDateTime scheduleTime,
41+
Long performanceId,
42+
String location
43+
) {
44+
this(
45+
scheduleId,
46+
artistId,
47+
artistName,
48+
title,
49+
scheduleCategory,
50+
scheduleTime,
51+
Optional.ofNullable(performanceId),
52+
Optional.ofNullable(location)
53+
);
54+
}
55+
}

0 commit comments

Comments
 (0)