Skip to content

Commit

Permalink
Merge pull request #155 from ShallWeProject/feat/154-userReservationPost
Browse files Browse the repository at this point in the history
사용자 예약 추가 로직을 개발한다.
  • Loading branch information
leeseunghakhello authored Nov 21, 2023
2 parents 4a3dd9a + e15bfa3 commit 7fa6080
Show file tree
Hide file tree
Showing 6 changed files with 160 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,20 @@
import com.shallwe.domain.experiencegift.exception.ExperienceGiftNotFoundException;
import com.shallwe.domain.experiencegift.domain.repository.ExperienceGiftRepository;
import com.shallwe.domain.reservation.domain.Reservation;
import com.shallwe.domain.reservation.domain.ReservationStatus;
import com.shallwe.domain.reservation.domain.repository.ReservationRepository;
import com.shallwe.domain.reservation.dto.DeleteReservationRes;
import com.shallwe.domain.reservation.dto.ReservationRequest;
import com.shallwe.domain.reservation.dto.ReservationResponse;
import com.shallwe.domain.reservation.dto.ReservationUserReq;
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.shopowner.domain.ShopOwner;
import com.shallwe.domain.shopowner.domain.repository.ShopOwnerRepository;
import com.shallwe.domain.shopowner.exception.InvalidShopOwnerException;
import com.shallwe.domain.user.domain.User;
import com.shallwe.domain.user.domain.repository.UserRepository;
import com.shallwe.global.config.security.token.UserPrincipal;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand All @@ -27,64 +32,87 @@
@Transactional(readOnly = true)
public class ReservationServiceImpl {

private final ReservationRepository reservationRepository;
private final ExperienceGiftRepository experienceGiftRepository;
private final ShopOwnerRepository shopOwnerRepository;


@Transactional
public List<ReservationResponse> addOwnerReservation(ReservationRequest reservationRequest,UserPrincipal userPrincipal) {
ExperienceGift experienceGift = experienceGiftRepository.findByExperienceGiftId(reservationRequest.getExperienceGiftId())
.orElseThrow(ExperienceGiftNotFoundException::new);

ShopOwner owner = shopOwnerRepository.findById(reservationRequest.getOwnerId())
.orElseThrow(InvalidShopOwnerException::new);

List<Reservation> reservations = ReservationRequest.toEntityForOwner(reservationRequest, experienceGift, owner);
return reservations.stream()
.map(reservationRepository::save)
.map(ReservationResponse::toDtoOwner)
.collect(Collectors.toList());
}



public List<ReservationResponse> findUserReservation(UserPrincipal userPrincipal) {
return reservationRepository.findAllBySenderId(userPrincipal.getId())
.stream().map(ReservationResponse::toDtoUser).collect(Collectors.toList());
}

public List<ReservationResponse> getAllReservation() {
return reservationRepository.findAll().stream().map(ReservationResponse::toDtoUser).collect(Collectors.toList());
}
//추가
public List<ReservationResponse> getCurrentGiftReservation(Long giftId){
experienceGiftRepository.findById(giftId).orElseThrow(ExperienceGiftNotFoundException::new);
return reservationRepository.findByExperienceGift_Id(giftId).stream().map(ReservationResponse::toDtoUser).collect(Collectors.toList());
private final ReservationRepository reservationRepository;
private final ExperienceGiftRepository experienceGiftRepository;
private final ShopOwnerRepository shopOwnerRepository;
private final UserRepository userRepository;


@Transactional
public List<ReservationResponse> addOwnerReservation(ReservationRequest reservationRequest,
UserPrincipal userPrincipal) {
ExperienceGift experienceGift = experienceGiftRepository.findByExperienceGiftId(
reservationRequest.getExperienceGiftId())
.orElseThrow(ExperienceGiftNotFoundException::new);

ShopOwner owner = shopOwnerRepository.findById(reservationRequest.getOwnerId())
.orElseThrow(InvalidShopOwnerException::new);

List<Reservation> reservations = ReservationRequest.toEntityForOwner(reservationRequest,
experienceGift, owner);
return reservations.stream()
.map(reservationRepository::save)
.map(ReservationResponse::toDtoOwner)
.collect(Collectors.toList());
}

@Transactional
public ReservationResponse addUserReservation(ReservationUserReq reservationRequest,
UserPrincipal userPrincipal) {

User nonPersistentSender = userPrincipal.getUser();
User sender = userRepository.findById(nonPersistentSender.getId()).orElseThrow(
InvalidUserException::new);
User receiver = userRepository.findByPhoneNumber(reservationRequest.getPhoneNumber()).orElseThrow(
InvalidUserException::new);

Reservation reservation = reservationRepository.findByDateAndTime(
reservationRequest.getDate(), reservationRequest.getTime())
.orElseThrow(InvalidReservationException::new);

if(reservation.getReservationStatus().equals(ReservationStatus.WAITING)){
reservation.updateStatus(ReservationStatus.BOOKED);
reservation.updateUserReservationRequest(reservationRequest,sender,receiver);
}else{
throw new InvalidReservationException();
}

@Transactional
public ReservationResponse updateReservation(UpdateReservationReq updateReq, UserPrincipal userPrincipal) {
Reservation updateReservation= reservationRepository.findByReceiverIdAndId(userPrincipal.getId(),updateReq.getId()).map(
reservation -> {reservation.updateReservation(updateReq);
return reservationRepository.save(reservation);}
).orElseThrow(InvalidReservationException::new);
//보낸이가 예약 수정
/* Reservation updateReservation= reservationRepository.findBySenderIdAndId(userPrincipal.getId(),updateReq.getId()).map(
reservation -> {reservation.updateReservation(updateReq);
return reservationRepository.save(reservation);}
).orElseThrow(InvalidReservationException::new);*/
return ReservationResponse.toDtoUser(updateReservation);
}

@Transactional
public DeleteReservationRes deleteReservation(Long id) {
Reservation reservation = reservationRepository.findById(id)
.orElseThrow(InvalidReservationException::new);

reservation.updateStatus(Status.DELETE);

return DeleteReservationRes.toDTO();
}

return ReservationResponse.toDtoUser(reservation);
}

public List<ReservationResponse> findUserReservation(UserPrincipal userPrincipal) {
return reservationRepository.findAllBySenderId(userPrincipal.getId())
.stream().map(ReservationResponse::toDtoUser).collect(Collectors.toList());
}

public List<ReservationResponse> getAllReservation() {
return reservationRepository.findAll().stream().map(ReservationResponse::toDtoUser)
.collect(Collectors.toList());
}

public List<ReservationResponse> getCurrentGiftReservation(Long giftId) {
experienceGiftRepository.findById(giftId).orElseThrow(ExperienceGiftNotFoundException::new);
return reservationRepository.findByExperienceGift_Id(giftId).stream()
.map(ReservationResponse::toDtoUser).collect(Collectors.toList());
}

@Transactional
public ReservationResponse updateReservation(UpdateReservationReq updateReq,
UserPrincipal userPrincipal) {
Reservation updateReservation = reservationRepository.findByReceiverIdAndId(
userPrincipal.getId(), updateReq.getId()).map(
reservation -> {
reservation.updateReservation(updateReq);
return reservationRepository.save(reservation);
}
).orElseThrow(InvalidReservationException::new);
return ReservationResponse.toDtoUser(updateReservation);
}

@Transactional
public DeleteReservationRes deleteReservation(Long id) {
Reservation reservation = reservationRepository.findById(id)
.orElseThrow(InvalidReservationException::new);
reservation.updateStatus(Status.DELETE);
return DeleteReservationRes.toDTO();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import com.shallwe.domain.common.BaseEntity;
import com.shallwe.domain.experiencegift.domain.ExperienceGift;
import com.shallwe.domain.memoryphoto.domain.MemoryPhoto;
import com.shallwe.domain.reservation.dto.ReservationRequest;
import com.shallwe.domain.reservation.dto.ReservationUserReq;
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 jakarta.validation.constraints.NotNull;
import java.time.LocalDate;
import java.time.LocalTime;
import lombok.*;
Expand All @@ -34,13 +36,13 @@ public class Reservation extends BaseEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "experience_gift_id")
@Schema(description = "선물 ID")
@NotBlank
@NotNull
private ExperienceGift experienceGift;

@ManyToOne
@JoinColumn(name = "owner_id")
@Schema(description = "사장ID")
@NotBlank
@NotNull
private ShopOwner owner;


Expand Down Expand Up @@ -84,11 +86,16 @@ public void updateReservation(UpdateReservationReq updateReq) {
this.invitationComment = Optional.ofNullable(updateReq.getInvitation_comment()).orElse(this.invitationComment);
}

public void updateStatus(ReservationStatus status){
this.reservationStatus = status;
public void updateUserReservationRequest(ReservationUserReq reservationRequest,User sender, User receiver){
this.sender = sender;
this.receiver = receiver;
this.phoneNumber = reservationRequest.getPhoneNumber();
this.invitationComment = reservationRequest.getInvitationComment();
this.persons = reservationRequest.getPersons();
this.invitationImg = reservationRequest.getImageKey();
}

public int getHour(){
return time.getHour();
public void updateStatus(ReservationStatus status){
this.reservationStatus = status;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import com.shallwe.domain.reservation.domain.ReservationStatus;
import com.shallwe.domain.shopowner.domain.ShopOwner;
import com.shallwe.domain.user.domain.User;
import java.time.LocalDate;
import java.time.LocalTime;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -32,6 +34,7 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>
@Query("SELECT r FROM Reservation r WHERE r.experienceGift.experienceGiftId = :giftId and r.status = :BOOKED")
List<Reservation> findAllByExperienceGift_IdAndStatus(@Param("giftId")Long giftID);

Optional<Reservation> findByDateAndTime(LocalDate date, LocalTime time);

@EntityGraph(attributePaths = {"memoryPhotos"})
List<Reservation> findAllByDateAndPhoneNumber(LocalDateTime date, String phoneNumber);
Expand All @@ -48,6 +51,4 @@ public interface ReservationRepository extends JpaRepository<Reservation, Long>
List<Reservation> findAllByDateAndPhoneNumber(LocalDate date, String phoneNumber);

Long countByExperienceGift_ShopOwnerAndReservationStatus(ShopOwner shopOwner, ReservationStatus status);


}
Original file line number Diff line number Diff line change
Expand Up @@ -11,51 +11,23 @@
import java.util.Map;
import lombok.*;

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 reservationId;
private Long persons;
private Long senderId;
private Long ownerId;
private Map<LocalDate, List<LocalTime>> dateTimeMap;
private String phoneNumber;
private String imageKey;
private String invitationComment;
private ReservationStatus reservationStatus;

public static List<Reservation> toEntityForUser(final ReservationRequest reservationRequest,
ExperienceGift experienceGift, ShopOwner owner) {
List<Reservation> reservations = new ArrayList<>();

for (Map.Entry<LocalDate, List<LocalTime>> entry : reservationRequest.getDateTimeMap()
.entrySet()) {
LocalDate date = entry.getKey();
List<LocalTime> 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<Reservation> toEntityForOwner(ReservationRequest reservationRequest,
ExperienceGift experienceGift,ShopOwner owner) {
List<Reservation> reservations = new ArrayList<>();
Expand All @@ -73,13 +45,10 @@ public static List<Reservation> toEntityForOwner(ReservationRequest reservationR
.owner(owner)
.reservationStatus(WAITING)
.build();

reservations.add(toEntity);
}
}

return reservations;
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.shallwe.domain.reservation.dto;

import com.shallwe.domain.reservation.domain.ReservationStatus;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class ReservationUserReq {

private Long experienceGiftId;
private Long persons;
private Long senderId;
private LocalDate date;
private LocalTime time;
private String phoneNumber;
private String imageKey;
private String invitationComment;
private ReservationStatus reservationStatus;

@Builder
public ReservationUserReq(Long experienceGiftId, Long persons, Long senderId, LocalDate date,
LocalTime time, String phoneNumber, String imageKey, String invitationComment,
ReservationStatus reservationStatus) {
this.experienceGiftId = experienceGiftId;
this.persons = persons;
this.senderId = senderId;
this.date = date;
this.time = time;
this.phoneNumber = phoneNumber;
this.imageKey = imageKey;
this.invitationComment = invitationComment;
this.reservationStatus = reservationStatus;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.shallwe.domain.reservation.dto.DeleteReservationRes;
import com.shallwe.domain.reservation.dto.ReservationRequest;
import com.shallwe.domain.reservation.dto.ReservationResponse;
import com.shallwe.domain.reservation.dto.ReservationUserReq;
import com.shallwe.domain.reservation.dto.UpdateReservationReq;
import com.shallwe.global.config.security.token.CurrentUser;
import com.shallwe.global.config.security.token.UserPrincipal;
Expand Down Expand Up @@ -80,6 +81,19 @@ public ResponseCustom<List<ReservationResponse>> createReservation(
return ResponseCustom.CREATED(reservationServiceimpl.addOwnerReservation(reservationRequest,userPrincipal));
}

@Operation(summary ="유저 예약 추가하기", description = "등록된 예약이 예약 가능한지 확인 후, 예약을 확정 상태로 변경합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "예약 생성 성공", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ReservationResponse.class))}),
@ApiResponse(responseCode = "400", description = "예약 생성 실패", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ErrorResponse.class))} )
})
@PostMapping("/user")
public ResponseCustom<ReservationResponse> createUserReservation(
@Parameter(description = "예약 요청을 확인해주세요.", required = true) @RequestBody ReservationUserReq reservationRequest,
@Parameter(description = "AccessToken 을 입력해주세요.", required = true) @CurrentUser UserPrincipal userPrincipal
){
return ResponseCustom.CREATED(reservationServiceimpl.addUserReservation(reservationRequest,userPrincipal));
}

@Operation(summary ="예약 수정하기", description = "예약을 수정합니다")
@ApiResponses(value = {
@ApiResponse(responseCode = "201", description = "예약 수정 성공", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ReservationResponse.class))}),
Expand Down

0 comments on commit 7fa6080

Please sign in to comment.