Skip to content

Commit 33962be

Browse files
Merge pull request #182 from prgrms-web-devcourse-final-project/feat/#177
[Concert] 공연 예매 마감일 추가
2 parents 7894a5d + a77ca6c commit 33962be

9 files changed

Lines changed: 92 additions & 57 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertDetailResponse.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public class ConcertDetailResponse {
4040
@Schema(description = "콘서트 예매 시작 날짜입니다.")
4141
private LocalDateTime ticketTime;
4242

43+
@JsonSerialize(using = LocalDateTimeSerializer.class)
44+
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
45+
@Schema(description = "콘서트 예매 종료 날짜입니다.")
46+
private LocalDateTime ticketEndTime;
47+
4348
@JsonSerialize(using = LocalDateSerializer.class)
4449
@JsonDeserialize(using = LocalDateDeserializer.class)
4550
@Schema(description = "콘서트 시작 날짜입니다.",format = "yyyy-MM-dd")
@@ -69,4 +74,5 @@ public class ConcertDetailResponse {
6974
private List<String> concertImageUrls;
7075

7176

77+
7278
}

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ public class ConcertItem {
3434
@Schema(description = "콘서트 예매 시작 날짜입니다.",format = "yyyy-MM-ddThh:mm:ss")
3535
private LocalDateTime ticketTime;
3636

37+
@JsonSerialize(using = LocalDateTimeSerializer.class)
38+
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
39+
@Schema(description = "콘서트 예매 종료 날짜입니다.")
40+
private LocalDateTime ticketEndTime;
41+
3742
@JsonSerialize(using = LocalDateSerializer.class)
3843
@JsonDeserialize(using = LocalDateDeserializer.class)
3944
@Schema(description = "콘서트 시작 날짜입니다.",format = "yyyy-MM-dd")
@@ -64,6 +69,7 @@ public ConcertItem(Concert concert) {
6469
this.name = concert.getName();
6570
this.placeName = concert.getConcertPlace().getPlaceName();
6671
this.ticketTime = concert.getTicketTime();
72+
this.ticketEndTime = concert.getTicketEndTime();
6773
this.startDate = concert.getStartDate();
6874
this.endDate =concert.getEndDate();
6975
this.posterUrl = concert.getPosterUrl();

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertTicketTimeSetRequest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ public class ConcertTicketTimeSetRequest {
1313
@NotNull(message = "예매 시작 시간 입력시 해당 공연의 ID 값 입력은 필수입니다.")
1414
private Long concertId;
1515

16-
@Schema(description = "티켓팅 시간입니다.")
16+
@Schema(description = "티켓팅 시작 시간입니다.")
1717
@NotNull(message = "예매 시작 시간 설정시 시간 입력은 필수입니다.")
1818
private LocalDateTime ticketTime;
19+
20+
21+
@Schema(description = "티켓팅 종료 시간입니다.")
22+
@NotNull(message = "예매 종료 시간 설정시 시간 입력은 필수입니다.")
23+
private LocalDateTime ticketEndTime;
1924
}

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/entity/Concert.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ public class Concert {
3838
@Column(name = "ticket_time", nullable = true)
3939
private LocalDateTime ticketTime;
4040

41+
@Column(name = "ticket_end_time", nullable = true)
42+
private LocalDateTime ticketEndTime;
43+
4144
@Column(name = "created_date", nullable = false)
4245
private LocalDateTime createdDate;
4346

@@ -62,11 +65,12 @@ public class Concert {
6265

6366

6467

65-
public Concert(ConcertPlace concertPlace, String name, String content, LocalDate startDate, LocalDate endDate, LocalDateTime ticketTime, int maxPrice, int minPrice, String posterUrl,String apiConcertId) {
68+
public Concert(ConcertPlace concertPlace, String name, String content, LocalDate startDate, LocalDate endDate, LocalDateTime ticketTime,LocalDateTime ticketEndTime, int maxPrice, int minPrice, String posterUrl,String apiConcertId) {
6669
this.concertPlace = concertPlace;
6770
this.name = name;
6871
this.content = content;
6972
this.ticketTime = ticketTime;
73+
this.ticketEndTime = ticketTime;
7074
this.startDate = startDate;
7175
this.endDate = endDate;
7276
this.createdDate = LocalDateTime.now();
@@ -109,8 +113,9 @@ public Concert update(ConcertUpdateRequest concertUpdateRequest,ConcertPlace con
109113
return this;
110114
}
111115

112-
public Concert ticketTimeSet(LocalDateTime ticketTime){
116+
public Concert ticketTimeSet(LocalDateTime ticketTime, LocalDateTime ticketEndTime) {
113117
this.ticketTime = ticketTime;
118+
this.ticketEndTime = ticketEndTime;
114119
return this;
115120
}
116121

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ List<ConcertItem> getConcertItemsByKeyword(
173173
c.concertPlace.placeName as placeName,
174174
c.concertPlace.address as placeAddress,
175175
c.ticketTime as ticketTime,
176+
c.ticketEndTime as ticketEndTime,
176177
c.startDate as startDate,
177178
c.endDate as endDate,
178179
c.posterUrl as posterUrl,

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.back.web7_9_codecrete_be.domain.concerts.repository.*;
88
import com.back.web7_9_codecrete_be.domain.users.entity.User;
99
import com.back.web7_9_codecrete_be.global.error.code.ConcertErrorCode;
10+
import com.back.web7_9_codecrete_be.global.error.code.ErrorCode;
1011
import com.back.web7_9_codecrete_be.global.error.exception.BusinessException;
1112
import lombok.RequiredArgsConstructor;
1213
import lombok.extern.slf4j.Slf4j;
@@ -121,14 +122,14 @@ public Long getTotalConcertsCount() {
121122
return result;
122123
}
123124

124-
// todo : 티켓팅 공연 개수 조회
125+
// 티켓팅 공연 개수 조회
125126
public Long getTotalTicketingConcertsCount() {
126127
Long result = concertRedisRepository.getTotalConcertsCount(ListSort.TICKETING);
127128
if(result == -1) result = concertRedisRepository.saveTotalConcertsCount(concertRepository.countTicketingConcertsFromLocalDateTime(LocalDateTime.of(LocalDate.now(), LocalTime.MIN)), ListSort.TICKETING);
128129
return result;
129130
}
130131

131-
// todo : 좋아요한 공연 개수 조회
132+
// 좋아요한 공연 개수 조회
132133
public Long getTotalLikedConcertsCount(User user) {
133134
Long result = concertRedisRepository.getUserLikedCount(user);
134135
if(result == -1) result = concertRedisRepository.saveUserLikedCount(user,concertLikeRepository.countByUser(user));
@@ -208,10 +209,15 @@ public ConcertItem updateConcert(long concertId, ConcertUpdateRequest concertUpd
208209
return new ConcertItem(updatedConcert);
209210
}
210211

211-
// 공연 시간 설정
212+
// 공연 예매 시간 설정
212213
public ConcertDetailResponse setConcertTicketingTime(ConcertTicketTimeSetRequest concertTicketTimeSetRequest) {
213214
Concert concert = findConcertByConcertId(concertTicketTimeSetRequest.getConcertId());
214-
concert.ticketTimeSet(concertTicketTimeSetRequest.getTicketTime());
215+
LocalDateTime ticketTime = concertTicketTimeSetRequest.getTicketTime();
216+
LocalDateTime ticketEndTime = concertTicketTimeSetRequest.getTicketEndTime();
217+
if(ticketTime.isAfter(ticketEndTime)) throw new BusinessException(ConcertErrorCode.NOT_VALID_TICKETING_TIME);
218+
if(ticketTime.isBefore(LocalDateTime.now())) throw new BusinessException(ConcertErrorCode.NOT_VALID_TICKETING_TIME);
219+
220+
concert.ticketTimeSet(ticketTime, ticketEndTime);
215221
Concert savedConcert = concertRepository.save(concert);
216222
return concertRepository.getConcertDetailById(savedConcert.getConcertId());
217223
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ public void setConcertsList() throws InterruptedException {
156156
dateStringToDateTime(concertDetail.getStartDate()),
157157
dateStringToDateTime(concertDetail.getEndDate()),
158158
null,
159+
null,
159160
ticketPrice.maxPrice,
160161
ticketPrice.minPrice,
161162
concertDetail.getPosterUrl(),
@@ -261,6 +262,7 @@ public SetResultResponse updateConcertData() throws InterruptedException {
261262
dateStringToDateTime(concertDetail.getStartDate()),
262263
dateStringToDateTime(concertDetail.getEndDate()),
263264
null,
265+
null,
264266
ticketPrice.maxPrice,
265267
ticketPrice.minPrice,
266268
concertDetail.getPosterUrl(),

src/main/java/com/back/web7_9_codecrete_be/global/error/code/ConcertErrorCode.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public enum ConcertErrorCode implements ErrorCode {
1313
CONCERT_NOT_FOUND(HttpStatus.NOT_FOUND,"C-101","공연을 찾을 수 없습니다."),
1414
KEYWORD_IS_NULL(HttpStatus.BAD_REQUEST,"C-102","검색 키워드를 입력해주세요."),
1515
LIKE_CONFLICT(HttpStatus.CONFLICT,"C-131","이미 좋아요를 누른 공연입니다."),
16-
NOT_FOUND_CONCERTLIKE(HttpStatus.NOT_FOUND,"C-130","좋아요를 누르지 않은 공연입니다.")
16+
NOT_FOUND_CONCERTLIKE(HttpStatus.NOT_FOUND,"C-130","좋아요를 누르지 않은 공연입니다."),
17+
NOT_VALID_TICKETING_TIME(HttpStatus.BAD_REQUEST, "C-140","공연 예매 시간이 옳지 않습니다. 확인해 주십시오.")
1718
;
1819

1920
private final HttpStatus status;

src/main/java/com/back/web7_9_codecrete_be/global/initData/BaseInitData.java

Lines changed: 52 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -85,68 +85,71 @@ private void createConcertsForChatTest() {
8585
}
8686

8787
ConcertPlace place = concertPlaceRepository.findAll().stream()
88-
.findFirst()
89-
.orElseGet(() ->
90-
concertPlaceRepository.save(
91-
new ConcertPlace(
92-
"테스트 공연장",
93-
"서울특별시 중구 테스트로 123",
94-
37.5665,
95-
126.9780,
96-
5000,
97-
"API-CONCERT-PLACE-1"
98-
)
99-
)
100-
);
88+
.findFirst()
89+
.orElseGet(() ->
90+
concertPlaceRepository.save(
91+
new ConcertPlace(
92+
"테스트 공연장",
93+
"서울특별시 중구 테스트로 123",
94+
37.5665,
95+
126.9780,
96+
5000,
97+
"API-CONCERT-PLACE-1"
98+
)
99+
)
100+
);
101101

102102
LocalDateTime now = LocalDateTime.now();
103103

104104
// 채팅 가능 (정책 기간 중)
105105
concertRepository.save(
106-
new Concert(
107-
place,
108-
"채팅 가능 공연",
109-
"채팅 테스트용 공연 (정책 기간 중)",
110-
LocalDate.now(),
111-
LocalDate.now().plusDays(2),
112-
LocalDateTime.of(2025, 12, 19, 0, 0),
113-
150000,
114-
50000,
115-
"https://example.com/poster1.jpg",
116-
"API-CONCERT-CHAT-1"
117-
)
106+
new Concert(
107+
place,
108+
"채팅 가능 공연",
109+
"채팅 테스트용 공연 (정책 기간 중)",
110+
LocalDate.now(),
111+
LocalDate.now().plusDays(2),
112+
LocalDateTime.of(2025, 12, 19, 0, 0),
113+
LocalDateTime.of(2025, 12, 21, 0, 0),
114+
150000,
115+
50000,
116+
"https://example.com/poster1.jpg",
117+
"API-CONCERT-CHAT-1"
118+
)
118119
);
119120

120121
// 채팅 불가 (정책 시작 전)
121122
concertRepository.save(
122-
new Concert(
123-
place,
124-
"채팅 불가 공연 - 시작 전",
125-
"아직 채팅이 오픈되지 않은 공연",
126-
LocalDate.now().plusDays(5),
127-
LocalDate.now().plusDays(7),
128-
LocalDateTime.of(2025, 12, 25, 0, 0),
129-
120000,
130-
40000,
131-
"https://example.com/poster2.jpg",
132-
"API-CONCERT-CHAT-2"
133-
)
123+
new Concert(
124+
place,
125+
"채팅 불가 공연 - 시작 전",
126+
"아직 채팅이 오픈되지 않은 공연",
127+
LocalDate.now().plusDays(5),
128+
LocalDate.now().plusDays(7),
129+
LocalDateTime.of(2025, 12, 25, 0, 0),
130+
LocalDateTime.of(2025, 12, 30, 0, 0),
131+
120000,
132+
40000,
133+
"https://example.com/poster2.jpg",
134+
"API-CONCERT-CHAT-2"
135+
)
134136
);
135137

136138
// 채팅 불가 (정책 종료 후)
137139
concertRepository.save(
138-
new Concert(
139-
place,
140-
"채팅 종료된 공연",
141-
"채팅 가능 기간이 지난 공연",
142-
LocalDate.now().minusDays(10),
143-
LocalDate.now().minusDays(7),
144-
LocalDateTime.of(2025, 11, 1, 0, 0),
145-
100000,
146-
30000,
147-
"https://example.com/poster3.jpg",
148-
"API-CONCERT-CHAT-3"
149-
)
140+
new Concert(
141+
place,
142+
"채팅 종료된 공연",
143+
"채팅 가능 기간이 지난 공연",
144+
LocalDate.now().minusDays(10),
145+
LocalDate.now().minusDays(7),
146+
LocalDateTime.of(2025, 11, 1, 0, 0),
147+
LocalDateTime.of(2025, 11, 15, 0, 0),
148+
100000,
149+
30000,
150+
"https://example.com/poster3.jpg",
151+
"API-CONCERT-CHAT-3"
152+
)
150153
);
151154
}
152155
}

0 commit comments

Comments
 (0)