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

Develop #102

Merged
merged 32 commits into from
Nov 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
cc91bc1
Fix: ReservationService bringAccommodation 변경 적용
tjdtn0219 Nov 27, 2023
fbf72be
Merge branch 'feature/#77-cart-exception' of https://github.com/Mini-…
tjdtn0219 Nov 27, 2023
f1c31d6
Cart*Reservation tourAPIService 수정 반영
tjdtn0219 Nov 27, 2023
57e1d34
Fix: 바뀌어야 하는 로직 주석 처리
yuhyun1 Nov 28, 2023
cf3ac2c
Refactor: 사용하지 않는 메서드, import 삭제
yuhyun1 Nov 28, 2023
c95751c
Fix: delete 메서드, 예외처리 수정
ypd06021 Nov 28, 2023
7b5a696
Test: RoomController와 RoomService의 로직 변경으로 인한 기존 로직 삭제 및 바뀐 로직 반영한 테스…
yuhyun1 Nov 28, 2023
08619ea
Fix: ReservationRoomDTO 시간 검증 어노테이션 변경
tjdtn0219 Nov 28, 2023
3b52f59
Resolve Conflict
tjdtn0219 Nov 28, 2023
5e64b9b
Fix: 메소드명 변경
yuhyun1 Nov 28, 2023
e9c0f7c
Fix: createRequest 체크인 체크아웃 데이터포맷 변경 (yyyy-mm-dd)->(yyyymmdd)
ypd06021 Nov 28, 2023
503cd87
Merge pull request #95 from Mini-Team-6/feature/#52-cart-test
ypd06021 Nov 28, 2023
c3bfad7
Test: 숙소 테스트 코드 작성
yuhyun1 Nov 28, 2023
00805a2
Feat: TourAPI exception 추가
laigasus Nov 28, 2023
33868ea
Merge pull request #97 from Mini-Team-6/feature/#93-exception-and-ref…
yuhyun1 Nov 28, 2023
9c54b47
Chore: TourAPI exception 안쓰는 것 삭제
laigasus Nov 28, 2023
d5ea622
Feat: TourAPI error message 추가
laigasus Nov 28, 2023
170f3cc
Feat: TourAPI error handler 추가
laigasus Nov 28, 2023
50f45c9
Feat: TourAPI 예외 로직 구현
laigasus Nov 28, 2023
4da315d
Chore: xml 라이브러리 추가
laigasus Nov 28, 2023
4d0293a
Merge branch 'feature/#86-reservation-refactor' of https://github.com…
ypd06021 Nov 28, 2023
802ec67
Merge pull request #99 from Mini-Team-6/feature/#98-setup-tourapi-exc…
tjdtn0219 Nov 28, 2023
b2cdebb
Merge pull request #94 from Mini-Team-6/feature/#86-reservation-refactor
tjdtn0219 Nov 28, 2023
3d612ca
Merge branch 'feature/#98-setup-tourapi-exception' of https://github.…
ypd06021 Nov 28, 2023
9d01579
Feat: 조회할 값이 없는 페이지 조회 시 204 에러처리
yuhyun1 Nov 28, 2023
4caeb87
Fix: cart 체크인체크아웃 데이터 포맷 변경으로 인한 validation 및 예외처리 추가
ypd06021 Nov 28, 2023
c7e942d
Merge pull request #100 from Mini-Team-6/feature/#93-accommodation-ex…
yuhyun1 Nov 28, 2023
4098ac9
Fix: reservation 데이터 포맷 변경
ypd06021 Nov 28, 2023
4886c2a
Fix: reservation 테스트 오류 수정
ypd06021 Nov 28, 2023
1a26458
Merge branch 'develop' of https://github.com/Mini-Team-6/Mini-Team-6-…
ypd06021 Nov 28, 2023
47d9bb6
Merge pull request #101 from Mini-Team-6/feature/#52-cart-test
ypd06021 Nov 28, 2023
885197b
Fix: Resolve Conflict
tjdtn0219 Nov 28, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ dependencies {
//javers
implementation 'org.javers:javers-core:7.2.0'

// xml jaxb
implementation 'jakarta.xml.bind:jakarta.xml.bind-api:+'


}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public ResponseDto<List<AccommodationGetResponse>> searchAccommodations(
}

