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 #94 from Mini-Team-6/feature/#86-reservation-refactor
Browse files Browse the repository at this point in the history
Feature/#86 reservation refactor
  • Loading branch information
tjdtn0219 authored Nov 28, 2023
2 parents 802ec67 + 3b52f59 commit b2cdebb
Show file tree
Hide file tree
Showing 10 changed files with 50 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import java.util.List;

import static ybe.mini.travelserver.global.security.Role.HAS_ROLE_USER;
import static ybe.mini.travelserver.global.security.Role.ROLE_USER;

@Slf4j
Expand All @@ -27,10 +28,10 @@ public class ReservationController {

private final ReservationService reservationService;

@PreAuthorize("hasRole('ROLE_USER')")
@PreAuthorize(HAS_ROLE_USER)
@PostMapping
public ResponseDto<ReservationCreateResponse> tryReservation (
@RequestBody @Valid ReservationCreateRequest createRequest,
@RequestBody ReservationCreateRequest createRequest,
@AuthenticationPrincipal PrincipalDetails principalDetails
) {
return new ResponseDto<>(
Expand All @@ -39,7 +40,7 @@ public ResponseDto<ReservationCreateResponse> tryReservation (
);
}

@PreAuthorize("hasRole('ROLE_USER')")
@PreAuthorize(HAS_ROLE_USER)
@PostMapping("/from-cart")
public ResponseDto<ReservationCreateResponse> tryReservationFromCart (
@RequestBody @Valid ReservationCreateFromCartRequest createRequest,
Expand All @@ -51,7 +52,7 @@ public ResponseDto<ReservationCreateResponse> tryReservationFromCart (
);
}

@PreAuthorize("hasRole('ROLE_USER')")
@PreAuthorize(HAS_ROLE_USER)
@GetMapping
public ResponseDto<List<ReservationGetResponse>> getMyReservations (
@AuthenticationPrincipal PrincipalDetails principalDetails
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
@AllArgsConstructor
public enum ReservationErrorMessage implements ErrorMessage {

HTTP_MESSAGE_NOT_READABLE(BAD_REQUEST, "DTO 양식이 맞지 않습니다."),
RESERVATION_NOT_FOUND(BAD_REQUEST, "해당 ID의 예약 정보가 없습니다.")
;
private final HttpStatus status;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.ProblemDetail;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import ybe.mini.travelserver.global.exception.ProblemDetailCreator;

import static ybe.mini.travelserver.domain.reservation.exception.ReservationErrorMessage.HTTP_MESSAGE_NOT_READABLE;
import static ybe.mini.travelserver.domain.reservation.exception.ReservationErrorMessage.RESERVATION_NOT_FOUND;

@RestControllerAdvice
Expand All @@ -17,11 +15,6 @@ protected ReservationExceptionHandler() {
super("예약 처리 실패");
}

@ExceptionHandler(HttpMessageNotReadableException.class)
public ProblemDetail handleHttpMessageNotReadableException(HttpServletRequest request) {
return createProblemDetail(HTTP_MESSAGE_NOT_READABLE, request); //todo : Global로 분리할지 논의
}

@ExceptionHandler(ReservationNotFoundException.class)
public ProblemDetail handleReservationNotFoundException(HttpServletRequest request) {
return createProblemDetail(RESERVATION_NOT_FOUND, request);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@

import java.util.List;

import static ybe.mini.travelserver.global.security.Role.HAS_ROLE_USER;

@Slf4j
@RequestMapping("/reservation-rooms")
@RestController
Expand All @@ -19,7 +21,7 @@ public class ReservationRoomController {

private final ReservationRoomService reservationRoomService;

@PreAuthorize("hasRole('ROLE_USER')")
@PreAuthorize(HAS_ROLE_USER)
@GetMapping("/{reservationId}")
public ResponseDto<List<ReservationRoomGetResponse>> getReservationRoomsByReserveId(
@PathVariable Long reservationId
Expand All @@ -30,8 +32,8 @@ public ResponseDto<List<ReservationRoomGetResponse>> getReservationRoomsByReserv
reservationRoomService.getReservationRoomsFromReservation(reservationId)
);
}
@PreAuthorize("hasRole('ROLE_USER')")

@PreAuthorize(HAS_ROLE_USER)
@DeleteMapping
public ResponseDto<Long> deleteReservationRoom(
@RequestParam Long reservationId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package ybe.mini.travelserver.domain.reservation_room.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.*;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import org.springframework.format.annotation.DateTimeFormat;
import ybe.mini.travelserver.domain.accommodation.entity.AreaCode;

import java.io.Serializable;
Expand All @@ -20,14 +23,13 @@ public record ReservationRoomCreateRequest(
@NotNull(message = "roomTypeId 양식이 잘못 입력되었습니다.")
Long roomTypeId,

@NotNull

@FutureOrPresent
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
@DateTimeFormat(pattern = "yyyy-MM-dd")
LocalDateTime checkIn,

@NotNull
@FutureOrPresent
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm")
@DateTimeFormat(pattern = "yyyy-MM-dd")
LocalDateTime checkOut,
@NotNull
@Min(value = 1, message = "숙박 인원은 최소 1명 이어야 합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
@AllArgsConstructor
public enum DTOErrorMessage implements ErrorMessage {
METHOD_ARGUMENT_NOT_VALID(BAD_REQUEST, "DTO 값이 유효하지 않습니다"),
DATETIME_PARSE(BAD_REQUEST, "날짜 형식이 유효하지 않습니다"),
;

private final HttpStatus status;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
import org.springframework.web.bind.annotation.RestControllerAdvice;
import ybe.mini.travelserver.global.exception.ProblemDetailCreator;

import java.time.format.DateTimeParseException;
import java.util.Objects;

import static ybe.mini.travelserver.global.exception.dto.DTOErrorMessage.DATETIME_PARSE;
import static ybe.mini.travelserver.global.exception.dto.DTOErrorMessage.METHOD_ARGUMENT_NOT_VALID;

@RestControllerAdvice
Expand All @@ -26,4 +28,10 @@ public ProblemDetail handleMethodArgumentNotValidException(
return createProblemDetail(errorMessage, METHOD_ARGUMENT_NOT_VALID.getStatus().value(), request);
}

@ExceptionHandler(DateTimeParseException.class)
public ProblemDetail handleDateTimeParseException(
HttpServletRequest request
) {
return createProblemDetail(DATETIME_PARSE, request);
}
}
2 changes: 1 addition & 1 deletion src/main/resources/application-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ spring:
jpa:
show-sql: true
hibernate:
ddl-auto: create
ddl-auto: update
properties:
hibernate:
format_sql: true
Expand Down
6 changes: 3 additions & 3 deletions src/test/http/reservation.http
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
### 예약 생성
POST http://localhost:8080/reservations
Content-Type: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzAxMTE2MTk4LCJleHAiOjE3MDExMTc5OTgsImVtYWlsIjoib2tqYWVvb2s5OEBnbWFpbC5jb20iLCJwYXNzd29yZCI6IntiY3J5cHR9JDJhJDEwJGRWc3JDenZCWVdWdU5XWm5WN3d3QWVra3E5RUJWZ0t1anpxT28ucmZBU05FZEswZkd5QzVlIiwibmFtZSI6Im9ramFlb29rIn0.PUhHIiJF_XQ1vCcZW1LVXQLLJGkx_HAYKTYinAtH84c
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiaWF0IjoxNzAxMTU2NTc2LCJleHAiOjE3MDExNTgzNzYsImVtYWlsIjoib2tqYWVvb2s5OEBnbWFpbC5jb20iLCJwYXNzd29yZCI6IntiY3J5cHR9JDJhJDEwJFNCbjZSQ3ZQdFQ2WW1vSVM0ZzU1dE8xTFBwRDJkSjJLbDBKcDRXT3k5RmhuNzNxdnNJQS51IiwibmFtZSI6Im9ramFlb29rIn0.HCiMHNhtW45GEFH2tbkihaeiqADBmehLfg2iGlIDuCE

{
"paymentType": "CARD",
Expand All @@ -11,8 +11,8 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiaWF0I
"accommodationName": "가락관광호텔",
"areaCode": "SEOUL",
"roomTypeId": 11430,
"checkIn": "2024-01-01 14:00",
"checkOut": "2024-01-02 11:00",
"checkIn": "2024-01-01T00:00",
"checkOut": "2024-01-03T00:00",
"guestNumber": 2
}
]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ybe.mini.travelserver.domain.reservation.service;

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand Down Expand Up @@ -42,25 +41,25 @@ class ReservationServiceTest implements DummyObjectForRoom, DummyReservationDTO,
@InjectMocks
ReservationService reservationService;

// @Test
// void createReservation_success() {
// //given
// given(tourAPIService.bringAccommodation(anyLong(), any())).willReturn(dummyAccommodation());
// given(tourAPIService.bringRoom(anyLong(), anyLong())).willReturn(dummyRoom(dummyAccommodation()));
// given(roomRepository.findByRoomTypeId(any())).willReturn(Optional.empty());
// given(roomRepository.save(any(Room.class))).willReturn(dummyRoom(dummyAccommodation()));
// given(accommodationRepository.findById(any())).willReturn(Optional.ofNullable(dummyAccommodation()));
// given(memberRepository.findByEmail(any())).willReturn(Optional.ofNullable(dummyMember()));
// given(reservationRepository.save(any(Reservation.class))).willReturn(dummyReservation());
//
// //when
// var actual = reservationService.createReservation(dummyMember().getEmail(), dummyReservationCreateReq());
//
// //then
// var expected = dummyReservationCreateRes();
// assertEquals(actual, expected);
//
// }
@Test
void createReservation_success() {
//given
given(tourAPIService.bringAccommodation(any(), any())).willReturn(dummyAccommodation());
given(tourAPIService.bringRoom(anyLong(), anyLong())).willReturn(dummyRoom(dummyAccommodation()));
given(roomRepository.findByRoomTypeId(any())).willReturn(Optional.empty());
given(roomRepository.save(any(Room.class))).willReturn(dummyRoom(dummyAccommodation()));
given(accommodationRepository.findById(any())).willReturn(Optional.ofNullable(dummyAccommodation()));
given(memberRepository.findByEmail(any())).willReturn(Optional.ofNullable(dummyMember()));
given(reservationRepository.save(any(Reservation.class))).willReturn(dummyReservation());

//when
var actual = reservationService.createReservation(dummyMember().getEmail(), dummyReservationCreateReq());

//then
var expected = dummyReservationCreateRes();
assertEquals(actual, expected);

}

@Test
void deleteReservation_success() {
Expand Down

0 comments on commit b2cdebb

Please sign in to comment.