Skip to content
This repository has been archived by the owner on Jan 15, 2024. It is now read-only.

Commit

Permalink
Merge pull request #107 from Mini-Team-6/feature/#106-reserved_date
Browse files Browse the repository at this point in the history
Feat: 객실 조회시 날짜 별 잔여 재고 반환
  • Loading branch information
tjdtn0219 authored Nov 29, 2023
2 parents 701fdc5 + 90ab4df commit 9512b14
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,18 @@
import org.springframework.data.jpa.repository.JpaRepository;
import ybe.mini.travelserver.domain.reservation.entity.Reservation;
import ybe.mini.travelserver.domain.reservation_room.entity.ReservationRoom;
import ybe.mini.travelserver.domain.room.entity.Room;

import java.time.LocalDate;
import java.util.List;

public interface ReservationRoomRepository extends JpaRepository<ReservationRoom, Long> {

List<ReservationRoom> findAllByReservation(Reservation reservation);

List<ReservationRoom> findAllByRoomAndCheckInBetweenAndCheckOutBetween(
Room room,
LocalDate checkInDate1, LocalDate checkOutDate1,
LocalDate checkInDate2, LocalDate checkOutDate2
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponseFromAPI;
import ybe.mini.travelserver.domain.room.service.RoomService;
import ybe.mini.travelserver.global.common.ResponseDto;
Expand All @@ -20,8 +17,12 @@ public class RoomController {
private final RoomService roomService;

@GetMapping("/{accommodationId}")
public ResponseDto<List<RoomGetResponseFromAPI>> getRooms(@PathVariable Long accommodationId) {
List<RoomGetResponseFromAPI> rooms = roomService.bringRoomsFromAPI(accommodationId);
public ResponseDto<List<RoomGetResponseFromAPI>> getRooms(
@PathVariable Long accommodationId,
@RequestParam(value = "check-in") String checkIn,
@RequestParam(value = "check-out") String checkOut
) {
List<RoomGetResponseFromAPI> rooms = roomService.bringRoomsFromAPI(accommodationId, checkIn, checkOut);
return new ResponseDto<>(HttpStatus.OK.value(), rooms);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,17 @@ public static RoomGetResponseFromAPI fromEntity(Room room) {
room.getStock()
);
}

@Builder
public static RoomGetResponseFromAPI fromEntity(Room room, Integer stock) {
return new RoomGetResponseFromAPI(
room.getCapacity(),
room.getDescription(),
room.getPrice(),
room.getImage(),
room.getName(),
room.getRoomTypeId(),
stock
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,49 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ybe.mini.travelserver.domain.reservation_room.entity.ReservationRoom;
import ybe.mini.travelserver.domain.reservation_room.repository.ReservationRoomRepository;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponseFromAPI;
import ybe.mini.travelserver.domain.room.entity.Room;
import ybe.mini.travelserver.domain.room.repository.RoomRepository;
import ybe.mini.travelserver.global.api.TourAPIService;
import ybe.mini.travelserver.global.util.Validation;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static ybe.mini.travelserver.global.util.Validation.validateDateFormat;

@Service
@RequiredArgsConstructor
public class RoomService {

private final TourAPIService tourAPIService;
private final ReservationRoomRepository reservationRoomRepository;
private final RoomRepository roomRepository;

public List<RoomGetResponseFromAPI> bringRoomsFromAPI(Long accommodationId) {
@Transactional(readOnly = true)
public List<RoomGetResponseFromAPI> bringRoomsFromAPI(Long accommodationId, String checkIn, String checkOut) {
List<Room> rooms = tourAPIService.bringRooms(accommodationId);

return rooms.stream()
.map(RoomGetResponseFromAPI::fromEntity)
.toList();
.map(room -> RoomGetResponseFromAPI.fromEntity(
room, getRestStock(room, validateDateFormat(checkIn), validateDateFormat(checkOut))
)).toList();
}

private Integer getRestStock(Room room, LocalDate checkIn, LocalDate checkOut) {
Optional<Room> roomOpt = roomRepository.findByRoomTypeId(room.getRoomTypeId());
if(roomOpt.isEmpty()) return room.getStock();

List<ReservationRoom> reservationRooms =
reservationRoomRepository.findAllByRoomAndCheckInBetweenAndCheckOutBetween(
roomOpt.get(), checkIn, checkOut, checkIn, checkOut
);
return room.getStock() - reservationRooms.size();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;

Expand All @@ -39,18 +40,18 @@ void getRooms_success() {
RoomGetResponseFromAPI.fromEntity(dummyRoom(accommodation)),
RoomGetResponseFromAPI.fromEntity(dummyRoom1(accommodation))
);
given(roomService.bringRoomsFromAPI(accommodation.getId())).willReturn(expectedRooms);
given(roomService.bringRoomsFromAPI(anyLong(), anyString(), anyString())).willReturn(expectedRooms);


// when
ResponseDto<List<RoomGetResponseFromAPI>> responseDto =
roomController.getRooms(accommodation.getId());
roomController.getRooms(accommodation.getId(), "20240102", "20240202");

// then
assertNotNull(responseDto);
assertEquals(HttpStatus.OK.value(), responseDto.status());
assertEquals(expectedRooms, responseDto.data());
then(roomService).should().bringRoomsFromAPI(accommodation.getId());
then(roomService).should().bringRoomsFromAPI(anyLong(), anyString(), anyString());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,19 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;
import ybe.mini.travelserver.domain.reservation_room.repository.ReservationRoomRepository;
import ybe.mini.travelserver.domain.room.DummyObjectForControllerAndService;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponseFromAPI;
import ybe.mini.travelserver.domain.room.entity.Room;
import ybe.mini.travelserver.domain.room.repository.RoomRepository;
import ybe.mini.travelserver.global.api.TourAPIService;

import java.util.Arrays;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
Expand All @@ -27,6 +30,12 @@ class RoomServiceTest extends DummyObjectForControllerAndService {
@Mock
private TourAPIService tourAPIService;

@Mock
ReservationRoomRepository reservationRoomRepository;

@Mock
RoomRepository roomRepository;

@InjectMocks
private RoomService roomService;

Expand All @@ -41,10 +50,11 @@ void getRooms_success() {
List<RoomGetResponseFromAPI> responseDto = expectedRooms.stream()
.map(RoomGetResponseFromAPI::fromEntity)
.toList();
given(tourAPIService.bringRooms(eq(accommodation.getId()))).willReturn(expectedRooms);
given(tourAPIService.bringRooms(anyLong())).willReturn(expectedRooms);

// when
List<RoomGetResponseFromAPI> actualRooms = roomService.bringRoomsFromAPI(accommodation.getId());
List<RoomGetResponseFromAPI> actualRooms =
roomService.bringRoomsFromAPI(accommodation.getId(), "20240101", "20240102");

// then
assertNotNull(actualRooms);
Expand Down

0 comments on commit 9512b14

Please sign in to comment.