reservation
Entity
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
public class Reservation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long reservationId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "room_id")
private Room room;
private String guestName;
private LocalDate checkInDate;
private LocalDate checkOutDate;
private Double totalPrice;
@Column(nullable = false)
private Integer people;
private String poneNumber;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
}
Repository
public interface ReservationRepository extends JpaRepository<Reservation, Long> {
Page<Reservation> findAllByGuestName(String name, Pageable pageable);
Page<Reservation> findAllBy(Pageable pageable);
}
Service
@Service
@RequiredArgsConstructor
@Transactional
public class ReservationService {
private final ReservationRepository reservationRepository;
private final RoomRepository roomRepository;
private final UserRepository userRepository;
public void save(ReservationRequest request) {
Room room = roomRepository.findById(request.getRoomId())
.orElseThrow(()-> new RuntimeException("Room not found"));
User user = userRepository.findById(request.getUserId())
.orElseThrow(()-> new RuntimeException("User not found"));
double totalPrice = ChronoUnit.DAYS.between(request.getCheckInDate(), request.getCheckOutDate()) * room.getPrice();
Reservation reservation = Reservation.builder()
.room(room)
.guestName(request.getGuestName())
.checkInDate(request.getCheckInDate())
.checkOutDate(request.getCheckOutDate())
.totalPrice(totalPrice)
.people(request.getPeople())
.poneNumber(request.getPoneNumber())
.user(user)
.build();
reservationRepository.save(reservation);
}
public Reservation findById(Long id) {
Optional<Reservation> byId = reservationRepository.findById(id);
return byId.orElseThrow(()->
new RuntimeException("없는 예약입니다."));
}
public Page<ReservationResponse> findByName(String name, PageRequest request) {
Page<Reservation> all = reservationRepository.findAllByGuestName(name, request);
return all.map(r-> new ReservationResponse(r));
}
public Page<ReservationResponse> findAll(Pageable pageable) {
Page<Reservation> allBy = reservationRepository.findAllBy(pageable);
return allBy.map(m-> new ReservationResponse(m));
}
public ReservationResponse changeDate(Long id,ReservationRequest request) {
Optional<Reservation> byId = reservationRepository.findById(id);
if (byId.isEmpty()) throw new RuntimeException("예약이 없습니다.");
Room room = roomRepository.findById(request.getRoomId()).orElseThrow();
User user = userRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found"));
Reservation reservation = new Reservation(id, room, request.getGuestName(), request.getCheckInDate(), request.getCheckOutDate(),
byId.get().getTotalPrice(), request.getPeople(), request.getPoneNumber(), user);
Reservation save = reservationRepository.save(reservation);
return new ReservationResponse(save);
}
public void deleteById(Long id) {
reservationRepository.deleteById(id);
}
}
Controller
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/reservation")
public class ReservationController {
private final ReservationService reservationService;
@PostMapping
public void insert(@RequestBody ReservationRequest request) {
reservationService.save(request);
}
@GetMapping("{id}")
public Reservation getById(@PathVariable("id") Long id) {
return reservationService.findById(id);
}
@GetMapping
public Page<ReservationResponse> findAll(
@RequestParam(name = "size", required = false, defaultValue = "10") Integer size,
@RequestParam(name = "page", required = false, defaultValue = "0") Integer page) {
PageRequest request = PageRequest.of(page, size);
return reservationService.findAll(request);
}
@PutMapping("{id}")
public void changeData(@PathVariable("id") Long id,
@RequestBody ReservationRequest request) {
reservationService.changeDate(id, request);
}
@DeleteMapping("{id}")
public void deleteById(@PathVariable("id") Long id) {
reservationService.deleteById(id);
}
@GetMapping("/price")
public void price() {
Reservation byId = reservationService.findById(1L);
System.out.println(ChronoUnit.DAYS.between(byId.getCheckInDate(), byId.getCheckOutDate()));
}
}
Response
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class ReservationResponse {
private Long reservationId;
private String guestName;
private LocalDate checkInDate;
private LocalDate checkOutDate;
private Double totalPrice;
private User userId;
private Integer people;
private String poneNumber;
public ReservationResponse(Reservation reservation) {
this.reservationId = reservation.getReservationId();
this.guestName = reservation.getGuestName();
this.checkInDate = reservation.getCheckInDate();
this.checkOutDate = reservation.getCheckOutDate();
this.totalPrice = reservation.getTotalPrice();
this.userId = reservation.getUser();
this.people = reservation.getPeople();
this.poneNumber = reservation.getPoneNumber();
}
}
Request
@Getter
@AllArgsConstructor
public class ReservationRequest {
private Long roomId;
private String guestName;
private LocalDate checkInDate;
private LocalDate checkOutDate;
private Long userId;
private Integer people;
private String poneNumber;
}