@GetMapping
public ResponseDto<AccommodationDetailGetResponse> searchAccommodations(
public ResponseDto<AccommodationDetailGetResponse> searchAccommodation(
@RequestParam String keyword,
@RequestParam(value = "area-code") AreaCode areaCode
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Builder;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;
import ybe.mini.travelserver.domain.room.dto.RoomGetResponse;

import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public record AccommodationDetailGetResponse(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,6 @@
import org.springframework.data.jpa.repository.JpaRepository;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;

import java.util.List;

public interface AccommodationRepository extends JpaRepository<Accommodation, Long> {

List<Accommodation> findByNameContainingAndLocationAreaCode(String keyword, String areaCode);

List<Accommodation> findByNameContaining(String keyword);

List<Accommodation> findByLocationAreaCode(String areaCode);

}

Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,28 @@

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import ybe.mini.travelserver.domain.accommodation.dto.AccommodationDetailGetResponse;
import ybe.mini.travelserver.domain.accommodation.dto.AccommodationGetResponse;
import ybe.mini.travelserver.domain.accommodation.entity.Accommodation;
import ybe.mini.travelserver.domain.accommodation.entity.AreaCode;
import ybe.mini.travelserver.domain.accommodation.repository.AccommodationRepository;
import ybe.mini.travelserver.global.api.TourAPIService;
import ybe.mini.travelserver.global.exception.api.NoAccommodationsFromAPIException;

import java.util.Collections;
import java.util.List;
import java.util.Objects;


@Service
@RequiredArgsConstructor
public class AccommodationService {

private final AccommodationRepository accommodationRepository;
private final TourAPIService tourAPIService;

public List<AccommodationGetResponse> bringAccommodations(
int pageNo, int numOfRows,
String keyword, AreaCode areaCode
) {
if (pageNo <= 0) {
return Collections.emptyList();
throw new NoAccommodationsFromAPIException();
}

String areaCodeString = (areaCode != null) ? String.valueOf(areaCode.getCode()) : null;
Expand All @@ -39,7 +35,9 @@ public List<AccommodationGetResponse> bringAccommodations(
keyword,
areaCodeString);

return getResponseList(accommodations);
return accommodations.stream()
.map(AccommodationGetResponse::fromEntity)
.toList();
}

public AccommodationDetailGetResponse bringAccommodationFromAPI(String keyword, AreaCode areaCode) {
Expand All @@ -50,34 +48,5 @@ public AccommodationDetailGetResponse bringAccommodationFromAPI(String keyword,
return AccommodationDetailGetResponse.fromEntity(accommodation);
}

@Transactional(readOnly = true)
public List<AccommodationGetResponse> bringAccommodations(String keyword, String areaCode) {
List<Accommodation> accommodations;

if (!Objects.isNull(keyword) && !Objects.isNull(areaCode)) {
accommodations = accommodationRepository.findByNameContainingAndLocationAreaCode(keyword, areaCode);
} else if (!Objects.isNull(keyword)) {
accommodations = accommodationRepository.findByNameContaining(keyword);
} else if (!Objects.isNull(areaCode)) {
accommodations = accommodationRepository.findByLocationAreaCode(areaCode);
} else {
accommodations = accommodationRepository.findAll();
}

return getResponseList(accommodations);
}


private Accommodation bringAccommodation(Long accommodationId) {
return accommodationRepository
.findById(accommodationId).orElseThrow(RuntimeException::new);
}

private static List<AccommodationGetResponse> getResponseList(List<Accommodation> accommodations) {
return accommodations.stream()
.map(AccommodationGetResponse::fromEntity)
.toList();
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public ResponseDto<CartDeleteResponse> deleteCart(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable Long cartId) {
CartDeleteResponse cartDeleteResponse =
cartService.deleteCart(principalDetails.getMemberId(), cartId);
cartService.deleteCart(cartId);
return new ResponseDto<>(HttpStatus.OK.value(), cartDeleteResponse);
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,25 @@
package ybe.mini.travelserver.domain.cart.dto.request;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Positive;
import lombok.Builder;
import ybe.mini.travelserver.domain.accommodation.entity.AreaCode;

import java.time.LocalDate;

@Builder
@JsonIgnoreProperties(ignoreUnknown = true)
public record CartCreateRequest(

@Positive
Long roomTypeId,

@FutureOrPresent
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
LocalDate checkIn,
@Pattern(regexp = "\\d{8}", message = "날짜 입력은 8자리 숫자이어야 합니다.")
String checkIn,

@FutureOrPresent
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
LocalDate checkOut,
@Pattern(regexp = "\\d{8}", message = "날짜 입력은 8자리 숫자이어야 합니다.")
String checkOut,

@Positive
Integer guestNumber,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
@AllArgsConstructor
public enum CartErrorMessage implements ErrorMessage {

CART_INVALID_MEMBER(BAD_REQUEST, "해당 ID가 유효하지 않습니다."),
CART_ALREADY_EXIST(BAD_REQUEST, "해당 정보가 장바구니에 담겨있습니다."),
CART_ALREADY_EXIST(BAD_REQUEST, "해당 정보가 이미 장바구니에 담겨있습니다."),

CART_NOT_FOUND(BAD_REQUEST, "해당 ID의 장바구니 정보가 없습니다.")
;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,6 @@ public ProblemDetail handelCartNotFoundException(HttpServletRequest request) {
return createProblemDetail(CART_NOT_FOUND, request);
}

@ExceptionHandler(CartInvalidMemberException.class)
public ProblemDetail handelCartInvalidMemberException(HttpServletRequest request) {
return createProblemDetail(CART_INVALID_MEMBER, request);
}

@ExceptionHandler(CartAleadyExistException.class)
public ProblemDetail handelCartAleadyExistException(HttpServletRequest request) {
return createProblemDetail(CART_ALREADY_EXIST, request);
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import ybe.mini.travelserver.domain.cart.entity.Cart;

import java.util.List;
import java.util.Optional;

public interface CartRepository extends JpaRepository<Cart, Long> {
List<Cart> findALLByMemberId(Long userId);

List<Cart> deleteAllByMemberId(Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
import ybe.mini.travelserver.domain.cart.dto.response.CartDeleteResponse;
import ybe.mini.travelserver.domain.cart.dto.response.CartGetResponse;
import ybe.mini.travelserver.domain.cart.entity.Cart;
import ybe.mini.travelserver.domain.cart.exception.CartInvalidMemberException;
import ybe.mini.travelserver.domain.cart.exception.CartNotFoundException;
import ybe.mini.travelserver.domain.cart.repository.CartRepository;
import ybe.mini.travelserver.domain.member.entity.Member;
Expand All @@ -22,8 +21,11 @@
import ybe.mini.travelserver.domain.room.repository.RoomRepository;
import ybe.mini.travelserver.global.api.TourAPIService;

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

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

@Slf4j
@RequiredArgsConstructor
@Service
Expand All @@ -38,9 +40,9 @@ public class CartService {
@Transactional
public CartCreateResponse createCart(Long userId, CartCreateRequest cartCreateRequest) {
Member member = getMemberById(userId);
createAccommodationById(cartCreateRequest.keyword(), cartCreateRequest.areaCode());
Room room = createRoomById(
cartCreateRequest.accommodationId(), cartCreateRequest.roomTypeId());
Accommodation accommodation =
createAccommodationById(cartCreateRequest.keyword(), cartCreateRequest.areaCode());
Room room = createRoomById(accommodation, cartCreateRequest.roomTypeId());

Cart cart = createCart(cartCreateRequest, room, member);
Cart createdCart = cartRepository.save(cart);
Expand All @@ -57,15 +59,11 @@ public List<CartGetResponse> getMyCarts(Long userId) {
}

@Transactional
public CartDeleteResponse deleteCart(Long memberId, Long cartId) {
Cart cart = cartRepository.findById(cartId)
public CartDeleteResponse deleteCart(Long cartId) {
cartRepository.findById(cartId)
.orElseThrow(CartNotFoundException::new);
if (cart.getMember().getId() == memberId) {
cartRepository.deleteById(cartId);
return new CartDeleteResponse(cartId);
} else {
throw new CartInvalidMemberException();
}
cartRepository.deleteById(cartId);
return new CartDeleteResponse(cartId);
}

private Member getMemberById(Long id) {
Expand All @@ -80,25 +78,25 @@ private Accommodation createAccommodationById(String keyword, AreaCode areaCode)
return getOrSaveAccommodation(accommodation);
}

private Room createRoomById(Long accommodationId, Long roomId) {
Room room = tourAPIService.bringRoom(accommodationId, roomId);
private Room createRoomById(Accommodation accommodation, Long roomId) {
Room room = tourAPIService.bringRoom(accommodation.getId(), roomId);
return getOrSaveRoom(room);
}

private Cart createCart(CartCreateRequest cartCreateRequest, Room room, Member member) {
// TODO : 성수님 roomId 관련 논의
roomRepository.findById(room.getId())
.orElseThrow(CartInvalidMemberException::new);

LocalDate checkIn = validateDateFormat(cartCreateRequest.checkIn());
LocalDate checkOut = validateDateFormat(cartCreateRequest.checkOut());
return Cart.builder()
.guestNumber(cartCreateRequest.guestNumber())
.room(room)
.member(member)
.checkOut(cartCreateRequest.checkOut())
.checkIn(cartCreateRequest.checkIn())
.checkOut(checkOut)
.checkIn(checkIn)
.build();
}


private Room getOrSaveRoom(Room room) {
return roomRepository.findByRoomTypeId(room.getRoomTypeId())
.orElseGet(() -> roomRepository.save(room));
Expand Down
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
laigasus marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,13 @@
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.util.ArrayList;
import java.util.List;

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

@Slf4j
@RequiredArgsConstructor
@Service
Expand Down Expand Up @@ -101,7 +104,10 @@ private ReservationRoom reservationRoomDtoToEntity(ReservationRoomCreateRequest
room = getOrSaveRoom(room);

return ReservationRoom.createReservationRoom(
room, roomRequest.checkIn(), roomRequest.checkOut(), roomRequest.guestNumber()
room,
validateDateFormat(roomRequest.checkIn()),
validateDateFormat(roomRequest.checkOut()),
roomRequest.guestNumber()
);
}

Expand Down
Loading