Skip to content

Commit 2407772

Browse files
Merge pull request #139 from prgrms-web-devcourse-final-project/feat/#134
[Concert] 공연장 상세 정보 조회 추가, 공연 상세정보 조회 수정
2 parents 5423506 + b22839f commit 2407772

10 files changed

Lines changed: 181 additions & 20 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertAdminController.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package com.back.web7_9_codecrete_be.domain.concerts.controller;
22

3-
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concert.ConcertListResponse;
4-
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concertPlace.ConcertPlaceListResponse;
53
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.result.SetResultResponse;
64
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertDetailResponse;
75
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem;
@@ -16,7 +14,6 @@
1614
import io.swagger.v3.oas.annotations.tags.Tag;
1715
import lombok.RequiredArgsConstructor;
1816
import org.springframework.data.domain.Pageable;
19-
import org.springframework.stereotype.Controller;
2017
import org.springframework.web.bind.annotation.*;
2118

2219
import java.util.List;
@@ -96,7 +93,7 @@ public RsData<ConcertDetailResponse> ticketTimeSet(
9693
""")
9794
ConcertTicketTimeSetRequest concertTicketTimeSetRequest
9895
) {
99-
return RsData.success(concertService.setConcertTime(concertTicketTimeSetRequest));
96+
return RsData.success(concertService.setConcertTicketingTime(concertTicketTimeSetRequest));
10097
}
10198

10299
@Operation(summary = "개별 공연 API통한 갱신", description = "개별 공연에 대해서 공연 예술 통합망(Kopis)을 통해 데이터를 조회하고 해당 데이터를 갱신합니다.")

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/controller/ConcertController.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.back.web7_9_codecrete_be.domain.concerts.controller;
22

33
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concert.ConcertListResponse;
4+
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concertPlace.ConcertPlaceDetailResponse;
45
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concertPlace.ConcertPlaceListResponse;
56
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertDetailResponse;
67
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertItem;
78
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ConcertLikeResponse;
89
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.ListSort;
10+
import com.back.web7_9_codecrete_be.domain.concerts.dto.concertPlace.PlaceDetailResponse;
911
import com.back.web7_9_codecrete_be.domain.concerts.dto.ticketOffice.TicketOfficeElement;
1012
import com.back.web7_9_codecrete_be.domain.concerts.entity.TicketOffice;
1113
import com.back.web7_9_codecrete_be.domain.concerts.service.ConcertService;
@@ -174,4 +176,19 @@ public RsData<List<ConcertItem>> searchConcert(
174176
return RsData.success(concertService.getConcertListByKeyword(keyword, pageable));
175177
}
176178

179+
@Operation(summary = "공연의 공연장소 상세 조회", description = "해당 공연의 공연장의 상세 정보를 표시합니다.")
180+
@GetMapping("placeDetail")
181+
public RsData<PlaceDetailResponse> placeDetail(
182+
@RequestParam
183+
@Schema(description = """
184+
<h3>조회 기준이 되는 concertId입니다.</h3>
185+
<hr/>
186+
DB에 저장되어 있는 공연의 ID 값을 기준으로 해당 공연의 공연장 상세 정보를조회합니다. <br/>
187+
<strong>?concertId={concertId}</strong> 로 값을 넘기시면 됩니다.
188+
""")
189+
long concertId
190+
){
191+
return RsData.success(concertService.getConcertPlaceDetail(concertId));
192+
}
193+
177194
}

src/main/java/com/back/web7_9_codecrete_be/domain/concerts/dto/KopisApiDto/concertPlace/ConcertPlaceDetailElement.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,6 @@ public class ConcertPlaceDetailElement {
8080
private List<ConcertHallResponse> halls;
8181

8282
public ConcertPlace getConcertPlace() {
83-
return new ConcertPlace(
84-
this.concertPlaceName,
85-
this.concertPlaceAddress,
86-
Double.parseDouble(lat),
87-
Double.parseDouble(lon),
88-
Integer.parseInt(seatScale),
89-
concertPlaceApiId
90-
);
83+
return new ConcertPlace(this);
9184
}
9285
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ public class ConcertDetailResponse {
2626
@Schema(description = "콘서트 장소 이름입니다.")
2727
private String placeName;
2828

29+
@Schema(description = "콘서트 장 주소입니다.")
30+
private String placeAddress;
31+
2932
@Schema(description = "콘서트 예매 시작 날짜입니다.")
3033
private LocalDateTime ticketTime;
3134

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.back.web7_9_codecrete_be.domain.concerts.dto.concertPlace;
2+
3+
import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertPlace;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import lombok.Getter;
6+
7+
@Getter
8+
public class PlaceDetailResponse {
9+
@Schema(description = "공연장 이름입니다.")
10+
private String placeName;
11+
12+
@Schema(description = "공연장 주소입니다.")
13+
private String placeAddress;
14+
15+
@Schema(description = "공연장 전화번호입니다.")
16+
private String telephone;
17+
18+
@Schema(description = "공연장 페이지 주소입니다.")
19+
private String placeUrl;
20+
21+
@Schema(description = "공연장 위도입니다.")
22+
private double lat;
23+
24+
@Schema(description = "공연장 경도입니다.")
25+
private double lon;
26+
27+
@Schema(description = "해당 공연장에 식당이 있는지 여부입니다.")
28+
private boolean hasRestaurant;
29+
30+
@Schema(description = "해당 공연장에 카페가 있는지 여부입니다.")
31+
private boolean hasCafe;
32+
33+
@Schema(description = "해당 공연장에 편의점이 있는지 여부입니다.")
34+
private boolean hasStore;
35+
36+
@Schema(description = "해당 공연장에 놀이방이 있는지 여부입니다.")
37+
private boolean hasPlayroom;
38+
39+
@Schema(description = "해당 공연장에 수유실이 있는지 여부입니다.")
40+
private boolean hasNursingRoom;
41+
42+
@Schema(description = "해당 공연장에 장애인 전용 주차 시설이 있는지 여부입니다.")
43+
private boolean hasBarrierFreeParking;
44+
45+
@Schema(description = "해당 공연장에 장애인 전용 화장실이 있는지 여부입니다.")
46+
private boolean hasBarrierFreeRestRoom;
47+
48+
@Schema(description = "해당 공연장에 장애인 전용 경사로가 있는지 여부입니다.")
49+
private boolean hasBarrierFreeRamp;
50+
51+
@Schema(description = "해당 공연장에 장애인 전용엘레베이터가 있는지 여부입니다.")
52+
private boolean hasBarrierFreeElevator;
53+
54+
@Schema(description = "해당 공연장에 주차장이 존재하는지 여부입니다.")
55+
private boolean hasParking;
56+
57+
public PlaceDetailResponse(ConcertPlace concertPlace) {
58+
this.placeName = concertPlace.getPlaceName();
59+
this.placeAddress = concertPlace.getAddress();
60+
this.telephone = concertPlace.getTelephone();
61+
this.placeUrl = concertPlace.getPlaceUrl();
62+
this.lat = concertPlace.getLat();
63+
this.lon = concertPlace.getLon();
64+
this.hasRestaurant = concertPlace.isHasRestaurant();
65+
this.hasCafe = concertPlace.isHasCafe();
66+
this.hasStore = concertPlace.isHasStore();
67+
this.hasPlayroom = concertPlace.isHasPlayroom();
68+
this.hasNursingRoom = concertPlace.isHasNursingRoom();
69+
this.hasBarrierFreeParking = concertPlace.isHasBarrierFreeParking();
70+
this.hasBarrierFreeRestRoom = concertPlace.isHasBarrierFreeRamp();
71+
this.hasBarrierFreeRamp = concertPlace.isHasBarrierFreeRamp();
72+
this.hasBarrierFreeElevator = concertPlace.isHasBarrierFreeElevator();
73+
this.hasParking = concertPlace.isHasParking();
74+
}
75+
}

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.web7_9_codecrete_be.domain.concerts.entity;
22

3+
import com.back.web7_9_codecrete_be.domain.concerts.dto.KopisApiDto.concertPlace.ConcertPlaceDetailElement;
34
import jakarta.persistence.*;
45
import lombok.Getter;
56
import lombok.RequiredArgsConstructor;
@@ -20,6 +21,10 @@ public class ConcertPlace {
2021
@Column(nullable = false)
2122
private String address;
2223

24+
private String telephone;
25+
26+
private String placeUrl;
27+
2328
@Column(nullable = false)
2429
private double lat;
2530

@@ -29,6 +34,26 @@ public class ConcertPlace {
2934
@Column(nullable = false)
3035
private int seats;
3136

37+
private boolean hasRestaurant;
38+
39+
private boolean hasCafe;
40+
41+
private boolean hasStore;
42+
43+
private boolean hasPlayroom;
44+
45+
private boolean hasNursingRoom;
46+
47+
private boolean hasBarrierFreeParking;
48+
49+
private boolean hasBarrierFreeRestRoom;
50+
51+
private boolean hasBarrierFreeRamp;
52+
53+
private boolean hasBarrierFreeElevator;
54+
55+
private boolean hasParking;
56+
3257
@Column(name = "api_concert_place_id")
3358
private String apiConcertPlaceId;
3459

@@ -41,6 +66,27 @@ public ConcertPlace(String placeName, String address, double lat, double lon, in
4166
this.apiConcertPlaceId = apiConcertPlaceId;
4267
}
4368

69+
public ConcertPlace(ConcertPlaceDetailElement concertPlaceDetailElement) {
70+
this.placeName = concertPlaceDetailElement.getConcertPlaceName();
71+
this.address = concertPlaceDetailElement.getConcertPlaceAddress();
72+
this.telephone = concertPlaceDetailElement.getTelephone();
73+
this.placeUrl = concertPlaceDetailElement.getConcertPlaceUrl();
74+
this.lat = Double.parseDouble(concertPlaceDetailElement.getLat());
75+
this.lon = Double.parseDouble(concertPlaceDetailElement.getLon());
76+
this.seats = Integer.parseInt(concertPlaceDetailElement.getSeatScale());
77+
this.apiConcertPlaceId = concertPlaceDetailElement.getConcertPlaceApiId();
78+
this.hasRestaurant = concertPlaceDetailElement.getRestaurant().equals("Y");
79+
this.hasCafe = concertPlaceDetailElement.getCafe().equals("Y");
80+
this.hasStore = concertPlaceDetailElement.getStore().equals("Y");
81+
this.hasPlayroom = concertPlaceDetailElement.getPlayGround().equals("Y");
82+
this.hasNursingRoom = concertPlaceDetailElement.getSuyu().equals("Y");
83+
this.hasBarrierFreeParking = concertPlaceDetailElement.getParkBarrier().equals("Y");
84+
this.hasBarrierFreeRestRoom = concertPlaceDetailElement.getRestBarrier().equals("Y");
85+
this.hasBarrierFreeRamp = concertPlaceDetailElement.getRunwBarrier().equals("Y");
86+
this.hasBarrierFreeElevator = concertPlaceDetailElement.getElevBarrier().equals("Y");
87+
this.hasParking = concertPlaceDetailElement.getParkingLot().equals("Y");
88+
}
89+
4490
@Override
4591
public String toString() {
4692
return "ConcertPlace{" +

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.back.web7_9_codecrete_be.domain.concerts.entity.ConcertPlace;
44
import org.springframework.data.domain.Sort;
55
import org.springframework.data.jpa.repository.JpaRepository;
6+
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
68
import org.springframework.stereotype.Repository;
79

810
@Repository
@@ -12,4 +14,16 @@ public interface ConcertPlaceRepository extends JpaRepository<ConcertPlace, Long
1214
ConcertPlace getConcertPlaceByApiConcertPlaceId(String apiConcertPlaceId, Sort sort);
1315

1416
ConcertPlace getConcertPlaceByApiConcertPlaceId(String apiConcertPlaceId);
17+
18+
@Query("""
19+
SELECT
20+
cp
21+
FROM
22+
Concert c
23+
JOIN c.concertPlace cp
24+
WHERE
25+
c.concertId = :concertId
26+
""")
27+
ConcertPlace getConcertPlaceByConcertId(
28+
@Param("concertId")long concertId);
1529
}

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
@@ -256,6 +256,7 @@ List<ConcertItem> getConcertItemsByKeyword(
256256
c.name as name,
257257
c.content as description,
258258
c.concertPlace.placeName as placeName,
259+
c.concertPlace.address as placeAddress,
259260
c.ticketTime as ticketTime,
260261
c.startDate as startDate,
261262
c.endDate as endDate,

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.back.web7_9_codecrete_be.domain.concerts.service;
22

33
import com.back.web7_9_codecrete_be.domain.concerts.dto.concert.*;
4+
import com.back.web7_9_codecrete_be.domain.concerts.dto.concertPlace.PlaceDetailResponse;
45
import com.back.web7_9_codecrete_be.domain.concerts.dto.ticketOffice.TicketOfficeElement;
56
import com.back.web7_9_codecrete_be.domain.concerts.entity.*;
67
import com.back.web7_9_codecrete_be.domain.concerts.repository.*;
@@ -32,6 +33,7 @@ public class ConcertService {
3233
private final ConcertImageRepository concertImageRepository;
3334

3435

36+
// 공연 목록 조회
3537
public List<ConcertItem> getConcertsList(Pageable pageable, ListSort sort) {
3638
switch (sort) {
3739
case LIKE -> {
@@ -54,21 +56,25 @@ public List<ConcertItem> getConcertsList(Pageable pageable, ListSort sort) {
5456
return concertRepository.getConcertItems(pageable);
5557
}
5658

59+
// 사용자가 좋아요 한 공연 목록 조회
5760
public List<ConcertItem> getLikedConcertsList(Pageable pageable,User user) {
5861
return concertRepository.getLikedConcertsList(pageable, user.getId());
5962
}
6063

64+
// 티켓팅 시간이 없는 공연 목록 조회
6165
public List<ConcertItem> getNoTicketTimeConcertsList(Pageable pageable) {
6266
return concertRepository.getNoTicketTimeConcertList(pageable);
6367
}
6468

69+
// 키워드 통한 공연 제목 검색
6570
public List<ConcertItem> getConcertListByKeyword(String keyword, Pageable pageable) {
6671
if(keyword == null || keyword.isEmpty()){
6772
throw new BusinessException(ConcertErrorCode.KEYWORD_IS_NULL);
6873
}
6974
return concertRepository.getConcertItemsByKeyword(keyword, pageable);
7075
}
7176

77+
// 공연 상세 조회 조회시 조회수 1 증가
7278
@Transactional
7379
public ConcertDetailResponse getConcertDetail(long concertId) {
7480
ConcertDetailResponse concertDetailResponse = concertRepository.getConcertDetailById(concertId);
@@ -95,6 +101,7 @@ public List<ConcertItem> getConcertsList2(Pageable pageable) {
95101
}
96102
*/
97103

104+
// 공연 예매처 조회
98105
public List<TicketOfficeElement> getTicketOfficesList(long concertId) {
99106
List<TicketOffice> ticketOffices = ticketOfficeRepository.getTicketOfficesByConcert_ConcertId(concertId);
100107
List<TicketOfficeElement> ticketOfficeList = new ArrayList<>();
@@ -105,6 +112,7 @@ public List<TicketOfficeElement> getTicketOfficesList(long concertId) {
105112
return ticketOfficeList;
106113
}
107114

115+
// 공연 좋아요 여부 확인
108116
public ConcertLikeResponse isLikeConcert(Long concertId, User user) {
109117
Concert concert = findConcertByConcertId(concertId);
110118
ConcertLikeResponse concertLikeResponse;
@@ -117,6 +125,7 @@ public ConcertLikeResponse isLikeConcert(Long concertId, User user) {
117125
return concertLikeResponse;
118126
}
119127

128+
// 사용자가 해당 공연에 좋아요
120129
@Transactional
121130
public void likeConcert(long concertId, User user) {
122131
Concert concert = findConcertByConcertId(concertId);
@@ -129,6 +138,7 @@ public void likeConcert(long concertId, User user) {
129138
concertRepository.concertLikeCountUp(concertId);
130139
}
131140

141+
// 사용자가 해당 공연에 좋아요 해제
132142
@Transactional
133143
public void dislikeConcert(long concertId, User user) {
134144
Concert concert = findConcertByConcertId(concertId);
@@ -141,6 +151,7 @@ public void dislikeConcert(long concertId, User user) {
141151
concertRepository.concertLikeCountDown(concertId);
142152
}
143153

154+
// 공연 내용 갱신
144155
public ConcertItem updateConcert(long concertId, ConcertUpdateRequest concertUpdateRequest) {
145156
Concert concert = findConcertByConcertId(concertId);
146157
ConcertPlace concertPlace = concertPlaceRepository.findById(concertUpdateRequest.getPlaceId()).orElseThrow();
@@ -149,21 +160,30 @@ public ConcertItem updateConcert(long concertId, ConcertUpdateRequest concertUpd
149160
return new ConcertItem(updatedConcert);
150161
}
151162

152-
public ConcertDetailResponse setConcertTime(ConcertTicketTimeSetRequest concertTicketTimeSetRequest) {
163+
// 공연 시간 설정
164+
public ConcertDetailResponse setConcertTicketingTime(ConcertTicketTimeSetRequest concertTicketTimeSetRequest) {
153165
Concert concert = findConcertByConcertId(concertTicketTimeSetRequest.getConcertId());
154166
concert.ticketTimeSet(concertTicketTimeSetRequest.getTicketTime());
155167
Concert savedConcert = concertRepository.save(concert);
156168
return concertRepository.getConcertDetailById(savedConcert.getConcertId());
157169
}
158170

171+
// 공연 삭제
159172
public void deleteConcert(long concertId) {
160173
concertRepository.deleteById(concertId);
161174
}
162175

176+
// 아티스트 Id 리스트로 해당 아티스트들의 공연 목록 조회
163177
public List<Concert> findConcertsByArtistIds(List<Long> artistIds) {
164178
return concertRepository.findDistinctByArtistIds(artistIds);
165179
}
166-
180+
181+
// 공연 시설 조회
182+
public PlaceDetailResponse getConcertPlaceDetail(long concertId) {
183+
ConcertPlace concertPlace = concertPlaceRepository.getConcertPlaceByConcertId(concertId);
184+
return new PlaceDetailResponse(concertPlace);
185+
}
186+
167187
private Concert findConcertByConcertId(long concertId) {
168188
return concertRepository.findById(concertId).orElseThrow(
169189
() -> new BusinessException(ConcertErrorCode.CONCERT_NOT_FOUND)

0 commit comments

Comments
 (0)