From 25244703e69b32952c8d4cda5ddd7b2981fbc9b9 Mon Sep 17 00:00:00 2001 From: Creamcheesepie Date: Tue, 16 Dec 2025 10:37:16 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=ED=99=94=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcertAdminController.java | 34 +++++++++++++++---- .../controller/ConcertController.java | 25 ++++++++++++-- .../concerts/dto/concert/ConcertItem.java | 2 +- .../dto/concert/ConcertLikeResponse.java | 4 +++ .../concert/ConcertTicketTimeSetRequest.java | 4 +++ .../dto/concert/ConcertUpdateRequest.java | 18 ++++++++++ 6 files changed, 78 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java index ba55b07a..ce00d95e 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java @@ -9,6 +9,8 @@ import com.back.web7_9_codecrete_be.domain.concerts.service.ConcertService; import com.back.web7_9_codecrete_be.domain.concerts.service.KopisApiService; import com.back.web7_9_codecrete_be.global.rsData.RsData; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Pageable; @@ -25,43 +27,63 @@ public class ConcertAdminController { // todo : 인증 권한 추가하기 private final ConcertService concertService; private final KopisApiService kopisApiService; - @GetMapping("totalGetTest") - public ConcertListResponse totalGetTest() throws InterruptedException { - return kopisApiService.setConcertsList(); - } - - @GetMapping("setConcertPlace") + @Operation(summary = "초기 공연 정보 저장", description = "25년 12월부터 앞으로 6개월 이후까지의 전체 공연의 정보를 가져와서 저장합니다. 대략 10~12분 정도 시간이 소요됩니다.") + @PostMapping("setConcertPlace") public ConcertPlaceListResponse setConcertPlace() throws InterruptedException { return kopisApiService.setConcertPlace(); } + @Operation(summary = "공연 정보 갱신",description = "공연 정보를 직접 갱신합니다.") @PatchMapping("updateConcert/{concertId}") public RsData updateConcert( + @Schema(description = "갱신 대상이 될 공연의 ID 값입니다.") @PathVariable Long concertId, + @Schema(description = "갱신 내용입니다.") @RequestBody ConcertUpdateRequest concertUpdateRequest ){ ConcertItem concertItem = concertService.updateConcert(concertId, concertUpdateRequest); return RsData.success("공연 정보 수정이 완료되었습니다.",concertItem); } + @Operation(summary = "예매 시간이 없는 공연 목록 조회", description = "예매 시간이 없는 공연들을 공연시간 내림차순으로 출력합니다.") @GetMapping("noTicketTimeList") public List getNoTicketTimeConcertsList( + @Schema(description = "무한스크롤 및 페이징 처리에 사용할 Pageable입니다.") Pageable pageable ) { return concertService.getNoTicketTimeConcertsList(pageable); } + @Operation(summary = "공연을 삭제합니다.", description = "해당 공연을 삭제합니다.") @DeleteMapping("deleteConcert/{concertId}") public RsData deleteConcert(@PathVariable Long concertId){ concertService.deleteConcert(concertId); return RsData.success("공연 정보 삭제에 성공하였습니다.",null); } + @Operation(summary = "예매 시간 등록",description = "개별 공연에 대한 예매 시간을 설정합니다.") @PatchMapping("ticketTimeSet") public RsData ticketTimeSet( @RequestBody ConcertTicketTimeSetRequest concertTicketTimeSetRequest ){ return RsData.success(concertService.setConcertTime(concertTicketTimeSetRequest)); } + + // todo: 내용 구현 필요 + @Operation(summary = "개별 공연 API통한 갱신",description = "개별 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고 해당 데이터를 갱신합니다.") + @PatchMapping("updateConcertByKopisAPI/{concertId}") + public RsData updateConcertByKopisAPI( + @Schema(description = "갱신 대상이 될 공연의 ID 값입니다.") + @PathVariable Long ConcertId + ){ + return null; + } + + // todo: 내용 구현 필요, 결과 DTO 따로 만들기. + @Operation(summary = "공연 목록 갱신", description = "전체 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고, 바뀐 내용을 갱신하고 추가된 공연을 가져옵니다.") + @PostMapping("updateConcert") + public RsData updateConcert(){ + return null; + } } diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java index 71934c63..df3d4190 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java @@ -24,6 +24,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; +import javax.swing.*; import java.util.List; @RestController @@ -52,6 +53,16 @@ public RsData> getUpComingList ( return RsData.success(concertService.getUpcomingConcertsList(pageable)); } + // todo: 내용 구현 필요 + @Operation(summary = "공연 예매일 기준 조회", description = "현 시간을 기준으로 예매시간을 내림차순으로 출력하는 공연 목록을 조회합니다.") + @GetMapping("upComingTicketingList") + public RsData> getUpComingTicketingList ( + @Schema(description = "페이징 처리 또는 무한 스크롤 구현에 사용할 Pageable 객체입니다.") + Pageable pageable + ){ + return null; + } + @Operation(summary = "좋아요 한 공연 조회", description = "좋아요를 누른 공연에 대한 목록을 조회합니다. 저장 날짜를 기준으로 내림차순 정렬로 표시합니다.(최신으로 추가된 목록순입니다.)") @GetMapping("likedConcertList") public RsData> getLikedConcertList ( @@ -72,8 +83,6 @@ public ConcertDetailResponse getConcertDetail( return concertService.getConcertDetail(concertId); } - - @Operation(summary = "공연 예매처 조회", description = "공연에 대한 예매처들을 조회합니다.") @GetMapping("ticketOffices") public RsData> getTicketOffices ( @@ -113,5 +122,17 @@ public RsData isLikeConcert( return RsData.success(concertService.isLikeConcert(concertId, user)); } + // todo : 내용 구현 필요 + @Operation(summary = "공연 검색", description = "공연 정보를 검색합니다.") + @GetMapping("search") + public RsData> searchConcert( + @Schema(description = "공연 정보 검색 키워드입니다.") + @RequestParam String keyword + ){ + return null; + } + + + } diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java index a93bd3ca..79856417 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertItem.java @@ -21,7 +21,7 @@ public class ConcertItem { @Schema(description = "콘서트 장소 이름입니다.") private String placeName; - @Schema(description = "콘서트 예매 시작 날짜입니다.") + @Schema(description = "콘서트 예매 시작 날짜입니다.",format = "yyyy-MM-ddThh:mm:ss") private LocalDateTime ticketTime; @Schema(description = "콘서트 시작 날짜입니다.",format = "yyyy-MM-dd") diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertLikeResponse.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertLikeResponse.java index 919e6f5d..7e7b0e96 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertLikeResponse.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertLikeResponse.java @@ -2,11 +2,15 @@ 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; @Getter public class ConcertLikeResponse { + @Schema(description = "공연 ID 입니다.") private Long concertId; + + @Schema(description = "공연 좋아요 여부입니다.") private Boolean isLike; public ConcertLikeResponse(Concert concert, Boolean isLike) { diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertTicketTimeSetRequest.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertTicketTimeSetRequest.java index b37178ab..73d2e7fd 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertTicketTimeSetRequest.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertTicketTimeSetRequest.java @@ -1,11 +1,15 @@ package com.back.web7_9_codecrete_be.domain.concerts.dto.concert; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import java.time.LocalDateTime; @Getter public class ConcertTicketTimeSetRequest { + @Schema(description = "공연 ID 입니다.") private Long concertId; + + @Schema(description = "티켓팅 시간입니다.") private LocalDateTime ticketTime; } diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertUpdateRequest.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertUpdateRequest.java index 69d61b9b..3f016745 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertUpdateRequest.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/concert/ConcertUpdateRequest.java @@ -1,18 +1,36 @@ package com.back.web7_9_codecrete_be.domain.concerts.dto.concert; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import java.time.LocalDate; @Getter public class ConcertUpdateRequest { + @Schema(description = "수정할 대상이 될 공연 ID 입니다.") private Long concertId; + + @Schema(description = "공연 이름입니다.") private String name; + + @Schema(description = "공연 설명입니다.") private String description; + + @Schema(description = "공연장 ID 입니다.") private Long placeId; + + @Schema(description = "공연 시작 날짜입니다.") private LocalDate StartDate; + + @Schema(description = "공연 종료 날짜입니다.") private LocalDate EndDate; + + @Schema(description = "공연 포스터 URL 입니다.") private String posterUrl; + + @Schema(description = "공연 티켓 최고가입니다.") private int maxPrice; + + @Schema(description = "공연 티켓 최저가입니다.") private int minPrice; } From 36569ebcc3262de5896a240604654154980435fb Mon Sep 17 00:00:00 2001 From: Creamcheesepie Date: Tue, 16 Dec 2025 10:47:13 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat=20:=20=EA=B5=AC=ED=98=84=20=EC=A0=84?= =?UTF-8?q?=EC=9D=B8=20API=EB=8A=94=20summary=EC=97=90=20=ED=91=9C?= =?UTF-8?q?=EC=8B=9C=ED=95=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/concerts/controller/ConcertAdminController.java | 4 ++-- .../domain/concerts/controller/ConcertController.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java index ce00d95e..f02f2a62 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java @@ -71,7 +71,7 @@ public RsData ticketTimeSet( } // todo: 내용 구현 필요 - @Operation(summary = "개별 공연 API통한 갱신",description = "개별 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고 해당 데이터를 갱신합니다.") + @Operation(summary = "개별 공연 API통한 갱신(구현 전)",description = "개별 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고 해당 데이터를 갱신합니다.") @PatchMapping("updateConcertByKopisAPI/{concertId}") public RsData updateConcertByKopisAPI( @Schema(description = "갱신 대상이 될 공연의 ID 값입니다.") @@ -81,7 +81,7 @@ public RsData updateConcertByKopisAPI( } // todo: 내용 구현 필요, 결과 DTO 따로 만들기. - @Operation(summary = "공연 목록 갱신", description = "전체 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고, 바뀐 내용을 갱신하고 추가된 공연을 가져옵니다.") + @Operation(summary = "공연 목록 갱신(구현 전)", description = "전체 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고, 바뀐 내용을 갱신하고 추가된 공연을 가져옵니다.") @PostMapping("updateConcert") public RsData updateConcert(){ return null; diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java index df3d4190..b366e1a4 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java @@ -54,7 +54,7 @@ public RsData> getUpComingList ( } // todo: 내용 구현 필요 - @Operation(summary = "공연 예매일 기준 조회", description = "현 시간을 기준으로 예매시간을 내림차순으로 출력하는 공연 목록을 조회합니다.") + @Operation(summary = "공연 예매일 기준 조회(구현 전)", description = "현 시간을 기준으로 예매시간을 내림차순으로 출력하는 공연 목록을 조회합니다.") @GetMapping("upComingTicketingList") public RsData> getUpComingTicketingList ( @Schema(description = "페이징 처리 또는 무한 스크롤 구현에 사용할 Pageable 객체입니다.") @@ -123,7 +123,7 @@ public RsData isLikeConcert( } // todo : 내용 구현 필요 - @Operation(summary = "공연 검색", description = "공연 정보를 검색합니다.") + @Operation(summary = "공연 검색(구현 전)", description = "공연 정보를 검색합니다.") @GetMapping("search") public RsData> searchConcert( @Schema(description = "공연 정보 검색 키워드입니다.") From 039b230dc88e2e59ebb075c8111140c714660e60 Mon Sep 17 00:00:00 2001 From: Creamcheesepie Date: Tue, 16 Dec 2025 12:31:08 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20=EA=B3=B5=EC=97=B0=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ConcertController.java | 16 ++++++----- .../repository/ConcertRepository.java | 27 +++++++++++++++++++ .../concerts/service/ConcertService.java | 8 ++++++ 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java index b366e1a4..66ef0bc2 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java @@ -16,6 +16,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springdoc.core.converters.models.PageableAsQueryParam; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -27,6 +28,7 @@ import javax.swing.*; import java.util.List; +@Slf4j @RestController @RequestMapping("api/v1/concerts/") @RequiredArgsConstructor @@ -122,17 +124,17 @@ public RsData isLikeConcert( return RsData.success(concertService.isLikeConcert(concertId, user)); } - // todo : 내용 구현 필요 - @Operation(summary = "공연 검색(구현 전)", description = "공연 정보를 검색합니다.") + // todo : 제목으로 만 검색 기능 구현 -> 추후 아티스트 정보랑 연동 <- 중요 / 정렬 기준? 최신등록순 정렬 + @Operation(summary = "공연 검색", description = "공연 정보를 검색합니다.") @GetMapping("search") public RsData> searchConcert( @Schema(description = "공연 정보 검색 키워드입니다.") - @RequestParam String keyword + @RequestParam String keyword, + @Schema(description = "페이징 처리 또는 무한 스크롤 구현에 쓸 Pageable 객체입니다.") + Pageable pageable + ){ - return null; + return RsData.success(concertService.getConcertListByKeyword(keyword,pageable)); } - - - } diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java index 94c07379..9401e0a4 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/repository/ConcertRepository.java @@ -124,6 +124,33 @@ List getNoTicketTimeConcertList( ) List getLikedConcertsList(Pageable pageable, @Param("userId") Long userId); + @Query(""" + SELECT + new com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem( + c.concertId as id, + c.name as name, + c.concertPlace.placeName as placeName, + c.ticketTime as ticketTime, + c.startDate as startDate, + c.endDate as endDate, + c.posterUrl as posterUrl, + c.maxPrice as maxPrice, + c.minPrice as minPrice, + c.viewCount as viewCount, + c.likeCount as likeCount + ) + FROM + Concert c + WHERE + c.name LIKE %:keyword% + ORDER BY + c.concertId + DESC +""") + List getConcertItemsByKeyword( + @Param("keyword") + String keyword, + Pageable pageable); @Query(""" SELECT diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java index d3417480..f7d6c7bb 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/service/ConcertService.java @@ -49,6 +49,14 @@ public List getNoTicketTimeConcertsList(Pageable pageable) { return concertRepository.getNoTicketTimeConcertList(pageable); } + public List getConcertListByKeyword(String keyword, Pageable pageable) { + if(keyword == null || keyword.isEmpty()){ + + } + + return concertRepository.getConcertItemsByKeyword(keyword, pageable); + } + public ConcertDetailResponse getConcertDetail(long concertId) { ConcertDetailResponse concertDetailResponse = concertRepository.getConcertDetailById(concertId); List concertImages = concertImageRepository.getConcertImagesByConcert_ConcertId(concertId); From 9fe97c0bcc810e56193648e1a652b07b59fc04c8 Mon Sep 17 00:00:00 2001 From: Creamcheesepie Date: Tue, 16 Dec 2025 12:36:38 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix=20:=20swagger=20=EC=84=A4=EB=AA=85=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/concerts/controller/ConcertController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java index 66ef0bc2..ef185836 100644 --- a/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java +++ b/src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java @@ -125,7 +125,7 @@ public RsData isLikeConcert( } // todo : 제목으로 만 검색 기능 구현 -> 추후 아티스트 정보랑 연동 <- 중요 / 정렬 기준? 최신등록순 정렬 - @Operation(summary = "공연 검색", description = "공연 정보를 검색합니다.") + @Operation(summary = "공연 검색", description = "제목에 키워드를 포함하고 있는 공연 정보를 검색합니다.") @GetMapping("search") public RsData> searchConcert( @Schema(description = "공연 정보 검색 키워드입니다.")