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
@@ -1,7 +1,6 @@
package com.back.web7_9_codecrete_be.domain.concerts.dto.concert;

import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert;
import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertLike;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
package com.back.web7_9_codecrete_be.domain.concerts.dto.concert;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
public class ConcertTicketTimeSetRequest {
@Schema(description = "공연 ID 입니다.")
@NotEmpty
private Long concertId;

@Schema(description = "티켓팅 시간입니다.")
@NotEmpty
private LocalDateTime ticketTime;
}
Original file line number Diff line number Diff line change
@@ -1,36 +1,46 @@
package com.back.web7_9_codecrete_be.domain.concerts.dto.concert;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import lombok.Getter;

import java.time.LocalDate;

@Getter
public class ConcertUpdateRequest {
@Schema(description = "수정할 대상이 될 공연 ID 입니다.")
@NotEmpty
private Long concertId;

@Schema(description = "공연 이름입니다.")
@NotEmpty
Copy link
Copy Markdown
Collaborator

@ys0221 ys0221 Dec 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NotEmpty 어노테이션이 문자열 공백(" ")은 허용해주는 걸로 알고있어서 NotBlank 로 선언해주시는게 더 좋을 것 같습니다!!

private String name;

@Schema(description = "공연 설명입니다.")
@NotEmpty
private String description;

@Schema(description = "공연장 ID 입니다.")
@NotEmpty
private Long placeId;

@Schema(description = "공연 시작 날짜입니다.")
@NotEmpty
Copy link
Copy Markdown
Collaborator

@larama-C larama-C Dec 17, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NotEmpty 어노테이션이 String, List 등 에서만 사용이 가능하고 long, int, localdate에서는 사용 시 런타임 에러가 발생할 수 있다고 합니다!

private LocalDate StartDate;

@Schema(description = "공연 종료 날짜입니다.")
@NotEmpty
private LocalDate EndDate;

@Schema(description = "공연 포스터 URL 입니다.")
@NotEmpty
private String posterUrl;

@Schema(description = "공연 티켓 최고가입니다.")
@NotEmpty
private int maxPrice;

@Schema(description = "공연 티켓 최저가입니다.")
@NotEmpty
private int minPrice;
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@ public interface TicketOfficeRepository extends JpaRepository<TicketOffice, Lon
void deleteByConcertId(
@Param("concertId")
Long concertId);

List<TicketOffice> getTicketOfficesByConcert_ConcertId(Long concertConcertId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,8 @@ public List<ConcertItem> getNoTicketTimeConcertsList(Pageable pageable) {

public List<ConcertItem> getConcertListByKeyword(String keyword, Pageable pageable) {
if(keyword == null || keyword.isEmpty()){

throw new BusinessException(ConcertErrorCode.KEYWORD_IS_NULL);
}

return concertRepository.getConcertItemsByKeyword(keyword, pageable);
}

Expand Down Expand Up @@ -81,8 +80,7 @@ public List<ConcertItem> getConcertsList2(Pageable pageable) {
*/

public List<TicketOfficeElement> getTicketOfficesList(long concertId) {
Concert concert = new Concert(concertId);
List<TicketOffice> ticketOffices = ticketOfficeRepository.getTicketOfficesByConcert(concert);
List<TicketOffice> ticketOffices = ticketOfficeRepository.getTicketOfficesByConcert_ConcertId(concertId);
List<TicketOfficeElement> ticketOfficeList = new ArrayList<>();
for (TicketOffice ticketOffice : ticketOffices) {
ticketOfficeList.add(new TicketOfficeElement(ticketOffice));
Expand All @@ -92,7 +90,7 @@ public List<TicketOfficeElement> getTicketOfficesList(long concertId) {
}

public ConcertLikeResponse isLikeConcert(Long concertId, User user) {
Concert concert = concertRepository.getConcertByConcertId(concertId);
Concert concert = findConcertByConcertId(concertId);
ConcertLikeResponse concertLikeResponse;
if(concertLikeRepository.existsConcertLikeByConcertAndUser(concert,user)){
concertLikeResponse = new ConcertLikeResponse(concert,true);
Expand All @@ -105,7 +103,8 @@ public ConcertLikeResponse isLikeConcert(Long concertId, User user) {

@Transactional
public void likeConcert(long concertId, User user) {
Concert concert = concertRepository.findById(concertId).orElseThrow();
Concert concert = findConcertByConcertId(concertId);

if(concertLikeRepository.existsConcertLikeByConcertAndUser(concert,user)){
throw new BusinessException(ConcertErrorCode.LIKE_CONFLICT);
}
Expand All @@ -116,7 +115,8 @@ public void likeConcert(long concertId, User user) {

@Transactional
public void dislikeConcert(long concertId, User user) {
Concert concert = concertRepository.findById(concertId).orElseThrow();
Concert concert = findConcertByConcertId(concertId);

ConcertLike concertLike = concertLikeRepository.findConcertLikeByConcertAndUser(concert, user);
if(concertLike == null){
throw new BusinessException(ConcertErrorCode.NOT_FOUND_CONCERTLIKE);
Expand All @@ -126,23 +126,28 @@ public void dislikeConcert(long concertId, User user) {
}

public ConcertItem updateConcert(long concertId, ConcertUpdateRequest concertUpdateRequest) {
Concert concert = concertRepository.findById(concertId).orElseThrow();
Concert concert = findConcertByConcertId(concertId);
ConcertPlace concertPlace = concertPlaceRepository.findById(concertUpdateRequest.getPlaceId()).orElseThrow();
concert.update(concertUpdateRequest, concertPlace);
Concert updatedConcert = concertRepository.save(concert);
return new ConcertItem(updatedConcert);
}

public ConcertDetailResponse setConcertTime(ConcertTicketTimeSetRequest concertTicketTimeSetRequest) {
Concert concert = concertRepository.findById(concertTicketTimeSetRequest.getConcertId()).orElseThrow();
Concert concert = findConcertByConcertId(concertTicketTimeSetRequest.getConcertId());
concert.ticketTimeSet(concertTicketTimeSetRequest.getTicketTime());
Concert savedConcert = concertRepository.save(concert);
return concertRepository.getConcertDetailById(savedConcert.getConcertId());
}

public void deleteConcert(long concertId) {
Concert concert = concertRepository.findById(concertId).orElseThrow();
concertRepository.deleteById(concertId);
}

private Concert findConcertByConcertId(long concertId) {
return concertRepository.findById(concertId).orElseThrow(
() -> new BusinessException(ConcertErrorCode.CONCERT_NOT_FOUND)
);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
Expand Down Expand Up @@ -64,6 +65,7 @@ public KopisApiService(ConcertRepository concertRepository, ConcertPlaceReposito
public SetResultResponse setConcertsList() throws InterruptedException {
// 최초 시작 시간 저장
LocalDateTime now = LocalDateTime.now();
Long startNs = System.currentTimeMillis();

// 콘서트 목록 받아올 Response 객체 선언
ConcertListResponse plr;
Expand Down Expand Up @@ -145,6 +147,9 @@ public SetResultResponse setConcertsList() throws InterruptedException {
ConcertUpdateTime concertUpdateTime = new ConcertUpdateTime(now);
concertUpdateTimeRepository.save(concertUpdateTime);
log.info(now + "시 기준 " + totalConcertsList.size() + "개의 공연 데이터 저장 완료!");
long endNs = System.currentTimeMillis();
long durationSec = ((endNs - startNs) / 1000);
log.info(durationSec/60 + "분, " + durationSec % 60 + "초 소요되었습니다." );
return new SetResultResponse(addedConcerts,0,addedConcertPlaces,0,addedConcertImages,0,addedTicketOffices,0);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@
@RequiredArgsConstructor
public enum ConcertErrorCode implements ErrorCode {

LIKE_CONFLICT(HttpStatus.CONFLICT,"C131","이미 좋아요를 누른 공연입니다."),
NOT_FOUND_CONCERTLIKE(HttpStatus.NOT_FOUND,"C130","좋아요를 누르지 않은 공연입니다.")
// C-10* 공연 탐색 관련
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","좋아요를 누르지 않은 공연입니다.")
;

private final HttpStatus status;
Expand Down