From 46274f0ef0d28479403c11d877f83ee572edd405 Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Sat, 11 Nov 2023 23:17:29 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20=EC=98=88=EC=95=BD=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/reservation/domain/Reservation.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java b/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java index ab662642..a7a42fed 100644 --- a/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java +++ b/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java @@ -5,12 +5,14 @@ import com.shallwe.domain.experiencegift.domain.ExperienceGift; import com.shallwe.domain.memoryphoto.domain.MemoryPhoto; import com.shallwe.domain.reservation.dto.UpdateReservationReq; +import com.shallwe.domain.shopowner.domain.ShopOwner; import com.shallwe.domain.user.domain.User; import jakarta.persistence.*; +import java.time.LocalDate; +import java.time.LocalTime; import lombok.*; import org.hibernate.annotations.Where; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -31,13 +33,20 @@ public class Reservation extends BaseEntity { @JoinColumn(name = "experience_gift_id") private ExperienceGift experienceGift; + @ManyToOne + @JoinColumn(name = "owner_id") + private ShopOwner owner; + + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "sender_id") private User sender; private Long persons; - private LocalDateTime date; + private LocalDate date; + + private LocalTime time; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "receiver_id") @@ -58,10 +67,14 @@ public class Reservation extends BaseEntity { public void updateReservation(UpdateReservationReq updateReq) { this.persons = Optional.ofNullable(updateReq.getPersons()).orElse(this.persons); this.date = Optional.ofNullable(updateReq.getDate()).orElse(this.date); + this.time = Optional.ofNullable(LocalTime.of(updateReq.getTime(),0)).orElse(this.time); this.receiver = Optional.ofNullable(updateReq.getReceiver()).orElse(this.getReceiver()); this.phoneNumber = Optional.ofNullable(updateReq.getPhone_number()).orElse(this.phoneNumber); this.invitationImg = Optional.ofNullable(updateReq.getInvitation_img()).orElse(this.invitationImg); this.invitationComment = Optional.ofNullable(updateReq.getInvitation_comment()).orElse(this.invitationComment); } + public int getHour(){ + return time.getHour(); + } } From 54ff3c677a81debd1751fe9ddd66edff220d3e03 Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Sat, 11 Nov 2023 23:18:17 +0900 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=EC=98=88=EC=95=BD=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ReservationServiceImpl.java | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/shallwe/domain/reservation/application/ReservationServiceImpl.java b/src/main/java/com/shallwe/domain/reservation/application/ReservationServiceImpl.java index bee78d76..16f98c1f 100644 --- a/src/main/java/com/shallwe/domain/reservation/application/ReservationServiceImpl.java +++ b/src/main/java/com/shallwe/domain/reservation/application/ReservationServiceImpl.java @@ -1,6 +1,7 @@ package com.shallwe.domain.reservation.application; import com.shallwe.domain.common.Status; +import com.shallwe.domain.experiencegift.domain.ExperienceGift; import com.shallwe.domain.experiencegift.exception.ExperienceGiftNotFoundException; import com.shallwe.domain.experiencegift.domain.repository.ExperienceGiftRepository; import com.shallwe.domain.reservation.domain.Reservation; @@ -10,9 +11,9 @@ import com.shallwe.domain.reservation.dto.ReservationResponse; import com.shallwe.domain.reservation.dto.UpdateReservationReq; import com.shallwe.domain.reservation.exception.InvalidReservationException; -import com.shallwe.domain.reservation.exception.InvalidUserException; -import com.shallwe.domain.user.domain.repository.UserRepository; -import com.shallwe.domain.user.exception.InvalidPhoneNumberException; +import com.shallwe.domain.shopowner.domain.ShopOwner; +import com.shallwe.domain.shopowner.domain.repository.ShopOwnerRepository; +import com.shallwe.domain.shopowner.exception.InvalidShopOwnerException; import com.shallwe.global.config.security.token.UserPrincipal; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -27,40 +28,39 @@ public class ReservationServiceImpl { private final ReservationRepository reservationRepository; - private final UserRepository userRepository; private final ExperienceGiftRepository experienceGiftRepository; + private final ShopOwnerRepository shopOwnerRepository; - private ReservationResponse getReservation(Long id) { - return reservationRepository.findById(id).map(ReservationResponse::toDto).orElseThrow(InvalidReservationException::new); - } @Transactional - public ReservationResponse addReservation( ReservationRequest reservationRequest, UserPrincipal userPrincipal) { - Reservation reservation = ReservationRequest.toEntity( - reservationRequest, - userRepository.findById(userPrincipal.getId()) - .orElseThrow(InvalidUserException::new), - userRepository.findByPhoneNumber(reservationRequest.getPhoneNumber()) - .orElseThrow(InvalidPhoneNumberException::new), - experienceGiftRepository.findByExperienceGiftId(reservationRequest.getExperienceGiftId()) - .orElseThrow(ExperienceGiftNotFoundException::new)); - - Reservation savedReservation = reservationRepository.save(reservation); - return ReservationResponse.toDto(savedReservation); + public List addOwnerReservation(ReservationRequest reservationRequest,UserPrincipal userPrincipal) { + ExperienceGift experienceGift = experienceGiftRepository.findByExperienceGiftId(reservationRequest.getExperienceGiftId()) + .orElseThrow(ExperienceGiftNotFoundException::new); + + ShopOwner owner = shopOwnerRepository.findById(reservationRequest.getOwnerId()) + .orElseThrow(InvalidShopOwnerException::new); + + List reservations = ReservationRequest.toEntityForOwner(reservationRequest, experienceGift, owner); + return reservations.stream() + .map(reservationRepository::save) + .map(ReservationResponse::toDtoOwner) + .collect(Collectors.toList()); } + + public List findUserReservation(UserPrincipal userPrincipal) { return reservationRepository.findAllBySenderId(userPrincipal.getId()) - .stream().map(ReservationResponse::toDto).collect(Collectors.toList()); + .stream().map(ReservationResponse::toDtoUser).collect(Collectors.toList()); } public List getAllReservation() { - return reservationRepository.findAll().stream().map(ReservationResponse::toDto).collect(Collectors.toList()); + return reservationRepository.findAll().stream().map(ReservationResponse::toDtoUser).collect(Collectors.toList()); } //추가 public List getCurrentGiftReservation(Long giftId){ experienceGiftRepository.findById(giftId).orElseThrow(ExperienceGiftNotFoundException::new); - return reservationRepository.findByExperienceGift_Id(giftId).stream().map(ReservationResponse::toDto).collect(Collectors.toList()); + return reservationRepository.findByExperienceGift_Id(giftId).stream().map(ReservationResponse::toDtoUser).collect(Collectors.toList()); } @Transactional @@ -74,7 +74,7 @@ public ReservationResponse updateReservation(UpdateReservationReq updateReq, Use reservation -> {reservation.updateReservation(updateReq); return reservationRepository.save(reservation);} ).orElseThrow(InvalidReservationException::new);*/ - return ReservationResponse.toDto(updateReservation); + return ReservationResponse.toDtoUser(updateReservation); } @Transactional From a3024ad5181fd8ce4d01c0707458d4fe827534a4 Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Sat, 11 Nov 2023 23:18:42 +0900 Subject: [PATCH 3/9] =?UTF-8?q?feat:=20=EC=98=88=EC=95=BD=20dto=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Map 형식으로 값을 받아옵니다 --- .../reservation/dto/ReservationRequest.java | 102 +++++++++++----- .../reservation/dto/ReservationResponse.java | 113 ++++++++---------- 2 files changed, 118 insertions(+), 97 deletions(-) diff --git a/src/main/java/com/shallwe/domain/reservation/dto/ReservationRequest.java b/src/main/java/com/shallwe/domain/reservation/dto/ReservationRequest.java index 15aca0e5..9dbe6d50 100644 --- a/src/main/java/com/shallwe/domain/reservation/dto/ReservationRequest.java +++ b/src/main/java/com/shallwe/domain/reservation/dto/ReservationRequest.java @@ -3,47 +3,83 @@ import com.shallwe.domain.experiencegift.domain.ExperienceGift; import com.shallwe.domain.reservation.domain.Reservation; import com.shallwe.domain.reservation.domain.ReservationStatus; -import com.shallwe.domain.user.domain.User; +import com.shallwe.domain.shopowner.domain.ShopOwner; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; import lombok.*; -import java.time.LocalDateTime; - import static com.shallwe.domain.reservation.domain.ReservationStatus.BOOKED; - +import static com.shallwe.domain.reservation.domain.ReservationStatus.WAITING; @Data +@NoArgsConstructor public class ReservationRequest { - private Long experienceGiftId; - private Long persons; - private LocalDateTime date; - private String receiverName; - private String phoneNumber; - private String imageKey; - private String invitationComment; - private ReservationStatus reservationStatus; - - public static Reservation toEntity(final ReservationRequest reservationRequest, User sender, User receiver,ExperienceGift experienceGift) { - System.out.println("receiver = " + receiver); - try { - Reservation toEntity = Reservation.builder() - .experienceGift(experienceGift) - .sender(sender) - .persons(reservationRequest.getPersons()) - .date(reservationRequest.getDate()) - .receiver(receiver) - .phoneNumber(reservationRequest.getPhoneNumber()) - .invitationImg(reservationRequest.getImageKey()) - .invitationComment(reservationRequest.getInvitationComment()) - .reservationStatus(BOOKED) - .build(); - return toEntity; - } catch (Exception e) { - System.err.println("예외 발생: " + e.getMessage()); - e.printStackTrace(); - return null; - } + private Long experienceGiftId; + private Long persons; + private Long ownerId; + private Map> dateTimeMap; + private String phoneNumber; + private String imageKey; + private String invitationComment; + private ReservationStatus reservationStatus; + + public static List toEntityForUser(final ReservationRequest reservationRequest, + ExperienceGift experienceGift, ShopOwner owner) { + List reservations = new ArrayList<>(); + + for (Map.Entry> entry : reservationRequest.getDateTimeMap() + .entrySet()) { + LocalDate date = entry.getKey(); + List times = entry.getValue(); + + for (LocalTime time : times) { + Reservation toEntity = Reservation.builder() + .experienceGift(experienceGift) + .persons(reservationRequest.getPersons()) + .date(date) + .time(time) + .owner(owner) + .phoneNumber(reservationRequest.getPhoneNumber()) + .invitationImg(reservationRequest.getImageKey()) + .invitationComment(reservationRequest.getInvitationComment()) + .reservationStatus(BOOKED) + .build(); + + reservations.add(toEntity); + } } + return reservations; + } + + public static List toEntityForOwner(ReservationRequest reservationRequest, + ExperienceGift experienceGift,ShopOwner owner) { + List reservations = new ArrayList<>(); + + for (Map.Entry> entry : reservationRequest.getDateTimeMap() + .entrySet()) { + LocalDate date = entry.getKey(); + List times = entry.getValue(); + + for (LocalTime time : times) { + Reservation toEntity = Reservation.builder() + .experienceGift(experienceGift) + .date(date) + .time(time) + .owner(owner) + .reservationStatus(WAITING) + .build(); + + reservations.add(toEntity); + } + } + + return reservations; + } + } diff --git a/src/main/java/com/shallwe/domain/reservation/dto/ReservationResponse.java b/src/main/java/com/shallwe/domain/reservation/dto/ReservationResponse.java index b95ec267..1a2c26b2 100644 --- a/src/main/java/com/shallwe/domain/reservation/dto/ReservationResponse.java +++ b/src/main/java/com/shallwe/domain/reservation/dto/ReservationResponse.java @@ -3,74 +3,59 @@ import com.shallwe.domain.reservation.domain.Reservation; import com.shallwe.domain.reservation.domain.ReservationStatus; import com.shallwe.global.utils.AwsS3ImageUrlUtil; + +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; -import lombok.RequiredArgsConstructor; -import java.time.LocalDateTime; -@RequiredArgsConstructor + @Data +@AllArgsConstructor +@Builder public class ReservationResponse { - private Long id; - private Long senderId; - private String sender; - private Long persons; - private LocalDateTime date; - private Long experienceGiftId; - private String receiver; - private String phoneNumber; - private String invitationImageURL; - private String invitationComment; - private ReservationStatus reservationStatus; - - @Builder - public ReservationResponse(Long id, Long senderId, String sender, Long persons, LocalDateTime date, Long experienceGiftId, String receiver, String phoneNumber, String invitationImageURL, String invitationComment, ReservationStatus reservationStatus) { - this.id = id; - this.senderId = senderId; - this.sender = sender; - this.persons = persons; - this.date = date; - this.experienceGiftId = experienceGiftId; - this.receiver = receiver; - this.phoneNumber = phoneNumber; - this.invitationImageURL = invitationImageURL; - this.invitationComment = invitationComment; - this.reservationStatus = reservationStatus; - } - - public static ReservationResponse toDto(Reservation reservation) { - ReservationResponseBuilder builder = ReservationResponse.builder() - .id(reservation.getId()) - .experienceGiftId(reservation.getExperienceGift().getExperienceGiftId()) - .senderId(reservation.getSender().getId()) - .sender(reservation.getSender().getName()) - .persons(reservation.getPersons()) - .date(reservation.getDate()) - .phoneNumber(reservation.getPhoneNumber()) - .receiver(reservation.getReceiver().getName()) - .invitationImageURL(AwsS3ImageUrlUtil.toUrl(reservation.getInvitationImg())) - .invitationComment(reservation.getInvitationComment()) - .reservationStatus(reservation.getReservationStatus()); - - return builder.build(); - } - - public static ReservationResponse fromReservation(Reservation reservation) { - ReservationResponse reservationResponse = new ReservationResponse(); - reservationResponse.setId(reservation.getId()); - reservationResponse.setSenderId(reservation.getSender().getId()); - reservationResponse.setSender(reservation.getSender().getName()); - reservationResponse.setPersons(reservation.getPersons()); - reservationResponse.setDate(reservation.getDate()); - reservationResponse.setExperienceGiftId(reservation.getExperienceGift().getExperienceGiftId()); - reservationResponse.setReceiver(reservation.getReceiver().getName()); - reservationResponse.setPhoneNumber(reservation.getPhoneNumber()); - reservationResponse.setInvitationImageURL(AwsS3ImageUrlUtil.toUrl(reservation.getInvitationImg())); - reservationResponse.setInvitationComment(reservation.getInvitationComment()); - reservationResponse.setReservationStatus(reservation.getReservationStatus()); - - return reservationResponse; - } - + private Long id; + private Long senderId; + private Long ownerId; + private String sender; + private Long persons; + private String date; + private String time; + private Long experienceGiftId; + private String receiver; + private String phoneNumber; + private String invitationImageURL; + private String invitationComment; + private ReservationStatus reservationStatus; + + + public static ReservationResponse toDtoUser(Reservation reservation) { + ReservationResponseBuilder builder = ReservationResponse.builder() + .id(reservation.getId()) + .experienceGiftId(reservation.getExperienceGift().getExperienceGiftId()) + .senderId(reservation.getSender().getId()) + .ownerId(reservation.getOwner().getId()) + .sender(reservation.getSender().getName()) + .persons(reservation.getPersons()) + .date(reservation.getDate().toString()) + .time(reservation.getTime().toString()) + .phoneNumber(reservation.getPhoneNumber()) + .receiver(reservation.getReceiver().getName()) + .invitationImageURL(AwsS3ImageUrlUtil.toUrl(reservation.getInvitationImg())) + .invitationComment(reservation.getInvitationComment()) + .reservationStatus(reservation.getReservationStatus()); + + return builder.build(); + } + + public static ReservationResponse toDtoOwner(Reservation reservation) { + ReservationResponseBuilder builder = ReservationResponse.builder() + .id(reservation.getId()) + .experienceGiftId(reservation.getExperienceGift().getExperienceGiftId()) + .date(reservation.getDate().toString()) + .time(reservation.getTime().toString()) + .reservationStatus(reservation.getReservationStatus()); + + return builder.build(); + } } From b9d94cf8303d2d89aeba678f17768b47826ca2a4 Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Sat, 11 Nov 2023 23:23:57 +0900 Subject: [PATCH 4/9] =?UTF-8?q?chore:=20dto=20=EB=B0=98=ED=99=98=EA=B0=92?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shallwe/domain/reservation/domain/Reservation.java | 2 +- .../domain/reservation/dto/UpdateReservationReq.java | 10 ++++------ .../presentation/ReservationController.java | 5 ++--- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java b/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java index a7a42fed..4a69723b 100644 --- a/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java +++ b/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java @@ -67,7 +67,7 @@ public class Reservation extends BaseEntity { public void updateReservation(UpdateReservationReq updateReq) { this.persons = Optional.ofNullable(updateReq.getPersons()).orElse(this.persons); this.date = Optional.ofNullable(updateReq.getDate()).orElse(this.date); - this.time = Optional.ofNullable(LocalTime.of(updateReq.getTime(),0)).orElse(this.time); + this.time = Optional.ofNullable(updateReq.getTime()).orElse(this.time); this.receiver = Optional.ofNullable(updateReq.getReceiver()).orElse(this.getReceiver()); this.phoneNumber = Optional.ofNullable(updateReq.getPhone_number()).orElse(this.phoneNumber); this.invitationImg = Optional.ofNullable(updateReq.getInvitation_img()).orElse(this.invitationImg); diff --git a/src/main/java/com/shallwe/domain/reservation/dto/UpdateReservationReq.java b/src/main/java/com/shallwe/domain/reservation/dto/UpdateReservationReq.java index e152d177..8a45e4f1 100644 --- a/src/main/java/com/shallwe/domain/reservation/dto/UpdateReservationReq.java +++ b/src/main/java/com/shallwe/domain/reservation/dto/UpdateReservationReq.java @@ -2,11 +2,9 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.shallwe.domain.user.domain.User; -import jakarta.validation.constraints.FutureOrPresent; +import java.time.LocalDate; +import java.time.LocalTime; import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; @Data @@ -14,8 +12,8 @@ public class UpdateReservationReq { private Long id; private Long persons; - @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", shape = JsonFormat.Shape.STRING) - private LocalDateTime date; + private LocalDate date; + private LocalTime time; private User sender; private User receiver; private String phone_number; diff --git a/src/main/java/com/shallwe/domain/reservation/presentation/ReservationController.java b/src/main/java/com/shallwe/domain/reservation/presentation/ReservationController.java index c9499c39..a4055d5e 100644 --- a/src/main/java/com/shallwe/domain/reservation/presentation/ReservationController.java +++ b/src/main/java/com/shallwe/domain/reservation/presentation/ReservationController.java @@ -1,7 +1,6 @@ package com.shallwe.domain.reservation.presentation; import com.shallwe.domain.reservation.application.ReservationServiceImpl; -import com.shallwe.domain.reservation.domain.Reservation; import com.shallwe.domain.reservation.dto.DeleteReservationRes; import com.shallwe.domain.reservation.dto.ReservationRequest; import com.shallwe.domain.reservation.dto.ReservationResponse; @@ -74,11 +73,11 @@ public ResponseCustom> getCurrentGiftReservation( @ApiResponse(responseCode = "400", description = "예약 생성 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))} ) }) @PostMapping - public ResponseCustom createReservation( + public ResponseCustom> createReservation( @Parameter(description = "예약 요청을 확인해주세요.", required = true) @RequestBody ReservationRequest reservationRequest, @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal ){ - return ResponseCustom.CREATED(reservationServiceimpl.addReservation(reservationRequest,userPrincipal)); + return ResponseCustom.CREATED(reservationServiceimpl.addOwnerReservation(reservationRequest,userPrincipal)); } @Operation(summary ="예약 수정하기", description = "예약을 수정합니다") From 7a770770abdc00818c72fd54eb8008620942588f Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Sat, 11 Nov 2023 23:24:12 +0900 Subject: [PATCH 5/9] =?UTF-8?q?feat:=20=EC=82=AC=EC=9E=A5=EB=8B=98=20?= =?UTF-8?q?=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=BB=AC=EB=9F=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/shallwe/domain/shopowner/domain/ShopOwner.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/shallwe/domain/shopowner/domain/ShopOwner.java b/src/main/java/com/shallwe/domain/shopowner/domain/ShopOwner.java index 8ad10e5b..32bf4a84 100644 --- a/src/main/java/com/shallwe/domain/shopowner/domain/ShopOwner.java +++ b/src/main/java/com/shallwe/domain/shopowner/domain/ShopOwner.java @@ -1,10 +1,13 @@ package com.shallwe.domain.shopowner.domain; import com.shallwe.domain.common.BaseEntity; +import com.shallwe.domain.reservation.domain.Reservation; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.OneToMany; +import java.util.List; import lombok.*; import org.hibernate.annotations.Where; @@ -27,6 +30,9 @@ public class ShopOwner extends BaseEntity { private Boolean marketingConsent; + @OneToMany + private List reservationList; + public void changePassword(String password) { this.password = password; } From 10b864a161f73b369fe2ba56b1fd3596a82eea93 Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Sat, 11 Nov 2023 23:24:42 +0900 Subject: [PATCH 6/9] =?UTF-8?q?chore:=20=EB=8B=A4=EB=A5=B8=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20dto=20=EB=B0=98=ED=99=98=EA=B0=92=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memoryphoto/dto/MemoryPhotoDetailRes.java | 7 +++- .../domain/user/dto/ReceiveGiftDetailRes.java | 8 +++- .../domain/user/dto/SendGiftDetailRes.java | 40 ++++++++++--------- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/shallwe/domain/memoryphoto/dto/MemoryPhotoDetailRes.java b/src/main/java/com/shallwe/domain/memoryphoto/dto/MemoryPhotoDetailRes.java index 5c3b437f..db0e080b 100644 --- a/src/main/java/com/shallwe/domain/memoryphoto/dto/MemoryPhotoDetailRes.java +++ b/src/main/java/com/shallwe/domain/memoryphoto/dto/MemoryPhotoDetailRes.java @@ -15,7 +15,9 @@ @Builder public class MemoryPhotoDetailRes { - private LocalDateTime date; + private String date; + + private String time; private String experienceGiftTitle; @@ -25,7 +27,8 @@ public class MemoryPhotoDetailRes { public static MemoryPhotoDetailRes toDto(Reservation reservation) { return MemoryPhotoDetailRes.builder() - .date(reservation.getDate()) + .date(reservation.getDate().toString()) + .time(reservation.getTime().toString()) .experienceGiftTitle(reservation.getExperienceGift().getTitle()) .experienceGiftSubTitle(reservation.getExperienceGift().getSubtitle().getTitle()) .memoryPhotoImages(reservation.getMemoryPhotos().stream() diff --git a/src/main/java/com/shallwe/domain/user/dto/ReceiveGiftDetailRes.java b/src/main/java/com/shallwe/domain/user/dto/ReceiveGiftDetailRes.java index 39631a45..61d18633 100644 --- a/src/main/java/com/shallwe/domain/user/dto/ReceiveGiftDetailRes.java +++ b/src/main/java/com/shallwe/domain/user/dto/ReceiveGiftDetailRes.java @@ -1,6 +1,8 @@ package com.shallwe.domain.user.dto; import com.shallwe.domain.reservation.domain.Reservation; +import java.time.LocalDate; +import java.time.LocalTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -15,7 +17,8 @@ public class ReceiveGiftDetailRes { private Long reservationId; private String experienceTitle; private String experienceSubTitle; - private LocalDateTime dateTime; + private LocalDate date; + private LocalTime time; private UserDetailRes sender; private String invitationImg; private String invitationComment; @@ -25,7 +28,8 @@ public static ReceiveGiftDetailRes toDto(Reservation reservation) { .reservationId(reservation.getId()) .experienceTitle(reservation.getExperienceGift().getTitle()) .experienceSubTitle(reservation.getExperienceGift().getSubtitle().getTitle()) - .dateTime(reservation.getDate()) + .date(reservation.getDate()) + .time(reservation.getTime()) .sender(UserDetailRes.toDto(reservation.getSender())) .invitationImg(reservation.getInvitationImg()) .invitationComment(reservation.getInvitationComment()) diff --git a/src/main/java/com/shallwe/domain/user/dto/SendGiftDetailRes.java b/src/main/java/com/shallwe/domain/user/dto/SendGiftDetailRes.java index ea394ba2..63d718f2 100644 --- a/src/main/java/com/shallwe/domain/user/dto/SendGiftDetailRes.java +++ b/src/main/java/com/shallwe/domain/user/dto/SendGiftDetailRes.java @@ -1,6 +1,8 @@ package com.shallwe.domain.user.dto; import com.shallwe.domain.reservation.domain.Reservation; +import java.time.LocalDate; +import java.time.LocalTime; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -12,24 +14,26 @@ @Builder public class SendGiftDetailRes { - private Long reservationId; - private String experienceTitle; - private String experienceSubTitle; - private LocalDateTime dateTime; - private UserDetailRes receiver; - private String invitationImg; - private String invitationComment; + private Long reservationId; + private String experienceTitle; + private String experienceSubTitle; + private LocalDate date; + private LocalTime time; + private UserDetailRes receiver; + private String invitationImg; + private String invitationComment; - public static SendGiftDetailRes toDto(Reservation reservation) { - return SendGiftDetailRes.builder() - .reservationId(reservation.getId()) - .experienceTitle(reservation.getExperienceGift().getTitle()) - .experienceSubTitle(reservation.getExperienceGift().getSubtitle().getTitle()) - .dateTime(reservation.getDate()) - .receiver(UserDetailRes.toDto(reservation.getReceiver())) - .invitationImg(reservation.getInvitationImg()) - .invitationComment(reservation.getInvitationComment()) - .build(); - } + public static SendGiftDetailRes toDto(Reservation reservation) { + return SendGiftDetailRes.builder() + .reservationId(reservation.getId()) + .experienceTitle(reservation.getExperienceGift().getTitle()) + .experienceSubTitle(reservation.getExperienceGift().getSubtitle().getTitle()) + .date(reservation.getDate()) + .time(reservation.getTime()) + .receiver(UserDetailRes.toDto(reservation.getReceiver())) + .invitationImg(reservation.getInvitationImg()) + .invitationComment(reservation.getInvitationComment()) + .build(); + } } From f775472de4f829a59002426c3fb681c8ec8a16c7 Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Mon, 13 Nov 2023 02:10:03 +0900 Subject: [PATCH 7/9] =?UTF-8?q?feat:=20=EC=82=AC=EC=9E=A5=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=98=88=EC=95=BD=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 상태가 예약중인 예약만 불러옵니다 --- .../repository/ReservationRepository.java | 3 + .../application/ShopOwnerServiceImpl.java | 88 ++++++++++++------- .../shopowner/dto/ShopOwnerGiftManageRes.java | 21 +++++ .../dto/ShopOwnerReservationRes.java | 40 +++++++++ .../presentation/ShopOwnerController.java | 13 +++ 5 files changed, 133 insertions(+), 32 deletions(-) create mode 100644 src/main/java/com/shallwe/domain/shopowner/dto/ShopOwnerGiftManageRes.java create mode 100644 src/main/java/com/shallwe/domain/shopowner/dto/ShopOwnerReservationRes.java diff --git a/src/main/java/com/shallwe/domain/reservation/domain/repository/ReservationRepository.java b/src/main/java/com/shallwe/domain/reservation/domain/repository/ReservationRepository.java index 64fcdef5..35ae9f28 100644 --- a/src/main/java/com/shallwe/domain/reservation/domain/repository/ReservationRepository.java +++ b/src/main/java/com/shallwe/domain/reservation/domain/repository/ReservationRepository.java @@ -28,6 +28,9 @@ public interface ReservationRepository extends JpaRepository @Query("SELECT r FROM Reservation r WHERE r.experienceGift.experienceGiftId = :giftId") List findByExperienceGift_Id(@Param("giftId")Long giftId); + @Query("SELECT r FROM Reservation r WHERE r.experienceGift.experienceGiftId = :giftId and r.status = :BOOKED") + List findAllByExperienceGift_IdAndStatus(@Param("giftId")Long giftID); + @EntityGraph(attributePaths = {"memoryPhotos"}) List findAllByDateAndPhoneNumber(LocalDateTime date, String phoneNumber); diff --git a/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerServiceImpl.java b/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerServiceImpl.java index b09821e3..32c5d4c4 100644 --- a/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerServiceImpl.java +++ b/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerServiceImpl.java @@ -4,14 +4,22 @@ import com.shallwe.domain.auth.domain.Token; import com.shallwe.domain.auth.domain.repository.TokenRepository; import com.shallwe.domain.common.Status; +import com.shallwe.domain.experiencegift.domain.ExperienceGift; +import com.shallwe.domain.experiencegift.domain.repository.ExperienceGiftRepository; +import com.shallwe.domain.experiencegift.exception.ExperienceGiftNotFoundException; +import com.shallwe.domain.reservation.domain.Reservation; +import com.shallwe.domain.reservation.domain.repository.ReservationRepository; import com.shallwe.domain.shopowner.domain.ShopOwner; import com.shallwe.domain.shopowner.domain.repository.ShopOwnerRepository; +import com.shallwe.domain.shopowner.dto.ShopOwnerReservationRes; import com.shallwe.domain.shopowner.dto.ShopOwnerChangePasswordReq; +import com.shallwe.domain.shopowner.dto.ShopOwnerGiftManageRes; import com.shallwe.domain.shopowner.exception.InvalidShopOwnerException; -import com.shallwe.domain.user.domain.User; import com.shallwe.domain.user.exception.InvalidTokenException; import com.shallwe.global.config.security.token.UserPrincipal; import com.shallwe.global.payload.Message; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -22,36 +30,52 @@ @Transactional(readOnly = true) public class ShopOwnerServiceImpl implements ShopOwnerService { - private final PasswordEncoder passwordEncoder; - private final ShopOwnerRepository shopOwnerRepository; - private final TokenRepository tokenRepository; - - @Override - @Transactional - public Message shopOwnerChangePassword(final UserPrincipal userPrincipal, final ShopOwnerChangePasswordReq shopOwnerChangePasswordReq) { - ShopOwner shopOwner = shopOwnerRepository.findById(userPrincipal.getId()) - .orElseThrow(InvalidShopOwnerException::new); - - shopOwner.changePassword(passwordEncoder.encode(shopOwnerChangePasswordReq.getChangePassword())); - - return Message.builder() - .message("비밀번호가 변경되었습니다.").build(); - } - - @Override - @Transactional - public Message deleteCurrentShopOwner(UserPrincipal userPrincipal) { - ShopOwner shopOwner = shopOwnerRepository.findById(userPrincipal.getId()) - .orElseThrow(InvalidShopOwnerException::new); - Token token = tokenRepository.findByUserEmail(userPrincipal.getEmail()) - .orElseThrow(InvalidTokenException::new); - - shopOwner.updateStatus(Status.DELETE); - tokenRepository.delete(token); - - return Message.builder() - .message("사장 탈퇴가 완료되었습니다.") - .build(); - } + private final PasswordEncoder passwordEncoder; + private final ShopOwnerRepository shopOwnerRepository; + private final TokenRepository tokenRepository; + private final ReservationRepository reservationRepository; + private final ExperienceGiftRepository experienceGiftRepository; + + @Override + @Transactional + public Message shopOwnerChangePassword(final UserPrincipal userPrincipal, + final ShopOwnerChangePasswordReq shopOwnerChangePasswordReq) { + ShopOwner shopOwner = shopOwnerRepository.findById(userPrincipal.getId()) + .orElseThrow(InvalidShopOwnerException::new); + + shopOwner.changePassword( + passwordEncoder.encode(shopOwnerChangePasswordReq.getChangePassword())); + + return Message.builder() + .message("비밀번호가 변경되었습니다.").build(); + } + + @Override + @Transactional + public Message deleteCurrentShopOwner(UserPrincipal userPrincipal) { + ShopOwner shopOwner = shopOwnerRepository.findById(userPrincipal.getId()) + .orElseThrow(InvalidShopOwnerException::new); + Token token = tokenRepository.findByUserEmail(userPrincipal.getEmail()) + .orElseThrow(InvalidTokenException::new); + + shopOwner.updateStatus(Status.DELETE); + tokenRepository.delete(token); + + return Message.builder() + .message("사장 탈퇴가 완료되었습니다.") + .build(); + } + + public ShopOwnerGiftManageRes getShopOwnerReservation(UserPrincipal userPrincipal, Long giftId) { + List reservationList = reservationRepository.findAllByExperienceGift_IdAndStatus(giftId); + ExperienceGift experienceGift = experienceGiftRepository.findByExperienceGiftId(giftId) + .orElseThrow( + ExperienceGiftNotFoundException::new); + return ShopOwnerGiftManageRes.builder() + .reservationList(ShopOwnerReservationRes.from(reservationList)) + .subTitle(experienceGift.getSubtitle().getTitle()) + .title(experienceGift.getTitle()) + .build(); + } } diff --git a/src/main/java/com/shallwe/domain/shopowner/dto/ShopOwnerGiftManageRes.java b/src/main/java/com/shallwe/domain/shopowner/dto/ShopOwnerGiftManageRes.java new file mode 100644 index 00000000..4a98ba33 --- /dev/null +++ b/src/main/java/com/shallwe/domain/shopowner/dto/ShopOwnerGiftManageRes.java @@ -0,0 +1,21 @@ +package com.shallwe.domain.shopowner.dto; + +import java.util.List; +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class ShopOwnerGiftManageRes { + + private String title; + private String subTitle; + private List reservationList; + + public ShopOwnerGiftManageRes(String title, String subTitle, + List reservationList) { + this.title = title; + this.subTitle = subTitle; + this.reservationList = reservationList; + } +} diff --git a/src/main/java/com/shallwe/domain/shopowner/dto/ShopOwnerReservationRes.java b/src/main/java/com/shallwe/domain/shopowner/dto/ShopOwnerReservationRes.java new file mode 100644 index 00000000..38660b5f --- /dev/null +++ b/src/main/java/com/shallwe/domain/shopowner/dto/ShopOwnerReservationRes.java @@ -0,0 +1,40 @@ +package com.shallwe.domain.shopowner.dto; + +import com.shallwe.domain.reservation.domain.Reservation; +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import lombok.Builder; +import lombok.Data; + + +@Data +public class ShopOwnerReservationRes { + + private String sender; + private LocalDate date; + private LocalTime time; + private String phoneNum; + private Long person; + + @Builder + public ShopOwnerReservationRes(String sender, LocalDate date, LocalTime time, String phoneNum, + Long person) { + this.sender = sender; + this.date = date; + this.time = time; + this.phoneNum = phoneNum; + this.person = person; + } + + public static List from(List reservationList) { + return reservationList.stream() + .map(reservation -> ShopOwnerReservationRes.builder() + .date(reservation.getDate()) + .person(reservation.getPersons()) + .phoneNum(reservation.getPhoneNumber()) + .sender(reservation.getSender().getName()) + .time(reservation.getTime()) + .build()).toList(); + } +} diff --git a/src/main/java/com/shallwe/domain/shopowner/presentation/ShopOwnerController.java b/src/main/java/com/shallwe/domain/shopowner/presentation/ShopOwnerController.java index f60d0b31..a0a20f1c 100644 --- a/src/main/java/com/shallwe/domain/shopowner/presentation/ShopOwnerController.java +++ b/src/main/java/com/shallwe/domain/shopowner/presentation/ShopOwnerController.java @@ -3,6 +3,7 @@ import com.shallwe.domain.shopowner.application.ShopOwnerServiceImpl; import com.shallwe.domain.shopowner.dto.ShopOwnerChangePasswordReq; +import com.shallwe.domain.shopowner.dto.ShopOwnerGiftManageRes; import com.shallwe.domain.user.dto.DeleteUserRes; import com.shallwe.global.config.security.token.CurrentUser; import com.shallwe.global.config.security.token.UserPrincipal; @@ -52,4 +53,16 @@ public ResponseCustom deleteCurrentShopOwner( return ResponseCustom.OK(shopOwnerService.deleteCurrentShopOwner(userPrincipal)); } + @Operation(summary = "사장 예약 조회", description = "사장이 등록한 상품의 예약을 조회 합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "상품 예약 조회 성공", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = Message.class))}), + @ApiResponse(responseCode = "400", description = "상품 예약 조회 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))}), + }) + @GetMapping + public ResponseCustom getCurrentGiftReservation( + @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal, + @Parameter(description = "상품 ID를 입력해주세요", required = true) @RequestHeader Long giftId + ) { + return ResponseCustom.OK(shopOwnerService.getShopOwnerReservation(userPrincipal,giftId)); + } } From 50186295267d7dfef857db4f1fdd17f9a865c4f4 Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Wed, 15 Nov 2023 12:19:30 +0900 Subject: [PATCH 8/9] =?UTF-8?q?docs:=20=EC=97=94=ED=8B=B0=ED=8B=B0=20schem?= =?UTF-8?q?a=20=EC=84=A4=EB=AA=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/reservation/domain/Reservation.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java b/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java index 4a69723b..da29b6e8 100644 --- a/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java +++ b/src/main/java/com/shallwe/domain/reservation/domain/Reservation.java @@ -7,7 +7,9 @@ import com.shallwe.domain.reservation.dto.UpdateReservationReq; import com.shallwe.domain.shopowner.domain.ShopOwner; import com.shallwe.domain.user.domain.User; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; import java.time.LocalDate; import java.time.LocalTime; import lombok.*; @@ -31,21 +33,28 @@ public class Reservation extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "experience_gift_id") + @Schema(description = "선물 ID") + @NotBlank private ExperienceGift experienceGift; @ManyToOne @JoinColumn(name = "owner_id") + @Schema(description = "사장ID") + @NotBlank private ShopOwner owner; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "sender_id") + @Schema(description = "보내는이 ID") private User sender; private Long persons; + @Schema(description = "예약 날짜, YYYY-DD-MM ") private LocalDate date; + @Schema(description = "예약 시간, HH:MM") private LocalTime time; @ManyToOne(fetch = FetchType.LAZY) @@ -59,6 +68,7 @@ public class Reservation extends BaseEntity { private String invitationComment; @Enumerated(EnumType.STRING) + @Schema(description = "예약 상태", allowableValues = {"CANCLED","BOOKED","COMPLETED","WAITING","USING"}) private ReservationStatus reservationStatus; @OneToMany(mappedBy = "reservation") @@ -74,6 +84,10 @@ public void updateReservation(UpdateReservationReq updateReq) { this.invitationComment = Optional.ofNullable(updateReq.getInvitation_comment()).orElse(this.invitationComment); } + public void updateStatus(ReservationStatus status){ + this.reservationStatus = status; + } + public int getHour(){ return time.getHour(); } From 748846f2ef425ff2f3f96b5b71e0d8a0c5c60ec7 Mon Sep 17 00:00:00 2001 From: hyunw9 Date: Wed, 15 Nov 2023 12:26:12 +0900 Subject: [PATCH 9/9] =?UTF-8?q?feat:=20=EC=82=AC=EC=9E=A5=20=EC=98=88?= =?UTF-8?q?=EC=95=BD=20=ED=99=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reservation/dto/ReservationResponse.java | 1 + .../application/ShopOwnerService.java | 4 +- .../application/ShopOwnerServiceImpl.java | 24 ++++- .../presentation/ShopOwnerController.java | 95 +++++++++++-------- 4 files changed, 84 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/shallwe/domain/reservation/dto/ReservationResponse.java b/src/main/java/com/shallwe/domain/reservation/dto/ReservationResponse.java index 1a2c26b2..e7db9808 100644 --- a/src/main/java/com/shallwe/domain/reservation/dto/ReservationResponse.java +++ b/src/main/java/com/shallwe/domain/reservation/dto/ReservationResponse.java @@ -52,6 +52,7 @@ public static ReservationResponse toDtoOwner(Reservation reservation) { ReservationResponseBuilder builder = ReservationResponse.builder() .id(reservation.getId()) .experienceGiftId(reservation.getExperienceGift().getExperienceGiftId()) + .ownerId(reservation.getOwner().getId()) .date(reservation.getDate().toString()) .time(reservation.getTime().toString()) .reservationStatus(reservation.getReservationStatus()); diff --git a/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerService.java b/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerService.java index f8316ac0..59c36055 100644 --- a/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerService.java +++ b/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerService.java @@ -1,6 +1,7 @@ package com.shallwe.domain.shopowner.application; import com.shallwe.domain.shopowner.dto.ShopOwnerChangePasswordReq; +import com.shallwe.domain.shopowner.dto.ShopOwnerGiftManageRes; import com.shallwe.domain.user.dto.DeleteUserRes; import com.shallwe.global.config.security.token.UserPrincipal; import com.shallwe.global.payload.Message; @@ -9,6 +10,7 @@ public interface ShopOwnerService { Message shopOwnerChangePassword(UserPrincipal userPrincipal, ShopOwnerChangePasswordReq shopOwnerChangePasswordReq); Message deleteCurrentShopOwner(UserPrincipal userPrincipal); - + ShopOwnerGiftManageRes getShopOwnerReservation(UserPrincipal userPrincipal, Long giftId); + Message confirmPayment(UserPrincipal userPrincipal, Long reservationId); } diff --git a/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerServiceImpl.java b/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerServiceImpl.java index 32c5d4c4..ac362e84 100644 --- a/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerServiceImpl.java +++ b/src/main/java/com/shallwe/domain/shopowner/application/ShopOwnerServiceImpl.java @@ -1,6 +1,9 @@ package com.shallwe.domain.shopowner.application; +import static com.shallwe.domain.reservation.domain.ReservationStatus.BOOKED; +import static com.shallwe.domain.reservation.domain.ReservationStatus.WAITING; + import com.shallwe.domain.auth.domain.Token; import com.shallwe.domain.auth.domain.repository.TokenRepository; import com.shallwe.domain.common.Status; @@ -9,6 +12,7 @@ import com.shallwe.domain.experiencegift.exception.ExperienceGiftNotFoundException; import com.shallwe.domain.reservation.domain.Reservation; import com.shallwe.domain.reservation.domain.repository.ReservationRepository; +import com.shallwe.domain.reservation.exception.InvalidReservationException; import com.shallwe.domain.shopowner.domain.ShopOwner; import com.shallwe.domain.shopowner.domain.repository.ShopOwnerRepository; import com.shallwe.domain.shopowner.dto.ShopOwnerReservationRes; @@ -19,7 +23,6 @@ import com.shallwe.global.config.security.token.UserPrincipal; import com.shallwe.global.payload.Message; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -66,8 +69,10 @@ public Message deleteCurrentShopOwner(UserPrincipal userPrincipal) { .build(); } + @Override public ShopOwnerGiftManageRes getShopOwnerReservation(UserPrincipal userPrincipal, Long giftId) { - List reservationList = reservationRepository.findAllByExperienceGift_IdAndStatus(giftId); + List reservationList = reservationRepository.findAllByExperienceGift_IdAndStatus( + giftId); ExperienceGift experienceGift = experienceGiftRepository.findByExperienceGiftId(giftId) .orElseThrow( ExperienceGiftNotFoundException::new); @@ -78,4 +83,19 @@ public ShopOwnerGiftManageRes getShopOwnerReservation(UserPrincipal userPrincipa .build(); } + public Message confirmPayment(UserPrincipal userPrincipal, Long reservationId) { + Reservation reservation = reservationRepository.findById(reservationId).orElseThrow( + InvalidReservationException::new); + if(!reservation.getReservationStatus().equals(WAITING)){ + return Message.builder() + .message("이미 확정된 예약입니다.") + .build(); + }else{ + reservation.updateStatus(BOOKED); + return Message.builder() + .message("예약이 확정되었습니다.") + .build(); + } + } + } diff --git a/src/main/java/com/shallwe/domain/shopowner/presentation/ShopOwnerController.java b/src/main/java/com/shallwe/domain/shopowner/presentation/ShopOwnerController.java index a0a20f1c..6145773c 100644 --- a/src/main/java/com/shallwe/domain/shopowner/presentation/ShopOwnerController.java +++ b/src/main/java/com/shallwe/domain/shopowner/presentation/ShopOwnerController.java @@ -4,7 +4,6 @@ import com.shallwe.domain.shopowner.application.ShopOwnerServiceImpl; import com.shallwe.domain.shopowner.dto.ShopOwnerChangePasswordReq; import com.shallwe.domain.shopowner.dto.ShopOwnerGiftManageRes; -import com.shallwe.domain.user.dto.DeleteUserRes; import com.shallwe.global.config.security.token.CurrentUser; import com.shallwe.global.config.security.token.UserPrincipal; import com.shallwe.global.payload.ErrorResponse; @@ -26,43 +25,65 @@ @RequestMapping("/api/v1/shop-owners") public class ShopOwnerController { - private final ShopOwnerServiceImpl shopOwnerService; + private final ShopOwnerServiceImpl shopOwnerService; - @Operation(summary = "사장 비밀번호 변경(토큰 필요)", description = "사장 비밀번호 변경을 수행합니다.") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "사장 비밀번호 변경 성공", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = Message.class) ) } ), - @ApiResponse(responseCode = "400", description = "사장 비밀번호 변경 실패", content = { @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class) ) } ), - }) - @PatchMapping(value="/change-password") - public ResponseCustom shopOwnerChangePassword( - @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal, - @Parameter(description = "ShopOwnerChangePasswordReq Schema를 확인해주세요.", required = true) @RequestBody ShopOwnerChangePasswordReq shopOwnerChangePasswordReq - ) { - return ResponseCustom.OK(shopOwnerService.shopOwnerChangePassword(userPrincipal, shopOwnerChangePasswordReq)); - } + @Operation(summary = "사장 비밀번호 변경(토큰 필요)", description = "사장 비밀번호 변경을 수행합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "사장 비밀번호 변경 성공", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Message.class))}), + @ApiResponse(responseCode = "400", description = "사장 비밀번호 변경 실패", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))}), + }) + @PatchMapping(value = "/change-password") + public ResponseCustom shopOwnerChangePassword( + @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal, + @Parameter(description = "ShopOwnerChangePasswordReq Schema를 확인해주세요.", required = true) @RequestBody ShopOwnerChangePasswordReq shopOwnerChangePasswordReq + ) { + return ResponseCustom.OK( + shopOwnerService.shopOwnerChangePassword(userPrincipal, shopOwnerChangePasswordReq)); + } - @Operation(summary = "사장 탈퇴", description = "사장 탈퇴를 수행합니다.") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "사장 탈퇴 성공", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = Message.class))}), - @ApiResponse(responseCode = "400", description = "사장 탈퇴 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))}), - }) - @PatchMapping - public ResponseCustom deleteCurrentShopOwner( - @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal - ) { - return ResponseCustom.OK(shopOwnerService.deleteCurrentShopOwner(userPrincipal)); - } + @Operation(summary = "사장 탈퇴", description = "사장 탈퇴를 수행합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "사장 탈퇴 성공", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Message.class))}), + @ApiResponse(responseCode = "400", description = "사장 탈퇴 실패", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))}), + }) + @PatchMapping + public ResponseCustom deleteCurrentShopOwner( + @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal + ) { + return ResponseCustom.OK(shopOwnerService.deleteCurrentShopOwner(userPrincipal)); + } - @Operation(summary = "사장 예약 조회", description = "사장이 등록한 상품의 예약을 조회 합니다.") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "상품 예약 조회 성공", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = Message.class))}), - @ApiResponse(responseCode = "400", description = "상품 예약 조회 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))}), - }) - @GetMapping - public ResponseCustom getCurrentGiftReservation( - @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal, - @Parameter(description = "상품 ID를 입력해주세요", required = true) @RequestHeader Long giftId - ) { - return ResponseCustom.OK(shopOwnerService.getShopOwnerReservation(userPrincipal,giftId)); - } + @Operation(summary = "사장 예약 조회", description = "사장이 등록한 상품의 예약을 조회 합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "상품 예약 조회 성공", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Message.class))}), + @ApiResponse(responseCode = "400", description = "상품 예약 조회 실패", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))}), + }) + @GetMapping + public ResponseCustom getCurrentGiftReservation( + @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal, + @Parameter(description = "상품 ID를 입력해주세요", required = true) @RequestHeader Long giftId + ) { + return ResponseCustom.OK(shopOwnerService.getShopOwnerReservation(userPrincipal, giftId)); + } + + @Operation(summary = "예약 확정", description = "유저 결제 확인 후 예약을 확정상태로 변경합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "예약 확정 성공", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Message.class))}), + @ApiResponse(responseCode = "400", description = "예약 확정 실패", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))}), + }) + @GetMapping + public ResponseCustom confirmReservationPayment( + @Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal, + @Parameter(description = "예약 ID를 입력해주세요", required = true) @RequestHeader Long reservationId + ) { + return ResponseCustom.OK(shopOwnerService.confirmPayment(userPrincipal, reservationId)); + } }