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 @@ -2,13 +2,16 @@

import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concert.ConcertListResponse;
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concertPlace.ConcertPlaceListResponse;
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.result.SetResultResponse;
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertDetailResponse;
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem;
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertTicketTimeSetRequest;
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertUpdateRequest;
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;
Expand All @@ -25,43 +28,62 @@ public class ConcertAdminController { // todo : 인증 권한 추가하기
private final ConcertService concertService;
private final KopisApiService kopisApiService;

@GetMapping("totalGetTest")
public ConcertListResponse totalGetTest() throws InterruptedException {
return kopisApiService.setConcertsList();
}


@GetMapping("setConcertPlace")
public ConcertPlaceListResponse setConcertPlace() throws InterruptedException {
return kopisApiService.setConcertPlace();
@Operation(summary = "초기 공연 정보 저장", description = "25년 12월부터 앞으로 6개월 이후까지의 전체 공연의 정보를 가져와서 저장합니다. 대략 10~12분 정도 시간이 소요됩니다.")
@PostMapping("setConcertData")
public RsData<SetResultResponse> setConcert() throws InterruptedException {
return RsData.success(kopisApiService.setConcertsList());
}

@Operation(summary = "공연 정보 갱신",description = "공연 정보를 직접 갱신합니다.")
@PatchMapping("updateConcert/{concertId}")
public RsData<ConcertItem> 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<ConcertItem> getNoTicketTimeConcertsList(
@Schema(description = "무한스크롤 및 페이징 처리에 사용할 Pageable입니다.")
Pageable pageable
) {
return concertService.getNoTicketTimeConcertsList(pageable);
}

@Operation(summary = "공연을 삭제합니다.", description = "해당 공연을 삭제합니다.")
@DeleteMapping("deleteConcert/{concertId}")
public RsData<Void> deleteConcert(@PathVariable Long concertId){
concertService.deleteConcert(concertId);
return RsData.success("공연 정보 삭제에 성공하였습니다.",null);
}

@Operation(summary = "예매 시간 등록",description = "개별 공연에 대한 예매 시간을 설정합니다.")
@PatchMapping("ticketTimeSet")
public RsData<ConcertDetailResponse> ticketTimeSet(
@RequestBody ConcertTicketTimeSetRequest concertTicketTimeSetRequest
){
return RsData.success(concertService.setConcertTime(concertTicketTimeSetRequest));
}

@Operation(summary = "개별 공연 API통한 갱신",description = "개별 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고 해당 데이터를 갱신합니다.")
@PatchMapping("updateConcertByKopisAPI/{concertId}")
public RsData<ConcertDetailResponse> updateConcertByKopisAPI(
@Schema(description = "갱신 대상이 될 공연의 ID 값입니다.")
@PathVariable Long concertId
){
kopisApiService.concertUpdateByKopisApi(concertId);
return RsData.success(concertService.getConcertDetail(concertId));
}

@Operation(summary = "공연 목록 갱신", description = "전체 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고, 바뀐 내용을 갱신하고 추가된 공연을 가져옵니다.")
@PostMapping("updateConcertData")
public RsData<SetResultResponse> updateConcert() throws InterruptedException {
return RsData.success(kopisApiService.updateConcertData());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -24,8 +25,10 @@
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.swing.*;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("api/v1/concerts/")
@RequiredArgsConstructor
Expand All @@ -52,6 +55,16 @@ public RsData<List<ConcertItem>> getUpComingList (
return RsData.success(concertService.getUpcomingConcertsList(pageable));
}

// todo: 내용 구현 필요
@Operation(summary = "공연 예매일 기준 조회(구현 전)", description = "현 시간을 기준으로 예매시간을 내림차순으로 출력하는 공연 목록을 조회합니다.")
@GetMapping("upComingTicketingList")
public RsData<List<ConcertItem>> getUpComingTicketingList (
@Schema(description = "페이징 처리 또는 무한 스크롤 구현에 사용할 Pageable 객체입니다.")
Pageable pageable
){
return null;
}

@Operation(summary = "좋아요 한 공연 조회", description = "좋아요를 누른 공연에 대한 목록을 조회합니다. 저장 날짜를 기준으로 내림차순 정렬로 표시합니다.(최신으로 추가된 목록순입니다.)")
@GetMapping("likedConcertList")
public RsData<List<ConcertItem>> getLikedConcertList (
Expand All @@ -72,8 +85,6 @@ public ConcertDetailResponse getConcertDetail(
return concertService.getConcertDetail(concertId);
}



@Operation(summary = "공연 예매처 조회", description = "공연에 대한 예매처들을 조회합니다.")
@GetMapping("ticketOffices")
public RsData<List<TicketOfficeElement>> getTicketOffices (
Expand Down Expand Up @@ -113,5 +124,17 @@ public RsData<ConcertLikeResponse> isLikeConcert(
return RsData.success(concertService.isLikeConcert(concertId, user));
}

// todo : 제목으로 만 검색 기능 구현 -> 추후 아티스트 정보랑 연동 <- 중요 / 정렬 기준? 최신등록순 정렬
@Operation(summary = "공연 검색", description = "제목에 키워드를 포함하고 있는 공연 정보를 검색합니다.")
@GetMapping("search")
public RsData<List<ConcertItem>> searchConcert(
@Schema(description = "공연 정보 검색 키워드입니다.")
@RequestParam String keyword,
@Schema(description = "페이징 처리 또는 무한 스크롤 구현에 쓸 Pageable 객체입니다.")
Pageable pageable

){
return RsData.success(concertService.getConcertListByKeyword(keyword,pageable));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.result;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;

@Getter
public class SetResultResponse {
@Schema(description = "추가된 공연 수")
private int addedConcerts;

@Schema(description = "갱신된 공연 수")
private int updatedConcerts;

@Schema(description = "추가된 공연 장소 수")
private int addedConcertPlaces;

@Schema(description = "갱신된 공연 장소 수")
private int updatedConcertPlaces;

@Schema(description = "추가된 공연 이미지 수")
private int addedConcertImages;

@Schema(description = "갱신된 공연 이미지 수")
private int updatedConcertImages;

@Schema(description = "추가된 예매처 사이트 수")
private int addedTicketOffice;

@Schema(description = "갱신된 예매처 사이트 수")
private int updatedTicketOffice;

public SetResultResponse(int addedConcerts, int updatedConcerts, int addedConcertPlaces, int updatedConcertPlaces, int addedConcertImages, int updatedConcertImages, int addedTicketOffice, int updatedTicketOffice) {
this.addedConcerts = addedConcerts;
this.updatedConcerts = updatedConcerts;
this.addedConcertPlaces = addedConcertPlaces;
this.updatedConcertPlaces = updatedConcertPlaces;
this.addedConcertImages = addedConcertImages;
this.updatedConcertImages = updatedConcertImages;
this.addedTicketOffice = addedTicketOffice;
this.updatedTicketOffice = updatedTicketOffice;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,15 @@ public Concert(Long concertId) {
this.concertId = concertId;
}

public Concert update(ConcertPlace concertPlace, String content, LocalDateTime ticketTime, int maxPrice, int minPrice){
public Concert updateByAPI(ConcertPlace concertPlace, String content,LocalDate startDate,LocalDate endDate, int maxPrice, int minPrice, String posterUrl) {
this.concertPlace = concertPlace;
this.content = content;
this.ticketTime = ticketTime;
this.startDate = startDate;
this.endDate = endDate;
this.modifiedDate = LocalDateTime.now();
this.maxPrice = maxPrice;
this.minPrice = minPrice;
this.posterUrl = posterUrl;
return this;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.back.web7_9_codecrete_be.domain.concerts.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;

import java.time.LocalDateTime;

@Entity
@Getter
@RequiredArgsConstructor
public class ConcertUpdateTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private LocalDateTime updateTime;

public ConcertUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
}

public ConcertUpdateTime setUpdateTime(LocalDateTime updateTime) {
this.updateTime = updateTime;
return this;
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
package com.back.web7_9_codecrete_be.domain.concerts.repository;

import com.back.web7_9_codecrete_be.domain.concerts.entity.Concert;
import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertImage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface ConcertImageRepository extends JpaRepository<ConcertImage, Long> {
List<ConcertImage> getConcertImagesByConcert_ConcertId(Long concertConcertId);

void deleteAllByConcert(Concert concert);

@Modifying
@Query("""
DELETE
FROM
ConcertImage ci
WHERE
ci.concert.concertId = :concertId
""")
void deleteByConcertId(
@Param("concertId")
Long concertId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,33 @@ List<ConcertItem> getNoTicketTimeConcertList(
)
List<ConcertItem> 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<ConcertItem> getConcertItemsByKeyword(
@Param("keyword")
String keyword,
Pageable pageable);

@Query("""
SELECT
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.back.web7_9_codecrete_be.domain.concerts.repository;

import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertUpdateTime;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.time.LocalDate;

@Repository
public interface ConcertUpdateTimeRepository extends JpaRepository<ConcertUpdateTime, Long> {
}
Loading