diff --git a/.github/workflows/prod-CI.yml b/.github/workflows/prod-CI.yml index bdc82913..50d0cde3 100644 --- a/.github/workflows/prod-CI.yml +++ b/.github/workflows/prod-CI.yml @@ -3,6 +3,8 @@ name: prod-CI on: pull_request: branches: [ "main" ] + push: + branches: [ "main" ] jobs: prod-ci: diff --git a/src/main/java/com/beat/domain/performance/api/HomeController.java b/src/main/java/com/beat/domain/performance/api/HomeController.java index 9bb7abe2..7a7a7159 100644 --- a/src/main/java/com/beat/domain/performance/api/HomeController.java +++ b/src/main/java/com/beat/domain/performance/api/HomeController.java @@ -1,8 +1,8 @@ package com.beat.domain.performance.api; import com.beat.domain.performance.application.PerformanceService; -import com.beat.domain.performance.application.dto.HomeRequest; -import com.beat.domain.performance.application.dto.HomeResponse; +import com.beat.domain.performance.application.dto.home.HomeRequest; +import com.beat.domain.performance.application.dto.home.HomeResponse; import com.beat.domain.performance.domain.Genre; import com.beat.domain.performance.exception.PerformanceSuccessCode; import com.beat.global.common.dto.SuccessResponse; 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 1e54ae85..72c685d9 100644 --- a/src/main/java/com/beat/domain/performance/api/PerformanceController.java +++ b/src/main/java/com/beat/domain/performance/api/PerformanceController.java @@ -1,17 +1,23 @@ package com.beat.domain.performance.api; +import com.beat.domain.performance.application.PerformanceCreateService; 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.create.PerformanceRequest; +import com.beat.domain.performance.application.dto.create.PerformanceResponse; import com.beat.domain.performance.exception.PerformanceSuccessCode; import com.beat.domain.performance.application.PerformanceService; import com.beat.global.auth.annotation.CurrentMember; import com.beat.global.common.dto.SuccessResponse; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -21,6 +27,17 @@ public class PerformanceController { private final PerformanceService performanceService; + private final PerformanceCreateService performanceCreateService; + + @Operation(summary = "공연 생성 API", description = "공연을 생성하는 POST API입니다.") + @PostMapping + public ResponseEntity> createPerformance( + @CurrentMember Long userId, + @RequestBody PerformanceRequest performanceRequest) { + PerformanceResponse response = performanceCreateService.createPerformance(userId, performanceRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(SuccessResponse.of(PerformanceSuccessCode.PERFORMANCE_CREATE_SUCCESS, response)); + } @Operation(summary = "공연 상세정보 조회 API", description = "공연 상세페이지의 공연 상세정보를 조회하는 GET API입니다.") @GetMapping("/detail/{performanceId}") diff --git a/src/main/java/com/beat/domain/performance/application/PerformanceCreateService.java b/src/main/java/com/beat/domain/performance/application/PerformanceCreateService.java new file mode 100644 index 00000000..82e06031 --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/PerformanceCreateService.java @@ -0,0 +1,155 @@ +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 62136665..ff96a175 100644 --- a/src/main/java/com/beat/domain/performance/application/PerformanceService.java +++ b/src/main/java/com/beat/domain/performance/application/PerformanceService.java @@ -3,6 +3,10 @@ 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.home.HomePerformanceDetail; +import com.beat.domain.performance.application.dto.home.HomePromotionDetail; +import com.beat.domain.performance.application.dto.home.HomeRequest; +import com.beat.domain.performance.application.dto.home.HomeResponse; import com.beat.domain.performance.dao.PerformanceRepository; import com.beat.domain.performance.domain.Performance; import com.beat.domain.performance.exception.PerformanceErrorCode; diff --git a/src/main/java/com/beat/domain/performance/application/dto/create/CastRequest.java b/src/main/java/com/beat/domain/performance/application/dto/create/CastRequest.java new file mode 100644 index 00000000..60cc9b47 --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/create/CastRequest.java @@ -0,0 +1,7 @@ +package com.beat.domain.performance.application.dto.create; + +public record CastRequest( + String castName, + String castRole, + String castPhoto +) {} diff --git a/src/main/java/com/beat/domain/performance/application/dto/create/CastResponse.java b/src/main/java/com/beat/domain/performance/application/dto/create/CastResponse.java new file mode 100644 index 00000000..00f18e4c --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/create/CastResponse.java @@ -0,0 +1,22 @@ +package com.beat.domain.performance.application.dto.create; + +public record CastResponse( + Long castId, + String castName, + String castRole, + String castPhoto +) { + public static CastResponse of( + Long castId, + String castName, + String castRole, + String castPhoto + ) { + return new CastResponse( + castId, + castName, + castRole, + castPhoto + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/beat/domain/performance/application/dto/create/PerformanceRequest.java b/src/main/java/com/beat/domain/performance/application/dto/create/PerformanceRequest.java new file mode 100644 index 00000000..1ae592f9 --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/create/PerformanceRequest.java @@ -0,0 +1,27 @@ +package com.beat.domain.performance.application.dto.create; + +import com.beat.domain.performance.domain.BankName; +import com.beat.domain.performance.domain.Genre; + +import java.util.List; + +public record PerformanceRequest( + 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, + List scheduleList, + List castList, + List staffList +) {} \ No newline at end of file diff --git a/src/main/java/com/beat/domain/performance/application/dto/create/PerformanceResponse.java b/src/main/java/com/beat/domain/performance/application/dto/create/PerformanceResponse.java new file mode 100644 index 00000000..9d34b8da --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/create/PerformanceResponse.java @@ -0,0 +1,75 @@ +package com.beat.domain.performance.application.dto.create; + +import com.beat.domain.performance.domain.BankName; +import com.beat.domain.performance.domain.Genre; + +import java.util.List; + +public record PerformanceResponse( + 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, + List scheduleList, + List castList, + List staffList +) { + public static PerformanceResponse 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, + List scheduleList, + List castList, + List staffList + ) { + return new PerformanceResponse( + userId, + performanceId, + performanceTitle, + genre, + runningTime, + performanceDescription, + performanceAttentionNote, + bankName, + accountNumber, + accountHolder, + posterImage, + performanceTeamName, + performanceVenue, + performanceContact, + performancePeriod, + ticketPrice, + totalScheduleCount, + scheduleList, + castList, + staffList + ); + } +} diff --git a/src/main/java/com/beat/domain/performance/application/dto/create/ScheduleRequest.java b/src/main/java/com/beat/domain/performance/application/dto/create/ScheduleRequest.java new file mode 100644 index 00000000..526d0d6e --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/create/ScheduleRequest.java @@ -0,0 +1,11 @@ +package com.beat.domain.performance.application.dto.create; + +import com.beat.domain.schedule.domain.ScheduleNumber; + +import java.time.LocalDateTime; + +public record ScheduleRequest( + LocalDateTime performanceDate, + int totalTicketCount, + ScheduleNumber scheduleNumber +) {} \ No newline at end of file diff --git a/src/main/java/com/beat/domain/performance/application/dto/create/ScheduleResponse.java b/src/main/java/com/beat/domain/performance/application/dto/create/ScheduleResponse.java new file mode 100644 index 00000000..88a06f46 --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/create/ScheduleResponse.java @@ -0,0 +1,29 @@ +package com.beat.domain.performance.application.dto.create; + +import com.beat.domain.schedule.domain.ScheduleNumber; + +import java.time.LocalDateTime; + +public record ScheduleResponse( + Long scheduleId, + LocalDateTime performanceDate, + int totalTicketCount, + int dueDate, + ScheduleNumber scheduleNumber +) { + public static ScheduleResponse of( + Long scheduleId, + LocalDateTime performanceDate, + int totalTicketCount, + int dueDate, + ScheduleNumber scheduleNumber + ) { + return new ScheduleResponse( + scheduleId, + performanceDate, + totalTicketCount, + dueDate, + scheduleNumber + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/beat/domain/performance/application/dto/create/StaffRequest.java b/src/main/java/com/beat/domain/performance/application/dto/create/StaffRequest.java new file mode 100644 index 00000000..8b126d56 --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/create/StaffRequest.java @@ -0,0 +1,7 @@ +package com.beat.domain.performance.application.dto.create; + +public record StaffRequest( + String staffName, + String staffRole, + String staffPhoto +) {} \ No newline at end of file diff --git a/src/main/java/com/beat/domain/performance/application/dto/create/StaffResponse.java b/src/main/java/com/beat/domain/performance/application/dto/create/StaffResponse.java new file mode 100644 index 00000000..c08fc2f9 --- /dev/null +++ b/src/main/java/com/beat/domain/performance/application/dto/create/StaffResponse.java @@ -0,0 +1,22 @@ +package com.beat.domain.performance.application.dto.create; + +public record StaffResponse( + Long staffId, + String staffName, + String staffRole, + String staffPhoto +) { + public static StaffResponse of( + Long staffId, + String staffName, + String staffRole, + String staffPhoto + ) { + return new StaffResponse( + staffId, + staffName, + staffRole, + staffPhoto + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/beat/domain/performance/application/dto/HomePerformanceDetail.java b/src/main/java/com/beat/domain/performance/application/dto/home/HomePerformanceDetail.java similarity index 91% rename from src/main/java/com/beat/domain/performance/application/dto/HomePerformanceDetail.java rename to src/main/java/com/beat/domain/performance/application/dto/home/HomePerformanceDetail.java index 51537a79..1417cfb4 100644 --- a/src/main/java/com/beat/domain/performance/application/dto/HomePerformanceDetail.java +++ b/src/main/java/com/beat/domain/performance/application/dto/home/HomePerformanceDetail.java @@ -1,4 +1,4 @@ -package com.beat.domain.performance.application.dto; +package com.beat.domain.performance.application.dto.home; public record HomePerformanceDetail( Long performanceId, diff --git a/src/main/java/com/beat/domain/performance/application/dto/HomePromotionDetail.java b/src/main/java/com/beat/domain/performance/application/dto/home/HomePromotionDetail.java similarity index 84% rename from src/main/java/com/beat/domain/performance/application/dto/HomePromotionDetail.java rename to src/main/java/com/beat/domain/performance/application/dto/home/HomePromotionDetail.java index 02ead354..9bd9e35f 100644 --- a/src/main/java/com/beat/domain/performance/application/dto/HomePromotionDetail.java +++ b/src/main/java/com/beat/domain/performance/application/dto/home/HomePromotionDetail.java @@ -1,4 +1,4 @@ -package com.beat.domain.performance.application.dto; +package com.beat.domain.performance.application.dto.home; public record HomePromotionDetail( Long promotionId, diff --git a/src/main/java/com/beat/domain/performance/application/dto/HomeRequest.java b/src/main/java/com/beat/domain/performance/application/dto/home/HomeRequest.java similarity index 61% rename from src/main/java/com/beat/domain/performance/application/dto/HomeRequest.java rename to src/main/java/com/beat/domain/performance/application/dto/home/HomeRequest.java index 518eae89..841c8f08 100644 --- a/src/main/java/com/beat/domain/performance/application/dto/HomeRequest.java +++ b/src/main/java/com/beat/domain/performance/application/dto/home/HomeRequest.java @@ -1,4 +1,4 @@ -package com.beat.domain.performance.application.dto; +package com.beat.domain.performance.application.dto.home; import com.beat.domain.performance.domain.Genre; diff --git a/src/main/java/com/beat/domain/performance/application/dto/HomeResponse.java b/src/main/java/com/beat/domain/performance/application/dto/home/HomeResponse.java similarity index 85% rename from src/main/java/com/beat/domain/performance/application/dto/HomeResponse.java rename to src/main/java/com/beat/domain/performance/application/dto/home/HomeResponse.java index 7690d1c4..c3d963b4 100644 --- a/src/main/java/com/beat/domain/performance/application/dto/HomeResponse.java +++ b/src/main/java/com/beat/domain/performance/application/dto/home/HomeResponse.java @@ -1,4 +1,4 @@ -package com.beat.domain.performance.application.dto; +package com.beat.domain.performance.application.dto.home; import java.util.List; 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 596b114f..83c51436 100644 --- a/src/main/java/com/beat/domain/performance/exception/PerformanceSuccessCode.java +++ b/src/main/java/com/beat/domain/performance/exception/PerformanceSuccessCode.java @@ -7,6 +7,7 @@ @Getter @RequiredArgsConstructor public enum PerformanceSuccessCode implements BaseSuccessCode { + PERFORMANCE_CREATE_SUCCESS(201, "공연이 성공정으로 생성되었습니다."), PERFORMANCE_RETRIEVE_SUCCESS(200, "공연 상세 정보 조회가 성공적으로 완료되었습니다."), BOOKING_PERFORMANCE_RETRIEVE_SUCCESS(200, "예매 관련 공연 정보 조회가 성공적으로 완료되었습니다."), HOME_PERFORMANCE_RETRIEVE_SUCCESS(200, "홈 화면 공연 목록 조회가 성공적으로 완료되었습니다."), diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 56dccc8e..ac983627 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -65,3 +65,4 @@ cloud: bucket: beat-dev-bucket stack: auto: false + diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 2f981edf..683046ee 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -28,7 +28,7 @@ spring: data: redis: - host: redis + host: beat-prod-redis port: 6379 security: @@ -65,3 +65,4 @@ cloud: bucket: beat-prod-bucket stack: auto: false +