Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ public class ConcertDetailResponse {
@Schema(description = "콘서트 예매 시작 날짜입니다.")
private LocalDateTime ticketTime;

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@Schema(description = "콘서트 예매 종료 날짜입니다.")
private LocalDateTime ticketEndTime;

@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@Schema(description = "콘서트 시작 날짜입니다.",format = "yyyy-MM-dd")
Expand Down Expand Up @@ -69,4 +74,5 @@ public class ConcertDetailResponse {
private List<String> concertImageUrls;



}
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ public class ConcertItem {
@Schema(description = "콘서트 예매 시작 날짜입니다.",format = "yyyy-MM-ddThh:mm:ss")
private LocalDateTime ticketTime;

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@Schema(description = "콘서트 예매 종료 날짜입니다.")
private LocalDateTime ticketEndTime;

@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
@Schema(description = "콘서트 시작 날짜입니다.",format = "yyyy-MM-dd")
Expand Down Expand Up @@ -64,6 +69,7 @@ public ConcertItem(Concert concert) {
this.name = concert.getName();
this.placeName = concert.getConcertPlace().getPlaceName();
this.ticketTime = concert.getTicketTime();
this.ticketEndTime = concert.getTicketEndTime();
this.startDate = concert.getStartDate();
this.endDate =concert.getEndDate();
this.posterUrl = concert.getPosterUrl();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ public class ConcertTicketTimeSetRequest {
@NotNull(message = "예매 시작 시간 입력시 해당 공연의 ID 값 입력은 필수입니다.")
private Long concertId;

@Schema(description = "티켓팅 시간입니다.")
@Schema(description = "티켓팅 시작 시간입니다.")
@NotNull(message = "예매 시작 시간 설정시 시간 입력은 필수입니다.")
private LocalDateTime ticketTime;


@Schema(description = "티켓팅 종료 시간입니다.")
@NotNull(message = "예매 종료 시간 설정시 시간 입력은 필수입니다.")
private LocalDateTime ticketEndTime;
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ public class Concert {
@Column(name = "ticket_time", nullable = true)
private LocalDateTime ticketTime;

@Column(name = "ticket_end_time", nullable = true)
private LocalDateTime ticketEndTime;

@Column(name = "created_date", nullable = false)
private LocalDateTime createdDate;

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



public Concert(ConcertPlace concertPlace, String name, String content, LocalDate startDate, LocalDate endDate, LocalDateTime ticketTime, int maxPrice, int minPrice, String posterUrl,String apiConcertId) {
public Concert(ConcertPlace concertPlace, String name, String content, LocalDate startDate, LocalDate endDate, LocalDateTime ticketTime,LocalDateTime ticketEndTime, int maxPrice, int minPrice, String posterUrl,String apiConcertId) {
this.concertPlace = concertPlace;
this.name = name;
this.content = content;
this.ticketTime = ticketTime;
this.ticketEndTime = ticketTime;
this.startDate = startDate;
this.endDate = endDate;
this.createdDate = LocalDateTime.now();
Expand Down Expand Up @@ -109,8 +113,9 @@ public Concert update(ConcertUpdateRequest concertUpdateRequest,ConcertPlace con
return this;
}

public Concert ticketTimeSet(LocalDateTime ticketTime){
public Concert ticketTimeSet(LocalDateTime ticketTime, LocalDateTime ticketEndTime) {
this.ticketTime = ticketTime;
this.ticketEndTime = ticketEndTime;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,7 @@ List<ConcertItem> getConcertItemsByKeyword(
c.concertPlace.placeName as placeName,
c.concertPlace.address as placeAddress,
c.ticketTime as ticketTime,
c.ticketEndTime as ticketEndTime,
c.startDate as startDate,
c.endDate as endDate,
c.posterUrl as posterUrl,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.back.web7_9_codecrete_be.domain.concerts.repository.*;
import com.back.web7_9_codecrete_be.domain.users.entity.User;
import com.back.web7_9_codecrete_be.global.error.code.ConcertErrorCode;
import com.back.web7_9_codecrete_be.global.error.code.ErrorCode;
import com.back.web7_9_codecrete_be.global.error.exception.BusinessException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -121,14 +122,14 @@ public Long getTotalConcertsCount() {
return result;
}

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

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

// 공연 시간 설정
// 공연 예매 시간 설정
public ConcertDetailResponse setConcertTicketingTime(ConcertTicketTimeSetRequest concertTicketTimeSetRequest) {
Concert concert = findConcertByConcertId(concertTicketTimeSetRequest.getConcertId());
concert.ticketTimeSet(concertTicketTimeSetRequest.getTicketTime());
LocalDateTime ticketTime = concertTicketTimeSetRequest.getTicketTime();
LocalDateTime ticketEndTime = concertTicketTimeSetRequest.getTicketEndTime();
if(ticketTime.isAfter(ticketEndTime)) throw new BusinessException(ConcertErrorCode.NOT_VALID_TICKETING_TIME);
if(ticketTime.isBefore(LocalDateTime.now())) throw new BusinessException(ConcertErrorCode.NOT_VALID_TICKETING_TIME);

concert.ticketTimeSet(ticketTime, ticketEndTime);
Concert savedConcert = concertRepository.save(concert);
return concertRepository.getConcertDetailById(savedConcert.getConcertId());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@ public void setConcertsList() throws InterruptedException {
dateStringToDateTime(concertDetail.getStartDate()),
dateStringToDateTime(concertDetail.getEndDate()),
null,
null,
ticketPrice.maxPrice,
ticketPrice.minPrice,
concertDetail.getPosterUrl(),
Expand Down Expand Up @@ -261,6 +262,7 @@ public SetResultResponse updateConcertData() throws InterruptedException {
dateStringToDateTime(concertDetail.getStartDate()),
dateStringToDateTime(concertDetail.getEndDate()),
null,
null,
ticketPrice.maxPrice,
ticketPrice.minPrice,
concertDetail.getPosterUrl(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ public enum ConcertErrorCode implements ErrorCode {
CONCERT_NOT_FOUND(HttpStatus.NOT_FOUND,"C-101","공연을 찾을 수 없습니다."),
KEYWORD_IS_NULL(HttpStatus.BAD_REQUEST,"C-102","검색 키워드를 입력해주세요."),
LIKE_CONFLICT(HttpStatus.CONFLICT,"C-131","이미 좋아요를 누른 공연입니다."),
NOT_FOUND_CONCERTLIKE(HttpStatus.NOT_FOUND,"C-130","좋아요를 누르지 않은 공연입니다.")
NOT_FOUND_CONCERTLIKE(HttpStatus.NOT_FOUND,"C-130","좋아요를 누르지 않은 공연입니다."),
NOT_VALID_TICKETING_TIME(HttpStatus.BAD_REQUEST, "C-140","공연 예매 시간이 옳지 않습니다. 확인해 주십시오.")
;

private final HttpStatus status;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,68 +85,71 @@ private void createConcertsForChatTest() {
}

ConcertPlace place = concertPlaceRepository.findAll().stream()
.findFirst()
.orElseGet(() ->
concertPlaceRepository.save(
new ConcertPlace(
"테스트 공연장",
"서울특별시 중구 테스트로 123",
37.5665,
126.9780,
5000,
"API-CONCERT-PLACE-1"
)
)
);
.findFirst()
.orElseGet(() ->
concertPlaceRepository.save(
new ConcertPlace(
"테스트 공연장",
"서울특별시 중구 테스트로 123",
37.5665,
126.9780,
5000,
"API-CONCERT-PLACE-1"
)
)
);

LocalDateTime now = LocalDateTime.now();

// 채팅 가능 (정책 기간 중)
concertRepository.save(
new Concert(
place,
"채팅 가능 공연",
"채팅 테스트용 공연 (정책 기간 중)",
LocalDate.now(),
LocalDate.now().plusDays(2),
LocalDateTime.of(2025, 12, 19, 0, 0),
150000,
50000,
"https://example.com/poster1.jpg",
"API-CONCERT-CHAT-1"
)
new Concert(
place,
"채팅 가능 공연",
"채팅 테스트용 공연 (정책 기간 중)",
LocalDate.now(),
LocalDate.now().plusDays(2),
LocalDateTime.of(2025, 12, 19, 0, 0),
LocalDateTime.of(2025, 12, 21, 0, 0),
150000,
50000,
"https://example.com/poster1.jpg",
"API-CONCERT-CHAT-1"
)
);

// 채팅 불가 (정책 시작 전)
concertRepository.save(
new Concert(
place,
"채팅 불가 공연 - 시작 전",
"아직 채팅이 오픈되지 않은 공연",
LocalDate.now().plusDays(5),
LocalDate.now().plusDays(7),
LocalDateTime.of(2025, 12, 25, 0, 0),
120000,
40000,
"https://example.com/poster2.jpg",
"API-CONCERT-CHAT-2"
)
new Concert(
place,
"채팅 불가 공연 - 시작 전",
"아직 채팅이 오픈되지 않은 공연",
LocalDate.now().plusDays(5),
LocalDate.now().plusDays(7),
LocalDateTime.of(2025, 12, 25, 0, 0),
LocalDateTime.of(2025, 12, 30, 0, 0),
120000,
40000,
"https://example.com/poster2.jpg",
"API-CONCERT-CHAT-2"
)
);

// 채팅 불가 (정책 종료 후)
concertRepository.save(
new Concert(
place,
"채팅 종료된 공연",
"채팅 가능 기간이 지난 공연",
LocalDate.now().minusDays(10),
LocalDate.now().minusDays(7),
LocalDateTime.of(2025, 11, 1, 0, 0),
100000,
30000,
"https://example.com/poster3.jpg",
"API-CONCERT-CHAT-3"
)
new Concert(
place,
"채팅 종료된 공연",
"채팅 가능 기간이 지난 공연",
LocalDate.now().minusDays(10),
LocalDate.now().minusDays(7),
LocalDateTime.of(2025, 11, 1, 0, 0),
LocalDateTime.of(2025, 11, 15, 0, 0),
100000,
30000,
"https://example.com/poster3.jpg",
"API-CONCERT-CHAT-3"
)
);
}
}