From ff1618c444035b6d35c08fe8b5e6b070a91fef1f Mon Sep 17 00:00:00 2001 From: DongHoon Lee <125895298+hoonyworld@users.noreply.github.com> Date: Thu, 18 Jul 2024 02:24:22 +0900 Subject: [PATCH] =?UTF-8?q?[feat]=20#117=20-=20=EA=B3=B5=EC=97=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20GET=20API=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20(#121)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [#117] remove(PerformanceCreateService): 사용하지 않는 클래스 삭제 * [#117] refactor(CastRepository): DB에 등록된 등장인물을 모두 가져오는 메서드 구현 * [#117] refactor(ScheduleRepository): DB에 등록된 회차를 모두 가져오는 메서드 구현 * [#117] refactor(StaffRepository): DB에 등록된 스태프를 모두 가져오는 메서드 구현 * [#117] refactor(PerformanceSuccessCode): 공연 수정 페이지 조회 성공 메시지 추가 * [#117] refactor(PerformanceEditResponse): 공연 수정 페이지 조회 응답 DTO 생성 * [#117] refactor(PerformanceService): 수정 페이지의 정보를 조회하는 서비스 로직 구현 * [#117] feat(PerformanceController): 공연 수정 페이지의 정보를 조회하는 GET API 구현 --- .../beat/domain/cast/dao/CastRepository.java | 2 + .../api/PerformanceController.java | 12 +- .../application/PerformanceCreateService.java | 155 ------------------ .../application/PerformanceService.java | 84 ++++++++++ .../dto/PerformanceEditResponse.java | 81 +++++++++ .../exception/PerformanceSuccessCode.java | 1 + .../schedule/dao/ScheduleRepository.java | 3 + .../domain/staff/dao/StaffRepository.java | 2 + 8 files changed, 184 insertions(+), 156 deletions(-) delete mode 100644 src/main/java/com/beat/domain/performance/application/PerformanceCreateService.java create mode 100644 src/main/java/com/beat/domain/performance/application/dto/PerformanceEditResponse.java diff --git a/src/main/java/com/beat/domain/cast/dao/CastRepository.java b/src/main/java/com/beat/domain/cast/dao/CastRepository.java index 2fe757ff..37eb520b 100644 --- a/src/main/java/com/beat/domain/cast/dao/CastRepository.java +++ b/src/main/java/com/beat/domain/cast/dao/CastRepository.java @@ -7,4 +7,6 @@ public interface CastRepository extends JpaRepository { List findByPerformanceId(Long performanceId); + + List findAllByPerformanceId(Long performanceId); } diff --git a/src/main/java/com/beat/domain/performance/api/PerformanceController.java b/src/main/java/com/beat/domain/performance/api/PerformanceController.java index 14505059..69e75616 100644 --- a/src/main/java/com/beat/domain/performance/api/PerformanceController.java +++ b/src/main/java/com/beat/domain/performance/api/PerformanceController.java @@ -5,6 +5,7 @@ import com.beat.domain.performance.application.dto.BookingPerformanceDetailResponse; import com.beat.domain.performance.application.dto.MakerPerformanceResponse; import com.beat.domain.performance.application.dto.PerformanceDetailResponse; +import com.beat.domain.performance.application.dto.PerformanceEditResponse; import com.beat.domain.performance.application.dto.create.PerformanceRequest; import com.beat.domain.performance.application.dto.create.PerformanceResponse; import com.beat.domain.performance.application.dto.update.PerformanceUpdateRequest; @@ -35,7 +36,6 @@ public class PerformanceController { private final PerformanceManagementService performanceManagementService; private final PerformanceUpdateService performanceUpdateService; - @Operation(summary = "공연 생성 API", description = "공연을 생성하는 POST API입니다.") @PostMapping public ResponseEntity> createPerformance( @@ -45,6 +45,7 @@ public ResponseEntity> createPerformance( return ResponseEntity.status(HttpStatus.CREATED) .body(SuccessResponse.of(PerformanceSuccessCode.PERFORMANCE_CREATE_SUCCESS, response)); } + @Operation(summary = "공연 정보 수정 API", description = "공연 정보를 수정하는 PUT API입니다.") @PutMapping public ResponseEntity> updatePerformance( @@ -55,6 +56,15 @@ public ResponseEntity> updatePerforma .body(SuccessResponse.of(PerformanceSuccessCode.PERFORMANCE_UPDATE_SUCCESS, response)); } + @Operation(summary = "공연 수정 페이지 정보 조회 API", description = "공연 정보를 조회하는 GET API입니다.") + @GetMapping("/{performanceId}") + public ResponseEntity> getPerformanceForEdit( + @CurrentMember Long memberId, + @PathVariable Long performanceId) { + PerformanceEditResponse response = performanceService.getPerformanceEdit(memberId, performanceId); + return ResponseEntity.ok(SuccessResponse.of(PerformanceSuccessCode.PERFORMANCE_MODIFY_PAGE_SUCCESS, response)); + } + @Operation(summary = "공연 상세정보 조회 API", description = "공연 상세페이지의 공연 상세정보를 조회하는 GET API입니다.") @GetMapping("/detail/{performanceId}") public ResponseEntity> getPerformanceDetail( diff --git a/src/main/java/com/beat/domain/performance/application/PerformanceCreateService.java b/src/main/java/com/beat/domain/performance/application/PerformanceCreateService.java deleted file mode 100644 index 82e06031..00000000 --- a/src/main/java/com/beat/domain/performance/application/PerformanceCreateService.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.beat.domain.performance.application; - -import com.beat.domain.cast.dao.CastRepository; -import com.beat.domain.cast.domain.Cast; -import com.beat.domain.performance.application.dto.create.CastResponse; -import com.beat.domain.performance.application.dto.create.PerformanceRequest; -import com.beat.domain.performance.application.dto.create.PerformanceResponse; -import com.beat.domain.performance.application.dto.create.ScheduleResponse; -import com.beat.domain.performance.application.dto.create.StaffResponse; -import com.beat.domain.performance.dao.PerformanceRepository; -import com.beat.domain.performance.domain.Performance; -import com.beat.domain.schedule.dao.ScheduleRepository; -import com.beat.domain.schedule.domain.Schedule; -import com.beat.domain.staff.dao.StaffRepository; -import com.beat.domain.staff.domain.Staff; -import com.beat.domain.user.dao.UserRepository; -import com.beat.domain.user.domain.Users; -import com.beat.domain.user.exception.UserErrorCode; -import com.beat.global.common.exception.NotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class PerformanceCreateService { - - private final PerformanceRepository performanceRepository; - private final ScheduleRepository scheduleRepository; - private final UserRepository userRepository; - private final CastRepository castRepository; - private final StaffRepository staffRepository; - - @Transactional - public PerformanceResponse createPerformance(Long userId, PerformanceRequest request) { - Users user = userRepository.findById(userId) - .orElseThrow(() -> new NotFoundException(UserErrorCode.USER_NOT_FOUND)); - - Performance performance = Performance.create( - request.performanceTitle(), - request.genre(), - request.runningTime(), - request.performanceDescription(), - request.performanceAttentionNote(), - request.bankName(), - request.accountNumber(), - request.accountHolder(), - request.posterImage(), - request.performanceTeamName(), - request.performanceVenue(), - request.performanceContact(), - request.performancePeriod(), - request.ticketPrice(), - request.totalScheduleCount(), - user - ); - performanceRepository.save(performance); - - List schedules = request.scheduleList().stream() - .map(scheduleRequest -> Schedule.create( - scheduleRequest.performanceDate(), - scheduleRequest.totalTicketCount(), - 0, - true, - scheduleRequest.scheduleNumber(), - performance - )) - .collect(Collectors.toList()); - scheduleRepository.saveAll(schedules); - - List casts = request.castList().stream() - .map(castRequest -> Cast.create( - castRequest.castName(), - castRequest.castRole(), - castRequest.castPhoto(), - performance - )) - .collect(Collectors.toList()); - castRepository.saveAll(casts); - - List staffs = request.staffList().stream() - .map(staffRequest -> Staff.create( - staffRequest.staffName(), - staffRequest.staffRole(), - staffRequest.staffPhoto(), - performance - )) - .collect(Collectors.toList()); - staffRepository.saveAll(staffs); - - return mapToPerformanceResponse(performance, schedules, casts, staffs); - } - - private PerformanceResponse mapToPerformanceResponse(Performance performance, List schedules, List casts, List staffs) { - List scheduleResponses = schedules.stream() - .map(schedule -> ScheduleResponse.of( - schedule.getId(), - schedule.getPerformanceDate(), - schedule.getTotalTicketCount(), - calculateDueDate(schedule.getPerformanceDate().toLocalDate()), - schedule.getScheduleNumber() - )) - .collect(Collectors.toList()); - - List castResponses = casts.stream() - .map(cast -> CastResponse.of( - cast.getId(), - cast.getCastName(), - cast.getCastRole(), - cast.getCastPhoto() - )) - .collect(Collectors.toList()); - - List staffResponses = staffs.stream() - .map(staff -> StaffResponse.of( - staff.getId(), - staff.getStaffName(), - staff.getStaffRole(), - staff.getStaffPhoto() - )) - .collect(Collectors.toList()); - - return PerformanceResponse.of( - performance.getUsers().getId(), - performance.getId(), - performance.getPerformanceTitle(), - performance.getGenre(), - performance.getRunningTime(), - performance.getPerformanceDescription(), - performance.getPerformanceAttentionNote(), - performance.getBankName(), - performance.getAccountNumber(), - performance.getAccountHolder(), - performance.getPosterImage(), - performance.getPerformanceTeamName(), - performance.getPerformanceVenue(), - performance.getPerformanceContact(), - performance.getPerformancePeriod(), - performance.getTicketPrice(), - performance.getTotalScheduleCount(), - scheduleResponses, - castResponses, - staffResponses - ); - } - - private int calculateDueDate(LocalDate performanceDate) { - return (int) ChronoUnit.DAYS.between(LocalDate.now(), performanceDate); - } -} \ No newline at end of file diff --git a/src/main/java/com/beat/domain/performance/application/PerformanceService.java b/src/main/java/com/beat/domain/performance/application/PerformanceService.java index a1d4380f..b8a92a7e 100644 --- a/src/main/java/com/beat/domain/performance/application/PerformanceService.java +++ b/src/main/java/com/beat/domain/performance/application/PerformanceService.java @@ -1,8 +1,13 @@ package com.beat.domain.performance.application; +import com.beat.domain.booking.dao.BookingRepository; +import com.beat.domain.cast.domain.Cast; import com.beat.domain.member.dao.MemberRepository; import com.beat.domain.member.domain.Member; import com.beat.domain.member.exception.MemberErrorCode; import com.beat.domain.performance.application.dto.*; +import com.beat.domain.performance.application.dto.create.CastResponse; +import com.beat.domain.performance.application.dto.create.ScheduleResponse; +import com.beat.domain.performance.application.dto.create.StaffResponse; import com.beat.domain.performance.application.dto.home.HomePerformanceDetail; import com.beat.domain.performance.application.dto.home.HomePromotionDetail; import com.beat.domain.performance.application.dto.home.HomeRequest; @@ -17,6 +22,7 @@ import com.beat.domain.cast.dao.CastRepository; import com.beat.domain.schedule.domain.Schedule; import com.beat.domain.staff.dao.StaffRepository; +import com.beat.domain.staff.domain.Staff; import com.beat.domain.user.dao.UserRepository; import com.beat.domain.user.domain.Users; import com.beat.domain.user.exception.UserErrorCode; @@ -25,6 +31,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -39,6 +48,7 @@ public class PerformanceService { private final PromotionRepository promotionRepository; private final MemberRepository memberRepository; private final UserRepository userRepository; + private final BookingRepository bookingRepository; @Transactional(readOnly = true) public PerformanceDetailResponse getPerformanceDetail(Long performanceId) { @@ -206,4 +216,78 @@ public MakerPerformanceResponse getMemberPerformances(Long memberId) { return MakerPerformanceResponse.of(user.getId(), performanceDetails); } + @Transactional + public PerformanceEditResponse getPerformanceEdit(Long memberId, Long performanceId) { + Member member = memberRepository.findById(memberId) + .orElseThrow(() -> new NotFoundException(MemberErrorCode.MEMBER_NOT_FOUND)); + + Performance performance = performanceRepository.findById(performanceId) + .orElseThrow(() -> new NotFoundException(PerformanceErrorCode.PERFORMANCE_NOT_FOUND)); + + boolean isBookerExist = bookingRepository.existsBySchedulePerformanceId(performanceId); + + List schedules = scheduleRepository.findAllByPerformanceId(performanceId); + List casts = castRepository.findAllByPerformanceId(performanceId); + List staffs = staffRepository.findAllByPerformanceId(performanceId); + + return mapToPerformanceEditResponse(performance, schedules, casts, staffs, isBookerExist); + } + + private PerformanceEditResponse mapToPerformanceEditResponse(Performance performance, List schedules, List casts, List staffs, boolean isBookerExist) { + List scheduleResponses = schedules.stream() + .map(schedule -> ScheduleResponse.of( + schedule.getId(), + schedule.getPerformanceDate(), + schedule.getTotalTicketCount(), + calculateDueDate(schedule.getPerformanceDate()), + schedule.getScheduleNumber() + )) + .collect(Collectors.toList()); + + List castResponses = casts.stream() + .map(cast -> CastResponse.of( + cast.getId(), + cast.getCastName(), + cast.getCastRole(), + cast.getCastPhoto() + )) + .collect(Collectors.toList()); + + List staffResponses = staffs.stream() + .map(staff -> StaffResponse.of( + staff.getId(), + staff.getStaffName(), + staff.getStaffRole(), + staff.getStaffPhoto() + )) + .collect(Collectors.toList()); + + return PerformanceEditResponse.of( + performance.getUsers().getId(), + performance.getId(), + performance.getPerformanceTitle(), + performance.getGenre(), + performance.getRunningTime(), + performance.getPerformanceDescription(), + performance.getPerformanceAttentionNote(), + performance.getBankName(), + performance.getAccountNumber(), + performance.getAccountHolder(), + performance.getPosterImage(), + performance.getPerformanceTeamName(), + performance.getPerformanceVenue(), + performance.getPerformanceContact(), + performance.getPerformancePeriod(), + performance.getTicketPrice(), + performance.getTotalScheduleCount(), + isBookerExist, + scheduleResponses, + castResponses, + staffResponses + ); + } + + private int calculateDueDate(LocalDateTime performanceDate) { + return (int) ChronoUnit.DAYS.between(LocalDate.now(), performanceDate.toLocalDate()); + } } diff --git a/src/main/java/com/beat/domain/performance/application/dto/PerformanceEditResponse.java b/src/main/java/com/beat/domain/performance/application/dto/PerformanceEditResponse.java new file mode 100644 index 00000000..e2341753 --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/PerformanceEditResponse.java @@ -0,0 +1,81 @@ +package com.beat.domain.performance.application.dto; + +import com.beat.domain.performance.application.dto.create.CastResponse; +import com.beat.domain.performance.application.dto.create.ScheduleResponse; +import com.beat.domain.performance.application.dto.create.StaffResponse; +import com.beat.domain.performance.domain.BankName; +import com.beat.domain.performance.domain.Genre; + +import java.util.List; + +public record PerformanceEditResponse( + Long userId, + Long performanceId, + String performanceTitle, + Genre genre, + int runningTime, + String performanceDescription, + String performanceAttentionNote, + BankName bankName, + String accountNumber, + String accountHolder, + String posterImage, + String performanceTeamName, + String performanceVenue, + String performanceContact, + String performancePeriod, + int ticketPrice, + int totalScheduleCount, + boolean isBookerExist, + List scheduleList, + List castList, + List staffList +) { + public static PerformanceEditResponse of( + Long userId, + Long performanceId, + String performanceTitle, + Genre genre, + int runningTime, + String performanceDescription, + String performanceAttentionNote, + BankName bankName, + String accountNumber, + String accountHolder, + String posterImage, + String performanceTeamName, + String performanceVenue, + String performanceContact, + String performancePeriod, + int ticketPrice, + int totalScheduleCount, + boolean isBookerExist, + List scheduleList, + List castList, + List staffList + ) { + return new PerformanceEditResponse( + userId, + performanceId, + performanceTitle, + genre, + runningTime, + performanceDescription, + performanceAttentionNote, + bankName, + accountNumber, + accountHolder, + posterImage, + performanceTeamName, + performanceVenue, + performanceContact, + performancePeriod, + ticketPrice, + totalScheduleCount, + isBookerExist, + scheduleList, + castList, + staffList + ); + } +} diff --git a/src/main/java/com/beat/domain/performance/exception/PerformanceSuccessCode.java b/src/main/java/com/beat/domain/performance/exception/PerformanceSuccessCode.java index 917d6c9e..d3ccf21e 100644 --- a/src/main/java/com/beat/domain/performance/exception/PerformanceSuccessCode.java +++ b/src/main/java/com/beat/domain/performance/exception/PerformanceSuccessCode.java @@ -10,6 +10,7 @@ public enum PerformanceSuccessCode implements BaseSuccessCode { PERFORMANCE_CREATE_SUCCESS(201, "공연이 성공적으로 생성되었습니다."), PERFORMANCE_UPDATE_SUCCESS(200, "공연이 성공적으로 수정되었습니다."), PERFORMANCE_RETRIEVE_SUCCESS(200, "공연 상세 정보 조회가 성공적으로 완료되었습니다."), + PERFORMANCE_MODIFY_PAGE_SUCCESS(200, "공연 수정 페이지 조회가 성공적으로 완료되었습니다."), PERFORMANCE_DELETE_SUCCESS(200, "공연이 성공적으로 삭제되었습니다."), BOOKING_PERFORMANCE_RETRIEVE_SUCCESS(200, "예매 관련 공연 정보 조회가 성공적으로 완료되었습니다."), HOME_PERFORMANCE_RETRIEVE_SUCCESS(200, "홈 화면 공연 목록 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/java/com/beat/domain/schedule/dao/ScheduleRepository.java b/src/main/java/com/beat/domain/schedule/dao/ScheduleRepository.java index c3748263..84cae538 100644 --- a/src/main/java/com/beat/domain/schedule/dao/ScheduleRepository.java +++ b/src/main/java/com/beat/domain/schedule/dao/ScheduleRepository.java @@ -17,4 +17,7 @@ public interface ScheduleRepository extends JpaRepository { Optional lockById(@Param("id") Long id); List findByPerformanceId(Long performanceId); + + List findAllByPerformanceId(Long performanceId); + } \ No newline at end of file diff --git a/src/main/java/com/beat/domain/staff/dao/StaffRepository.java b/src/main/java/com/beat/domain/staff/dao/StaffRepository.java index c1acd2eb..d3af9518 100644 --- a/src/main/java/com/beat/domain/staff/dao/StaffRepository.java +++ b/src/main/java/com/beat/domain/staff/dao/StaffRepository.java @@ -7,4 +7,6 @@ public interface StaffRepository extends JpaRepository { List findByPerformanceId(Long performanceId); + + List findAllByPerformanceId(Long performanceId); }