From 5359ddcc980e5fbf4fc59035d9d71b4e5cb09dad Mon Sep 17 00:00:00 2001 From: jeonghyemin Date: Tue, 24 Jun 2025 14:31:14 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat(global,reservation):=20=20=EC=98=88?= =?UTF-8?q?=EC=95=BDcrud=EC=83=9D=EC=84=B1=20=EB=B0=8F=20global=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=84=B0=EB=A6=AC=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - reservation 도메인 생성 - global예외핸들러 디렉터리 구조조정 - 북마크 커스텀 예외 생성 --- .../BookmarkOwnerMismatchException.java | 9 +++ .../exception/DuplicateBookmarkException.java | 9 +++ .../bookmark/service/BookmarkService.java | 9 ++- .../exception/ErrorMessage.java | 10 ++- .../exception/ErrorResponse.java | 2 +- .../exception/GlobalExceptionHandler.java | 33 +++++++- .../security/exception/BusinessException.java | 2 + .../RefreshTokenNotFoundException.java | 2 + .../exception/ResourceNotFoundException.java | 2 + .../exception/TokenBadRequestException.java | 2 + .../exception/UnauthorizedException.java | 2 + .../controller/ReservationController.java | 75 +++++++++++++++++++ .../dto/ReservationCreateRequestDto.java | 10 +++ .../dto/ReservationCreateResponseDto.java | 15 ++++ .../dto/ReservationGetResponseDto.java | 32 ++++++++ .../reservation/entity/Reservation.java | 39 ++++++++++ .../reservation/entity/ReservationStatus.java | 5 ++ .../repository/ReservationRepository.java | 11 +++ .../service/ReservationService.java | 67 +++++++++++++++++ .../user/dto/ManagerSignupRequestDto.java | 2 +- .../gtable/user/entity/SocialType.java | 2 +- .../exception/MissingUserInfoException.java | 9 +++ 22 files changed, 338 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/gtable/bookmark/exception/BookmarkOwnerMismatchException.java create mode 100644 src/main/java/com/example/gtable/bookmark/exception/DuplicateBookmarkException.java rename src/main/java/com/example/gtable/global/{security => }/exception/ErrorMessage.java (62%) rename src/main/java/com/example/gtable/global/{security => }/exception/ErrorResponse.java (90%) rename src/main/java/com/example/gtable/global/{security => }/exception/GlobalExceptionHandler.java (74%) create mode 100644 src/main/java/com/example/gtable/reservation/controller/ReservationController.java create mode 100644 src/main/java/com/example/gtable/reservation/dto/ReservationCreateRequestDto.java create mode 100644 src/main/java/com/example/gtable/reservation/dto/ReservationCreateResponseDto.java create mode 100644 src/main/java/com/example/gtable/reservation/dto/ReservationGetResponseDto.java create mode 100644 src/main/java/com/example/gtable/reservation/entity/Reservation.java create mode 100644 src/main/java/com/example/gtable/reservation/entity/ReservationStatus.java create mode 100644 src/main/java/com/example/gtable/reservation/repository/ReservationRepository.java create mode 100644 src/main/java/com/example/gtable/reservation/service/ReservationService.java create mode 100644 src/main/java/com/example/gtable/user/exception/MissingUserInfoException.java diff --git a/src/main/java/com/example/gtable/bookmark/exception/BookmarkOwnerMismatchException.java b/src/main/java/com/example/gtable/bookmark/exception/BookmarkOwnerMismatchException.java new file mode 100644 index 0000000..ed5148c --- /dev/null +++ b/src/main/java/com/example/gtable/bookmark/exception/BookmarkOwnerMismatchException.java @@ -0,0 +1,9 @@ +package com.example.gtable.bookmark.exception; + +import com.example.gtable.global.exception.ErrorMessage; + +public class BookmarkOwnerMismatchException extends RuntimeException { + public BookmarkOwnerMismatchException() { + super(ErrorMessage.NOT_OWN_BOOKMARK.getMessage()); + } +} diff --git a/src/main/java/com/example/gtable/bookmark/exception/DuplicateBookmarkException.java b/src/main/java/com/example/gtable/bookmark/exception/DuplicateBookmarkException.java new file mode 100644 index 0000000..9bc2a80 --- /dev/null +++ b/src/main/java/com/example/gtable/bookmark/exception/DuplicateBookmarkException.java @@ -0,0 +1,9 @@ +package com.example.gtable.bookmark.exception; + +import com.example.gtable.global.exception.ErrorMessage; + +public class DuplicateBookmarkException extends RuntimeException { + public DuplicateBookmarkException() { + super(ErrorMessage.DUPLICATE_BOOKMARK.getMessage()); + } +} diff --git a/src/main/java/com/example/gtable/bookmark/service/BookmarkService.java b/src/main/java/com/example/gtable/bookmark/service/BookmarkService.java index 952d10a..431c71b 100644 --- a/src/main/java/com/example/gtable/bookmark/service/BookmarkService.java +++ b/src/main/java/com/example/gtable/bookmark/service/BookmarkService.java @@ -8,11 +8,14 @@ import com.example.gtable.bookmark.dto.BookmarkCreateResponse; import com.example.gtable.bookmark.dto.BookmarkGetResponse; import com.example.gtable.bookmark.entity.Bookmark; +import com.example.gtable.bookmark.exception.BookmarkOwnerMismatchException; +import com.example.gtable.bookmark.exception.DuplicateBookmarkException; import com.example.gtable.bookmark.repository.BookmarkRepository; import com.example.gtable.global.security.oauth2.dto.CustomOAuth2User; import com.example.gtable.store.model.Store; import com.example.gtable.store.repository.StoreRepository; import com.example.gtable.user.entity.User; +import com.example.gtable.user.exception.MissingUserInfoException; import com.example.gtable.user.repository.UserRepository; import jakarta.persistence.EntityNotFoundException; @@ -33,7 +36,7 @@ public BookmarkCreateResponse createBookmark(Long storeId, CustomOAuth2User cust .orElseThrow(() -> new EntityNotFoundException("User not found")); if (bookmarkRepository.existsByUserAndStore(user, store)) { - throw new IllegalArgumentException("already bookmarked"); + throw new DuplicateBookmarkException(); } Bookmark bookmark = Bookmark.builder() @@ -60,7 +63,7 @@ public String deleteBookmark(Long bookmarkId, CustomOAuth2User customOAuth2User) Bookmark bookmark = bookmarkRepository.findById(bookmarkId) .orElseThrow(() -> new EntityNotFoundException(bookmarkId + " bookmark not found.")); if (bookmark.getUser().getId() != customOAuth2User.getUserId()) { - throw new IllegalArgumentException("you can only delete your own bookmark"); + throw new BookmarkOwnerMismatchException(); } bookmarkRepository.delete(bookmark); return "Bookmark ID " + bookmarkId + " deleted."; @@ -72,7 +75,7 @@ private static void parameterValidation(Long storeId, CustomOAuth2User customOAu throw new IllegalArgumentException("storeId must be a positive number"); } if (customOAuth2User == null || customOAuth2User.getUserId() == null) { - throw new IllegalArgumentException("UserInfo is required"); + throw new MissingUserInfoException(); } } } diff --git a/src/main/java/com/example/gtable/global/security/exception/ErrorMessage.java b/src/main/java/com/example/gtable/global/exception/ErrorMessage.java similarity index 62% rename from src/main/java/com/example/gtable/global/security/exception/ErrorMessage.java rename to src/main/java/com/example/gtable/global/exception/ErrorMessage.java index 0690ee1..16af332 100644 --- a/src/main/java/com/example/gtable/global/security/exception/ErrorMessage.java +++ b/src/main/java/com/example/gtable/global/exception/ErrorMessage.java @@ -1,4 +1,4 @@ -package com.example.gtable.global.security.exception; +package com.example.gtable.global.exception; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -14,7 +14,13 @@ public enum ErrorMessage { // token REFRESH_TOKEN_NOT_FOUND("기존 리프레시 토큰을 찾을 수 없습니다.", "token001"), - DOES_NOT_MATCH_REFRESH_TOKEN("기존 리프레시 토큰이 일치하지 않습니다.", "token002"); + DOES_NOT_MATCH_REFRESH_TOKEN("기존 리프레시 토큰이 일치하지 않습니다.", "token002"), + + // user + MISSING_USER("사용자 정보가 없습니다.", "user001"), + // bookmark + DUPLICATE_BOOKMARK("이미 북마크한 주점입니다.", "bookmark001"), + NOT_OWN_BOOKMARK("권한이 없습니다.", "bookmark002"); private final String message; private final String code; diff --git a/src/main/java/com/example/gtable/global/security/exception/ErrorResponse.java b/src/main/java/com/example/gtable/global/exception/ErrorResponse.java similarity index 90% rename from src/main/java/com/example/gtable/global/security/exception/ErrorResponse.java rename to src/main/java/com/example/gtable/global/exception/ErrorResponse.java index 305e2cd..40f5919 100644 --- a/src/main/java/com/example/gtable/global/security/exception/ErrorResponse.java +++ b/src/main/java/com/example/gtable/global/exception/ErrorResponse.java @@ -1,4 +1,4 @@ -package com.example.gtable.global.security.exception; +package com.example.gtable.global.exception; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/example/gtable/global/security/exception/GlobalExceptionHandler.java b/src/main/java/com/example/gtable/global/exception/GlobalExceptionHandler.java similarity index 74% rename from src/main/java/com/example/gtable/global/security/exception/GlobalExceptionHandler.java rename to src/main/java/com/example/gtable/global/exception/GlobalExceptionHandler.java index 8c606f3..214e32a 100644 --- a/src/main/java/com/example/gtable/global/security/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/gtable/global/exception/GlobalExceptionHandler.java @@ -1,13 +1,12 @@ -package com.example.gtable.global.security.exception; +package com.example.gtable.global.exception; -import static com.example.gtable.global.security.exception.ErrorMessage.*; +import static com.example.gtable.global.exception.ErrorMessage.*; import static org.springframework.http.HttpStatus.UNAUTHORIZED; import static org.springframework.http.HttpStatus.*; import java.util.Map; import java.util.stream.Collectors; -import org.springframework.context.annotation.Profile; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.security.oauth2.core.OAuth2AuthenticationException; import org.springframework.validation.FieldError; @@ -19,6 +18,13 @@ import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.multipart.MultipartException; +import com.example.gtable.bookmark.exception.BookmarkOwnerMismatchException; +import com.example.gtable.bookmark.exception.DuplicateBookmarkException; +import com.example.gtable.global.security.exception.BusinessException; +import com.example.gtable.global.security.exception.ResourceNotFoundException; +import com.example.gtable.global.security.exception.UnauthorizedException; +import com.example.gtable.user.exception.MissingUserInfoException; + import io.swagger.v3.oas.annotations.Hidden; import lombok.extern.slf4j.Slf4j; @@ -93,6 +99,27 @@ public ErrorResponse handleMultipartException(MultipartException e) { return new ErrorResponse(e.getMessage(), INVALID_INPUT_VALUE.getCode()); } + @ResponseStatus(value = BAD_REQUEST) + @ExceptionHandler(DuplicateBookmarkException.class) + public ErrorResponse handleDuplicateBookmarkException(DuplicateBookmarkException e) { + log.error("handleDuplicateBookmarkException", e); + return new ErrorResponse(e.getMessage(), ErrorMessage.DUPLICATE_BOOKMARK.getCode()); + } + + @ResponseStatus(value = BAD_REQUEST) + @ExceptionHandler(BookmarkOwnerMismatchException.class) + public ErrorResponse bookmarkOwnerMismatchException(BookmarkOwnerMismatchException e) { + log.error("bookmarkOwnerMismatchException", e); + return new ErrorResponse(e.getMessage(), NOT_OWN_BOOKMARK.getCode()); + } + + @ResponseStatus(value = NOT_FOUND) + @ExceptionHandler(IllegalStateException.class) + public ErrorResponse missingUserInfoException(MissingUserInfoException e) { + log.error("missingUserInform", e); + return new ErrorResponse(e.getMessage(), NOT_OWN_BOOKMARK.getCode()); + } + private static Map getErrors(MethodArgumentNotValidException e) { return e.getBindingResult() diff --git a/src/main/java/com/example/gtable/global/security/exception/BusinessException.java b/src/main/java/com/example/gtable/global/security/exception/BusinessException.java index 118ef78..c0338ad 100644 --- a/src/main/java/com/example/gtable/global/security/exception/BusinessException.java +++ b/src/main/java/com/example/gtable/global/security/exception/BusinessException.java @@ -1,5 +1,7 @@ package com.example.gtable.global.security.exception; +import com.example.gtable.global.exception.ErrorMessage; + public abstract class BusinessException extends RuntimeException { private final ErrorMessage errorMessage; diff --git a/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java b/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java index 65472b4..c06c053 100644 --- a/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java +++ b/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java @@ -1,5 +1,7 @@ package com.example.gtable.global.security.exception; +import com.example.gtable.global.exception.ErrorMessage; + public class RefreshTokenNotFoundException extends ResourceNotFoundException { public RefreshTokenNotFoundException() { diff --git a/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java b/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java index 32ff882..4717bd9 100644 --- a/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java +++ b/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java @@ -1,5 +1,7 @@ package com.example.gtable.global.security.exception; +import com.example.gtable.global.exception.ErrorMessage; + public abstract class ResourceNotFoundException extends RuntimeException { private final ErrorMessage errorMessage; diff --git a/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java b/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java index 38df8e0..3ae820f 100644 --- a/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java +++ b/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java @@ -1,5 +1,7 @@ package com.example.gtable.global.security.exception; +import com.example.gtable.global.exception.ErrorMessage; + public class TokenBadRequestException extends BusinessException { public TokenBadRequestException() { super(ErrorMessage.DOES_NOT_MATCH_REFRESH_TOKEN); diff --git a/src/main/java/com/example/gtable/global/security/exception/UnauthorizedException.java b/src/main/java/com/example/gtable/global/security/exception/UnauthorizedException.java index 6621357..84c9372 100644 --- a/src/main/java/com/example/gtable/global/security/exception/UnauthorizedException.java +++ b/src/main/java/com/example/gtable/global/security/exception/UnauthorizedException.java @@ -1,5 +1,7 @@ package com.example.gtable.global.security.exception; +import com.example.gtable.global.exception.ErrorMessage; + public class UnauthorizedException extends RuntimeException { private final ErrorMessage errorMessage; diff --git a/src/main/java/com/example/gtable/reservation/controller/ReservationController.java b/src/main/java/com/example/gtable/reservation/controller/ReservationController.java new file mode 100644 index 0000000..fcf6fd7 --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/controller/ReservationController.java @@ -0,0 +1,75 @@ +package com.example.gtable.reservation.controller; + + +import java.util.List; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +import com.example.gtable.global.api.ApiUtils; +import com.example.gtable.global.security.oauth2.dto.CustomOAuth2User; +import com.example.gtable.reservation.dto.ReservationCreateRequestDto; +import com.example.gtable.reservation.dto.ReservationCreateResponseDto; +import com.example.gtable.reservation.dto.ReservationGetResponseDto; +import com.example.gtable.reservation.service.ReservationService; +@Tag(name = "Reservation API", description = "예약 API") +@RestController +@RequestMapping("/reservations") +@RequiredArgsConstructor +public class ReservationController { + + private final ReservationService reservationService; + + @PostMapping("/create/{storeId}") + @Operation(summary = "예약 생성", description = "특정 주점에 대한 예약하기 생성") + @ApiResponse(responseCode = "201", description = "예약 생성") + public ResponseEntity create( + @PathVariable Long storeId, + @AuthenticationPrincipal CustomOAuth2User customOAuth2User, + @RequestBody ReservationCreateRequestDto requestDto) { + ReservationCreateResponseDto response = reservationService.create(storeId, customOAuth2User, requestDto); + return ResponseEntity + .status(HttpStatus.CREATED) + .body( + ApiUtils.success( + response + ) + ); + } + + @GetMapping("/admin/{storeId}") + @Operation(summary = "주점별 예약리스트 조회", description = "특정 주점에 대한 예약리스트 조회") + @ApiResponse(responseCode = "200", description = "예약리스트 조회") + public ResponseEntity getReservationListByStoreId(@PathVariable Long storeId) { + List response = reservationService.getReservationListByStoreId(storeId); + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + response + ) + ); + } + + // @PatchMapping("/{id}/status") + // public ReservationDto.Response updateStatus( + // @PathVariable Long id, + // @RequestParam Reservation.Status status + // ) { + // return reservationService.updateStatus(id, status); + // } + // + // @DeleteMapping("/{id}") + // public void delete(@PathVariable Long id) { + // reservationService.delete(id); + // } + + +} diff --git a/src/main/java/com/example/gtable/reservation/dto/ReservationCreateRequestDto.java b/src/main/java/com/example/gtable/reservation/dto/ReservationCreateRequestDto.java new file mode 100644 index 0000000..b91179d --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/dto/ReservationCreateRequestDto.java @@ -0,0 +1,10 @@ +package com.example.gtable.reservation.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ReservationCreateRequestDto { + private Integer partySize; +} diff --git a/src/main/java/com/example/gtable/reservation/dto/ReservationCreateResponseDto.java b/src/main/java/com/example/gtable/reservation/dto/ReservationCreateResponseDto.java new file mode 100644 index 0000000..7f3515b --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/dto/ReservationCreateResponseDto.java @@ -0,0 +1,15 @@ +package com.example.gtable.reservation.dto; + +import lombok.Builder; +import lombok.Getter; +import java.time.LocalDateTime; + +@Getter +@Builder +public class ReservationCreateResponseDto { + private Long id; + private Long storeId; + private Long userId; + private LocalDateTime requestedAt; + private String status; +} diff --git a/src/main/java/com/example/gtable/reservation/dto/ReservationGetResponseDto.java b/src/main/java/com/example/gtable/reservation/dto/ReservationGetResponseDto.java new file mode 100644 index 0000000..d31212a --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/dto/ReservationGetResponseDto.java @@ -0,0 +1,32 @@ +package com.example.gtable.reservation.dto; + +import java.time.LocalDateTime; + +import com.example.gtable.bookmark.dto.BookmarkGetResponse; +import com.example.gtable.bookmark.entity.Bookmark; +import com.example.gtable.reservation.entity.Reservation; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ReservationGetResponseDto { + private Long id; + private Long storeId; + private String userName; + private LocalDateTime requestedAt; + private String status; + private Integer partySize; + + public static ReservationGetResponseDto fromEntity(Reservation reservation) { + return ReservationGetResponseDto.builder() + .id(reservation.getId()) + .storeId(reservation.getStore().getStoreId()) + .userName(reservation.getUser().getNickname()) + .requestedAt(reservation.getRequestedAt()) + .status(reservation.getStatus().name()) + .partySize(reservation.getPartySize()) + .build(); + } +} diff --git a/src/main/java/com/example/gtable/reservation/entity/Reservation.java b/src/main/java/com/example/gtable/reservation/entity/Reservation.java new file mode 100644 index 0000000..a2c8e82 --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/entity/Reservation.java @@ -0,0 +1,39 @@ +package com.example.gtable.reservation.entity; +import jakarta.persistence.*; +import lombok.*; +import java.time.LocalDateTime; + +import com.example.gtable.store.model.Store; +import com.example.gtable.user.entity.User; + +@Entity +@Table(name = "waiting_requests") +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +public class Reservation { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "store_id") + private Store store; + + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "user_id") + private User user; + + @Column(name = "requested_at", nullable = false) + private LocalDateTime requestedAt; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ReservationStatus status; + + @Column(name = "partysize", nullable = false) + private Integer partySize; + +} diff --git a/src/main/java/com/example/gtable/reservation/entity/ReservationStatus.java b/src/main/java/com/example/gtable/reservation/entity/ReservationStatus.java new file mode 100644 index 0000000..c4b0ac9 --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/entity/ReservationStatus.java @@ -0,0 +1,5 @@ +package com.example.gtable.reservation.entity; + +public enum ReservationStatus { + WAITING,CALLING, CONFIRMED, CANCELLED +} diff --git a/src/main/java/com/example/gtable/reservation/repository/ReservationRepository.java b/src/main/java/com/example/gtable/reservation/repository/ReservationRepository.java new file mode 100644 index 0000000..b01aa1c --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/repository/ReservationRepository.java @@ -0,0 +1,11 @@ +package com.example.gtable.reservation.repository; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.example.gtable.reservation.entity.Reservation; + +public interface ReservationRepository extends JpaRepository { + List findAllByStore_StoreId(Long storeId); +} diff --git a/src/main/java/com/example/gtable/reservation/service/ReservationService.java b/src/main/java/com/example/gtable/reservation/service/ReservationService.java new file mode 100644 index 0000000..6680036 --- /dev/null +++ b/src/main/java/com/example/gtable/reservation/service/ReservationService.java @@ -0,0 +1,67 @@ +package com.example.gtable.reservation.service; + +import java.time.LocalDateTime; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.example.gtable.global.security.oauth2.dto.CustomOAuth2User; +import com.example.gtable.reservation.dto.ReservationCreateRequestDto; +import com.example.gtable.reservation.dto.ReservationCreateResponseDto; +import com.example.gtable.reservation.dto.ReservationGetResponseDto; +import com.example.gtable.reservation.entity.Reservation; +import com.example.gtable.reservation.entity.ReservationStatus; +import com.example.gtable.reservation.repository.ReservationRepository; +import com.example.gtable.store.model.Store; +import com.example.gtable.store.repository.StoreRepository; +import com.example.gtable.user.entity.User; +import com.example.gtable.user.repository.UserRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class ReservationService { + + private final ReservationRepository reservationRepository; + private final StoreRepository storeRepository; + private final UserRepository userRepository; + + @Transactional + public ReservationCreateResponseDto create(Long storeId, CustomOAuth2User customOAuth2User, + ReservationCreateRequestDto requestDto) { + Store store = storeRepository.findById(storeId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 store")); + User user = userRepository.findById(customOAuth2User.getUserId()) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 user")); + + Reservation reservation = Reservation.builder() + .store(store) + .user(user) + .requestedAt(LocalDateTime.now()) + .status(ReservationStatus.WAITING) + .build(); + + Reservation saved = reservationRepository.save(reservation); + + return ReservationCreateResponseDto.builder() + .id(saved.getId()) + .storeId(saved.getStore().getStoreId()) + .userId(saved.getUser().getId()) + .requestedAt(saved.getRequestedAt()) + .status(saved.getStatus().name()) + .build(); + } + @Transactional(readOnly = true) + public List getReservationListByStoreId(Long storeId) { + List reservations = reservationRepository.findAllByStore_StoreId(storeId); + + return reservations.stream() + .map(ReservationGetResponseDto::fromEntity) + .toList(); + } + + // 나머지 메서드도 동일하게 store/user 접근 시 getId() 활용 +} + diff --git a/src/main/java/com/example/gtable/user/dto/ManagerSignupRequestDto.java b/src/main/java/com/example/gtable/user/dto/ManagerSignupRequestDto.java index c3353bd..46382bd 100644 --- a/src/main/java/com/example/gtable/user/dto/ManagerSignupRequestDto.java +++ b/src/main/java/com/example/gtable/user/dto/ManagerSignupRequestDto.java @@ -36,7 +36,7 @@ public User toEntity() { .email(email) .password(password) .nickname(nickname) - .socialType(SocialType.KAKAO) + .socialType(SocialType.LOCAL) .role(Role.MANAGER) .build(); diff --git a/src/main/java/com/example/gtable/user/entity/SocialType.java b/src/main/java/com/example/gtable/user/entity/SocialType.java index 90e5fad..07fa298 100644 --- a/src/main/java/com/example/gtable/user/entity/SocialType.java +++ b/src/main/java/com/example/gtable/user/entity/SocialType.java @@ -1,5 +1,5 @@ package com.example.gtable.user.entity; public enum SocialType { - KAKAO, NAVER, GOOGLE + KAKAO,LOCAL } diff --git a/src/main/java/com/example/gtable/user/exception/MissingUserInfoException.java b/src/main/java/com/example/gtable/user/exception/MissingUserInfoException.java new file mode 100644 index 0000000..365242b --- /dev/null +++ b/src/main/java/com/example/gtable/user/exception/MissingUserInfoException.java @@ -0,0 +1,9 @@ +package com.example.gtable.user.exception; + +import com.example.gtable.global.exception.ErrorMessage; + +public class MissingUserInfoException extends RuntimeException { + public MissingUserInfoException() { + super(ErrorMessage.MISSING_USER.getMessage()); + } +} From f2286f9bfeb8e63a2d1f6783bd676fcdfe91f50c Mon Sep 17 00:00:00 2001 From: jeonghyemin Date: Tue, 24 Jun 2025 14:44:22 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor(global,reservation):=20=20?= =?UTF-8?q?=EC=98=88=EC=95=BDcrud=EC=83=9D=EC=84=B1=20=EB=B0=8F=20global?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=84=B0=EB=A6=AC=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 예외처리 중복 코드 수정 - reservation 엔티티 내 partysize 추가 --- .../gtable/global/exception/GlobalExceptionHandler.java | 6 +++--- .../gtable/global/security/exception/BusinessException.java | 2 +- .../security/exception/RefreshTokenNotFoundException.java | 2 +- .../security/exception/ResourceNotFoundException.java | 2 +- .../global/security/exception/TokenBadRequestException.java | 2 +- .../reservation/dto/ReservationCreateResponseDto.java | 1 + .../com/example/gtable/reservation/entity/Reservation.java | 2 +- .../gtable/reservation/service/ReservationService.java | 1 + 8 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/gtable/global/exception/GlobalExceptionHandler.java b/src/main/java/com/example/gtable/global/exception/GlobalExceptionHandler.java index 214e32a..4ec1d48 100644 --- a/src/main/java/com/example/gtable/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/example/gtable/global/exception/GlobalExceptionHandler.java @@ -114,10 +114,10 @@ public ErrorResponse bookmarkOwnerMismatchException(BookmarkOwnerMismatchExcepti } @ResponseStatus(value = NOT_FOUND) - @ExceptionHandler(IllegalStateException.class) + @ExceptionHandler(MissingUserInfoException.class) public ErrorResponse missingUserInfoException(MissingUserInfoException e) { - log.error("missingUserInform", e); - return new ErrorResponse(e.getMessage(), NOT_OWN_BOOKMARK.getCode()); + log.error("missingUserInfoException", e); + return new ErrorResponse(e.getMessage(), MISSING_USER.getCode()); } diff --git a/src/main/java/com/example/gtable/global/security/exception/BusinessException.java b/src/main/java/com/example/gtable/global/security/exception/BusinessException.java index c0338ad..d0b4076 100644 --- a/src/main/java/com/example/gtable/global/security/exception/BusinessException.java +++ b/src/main/java/com/example/gtable/global/security/exception/BusinessException.java @@ -5,7 +5,7 @@ public abstract class BusinessException extends RuntimeException { private final ErrorMessage errorMessage; - protected BusinessException(ErrorMessage errorMessage) { + protected BusinessException(String errorMessage) { super(errorMessage.getMessage()); this.errorMessage = errorMessage; } diff --git a/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java b/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java index c06c053..7d30dde 100644 --- a/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java +++ b/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java @@ -5,7 +5,7 @@ public class RefreshTokenNotFoundException extends ResourceNotFoundException { public RefreshTokenNotFoundException() { - super(ErrorMessage.REFRESH_TOKEN_NOT_FOUND); + super(ErrorMessage.REFRESH_TOKEN_NOT_FOUND.getMessage()); } } diff --git a/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java b/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java index 4717bd9..fb6c345 100644 --- a/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java +++ b/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java @@ -5,7 +5,7 @@ public abstract class ResourceNotFoundException extends RuntimeException { private final ErrorMessage errorMessage; - protected ResourceNotFoundException(ErrorMessage errorMessage) { + protected ResourceNotFoundException(String errorMessage) { super(errorMessage.getMessage()); this.errorMessage = errorMessage; } diff --git a/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java b/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java index 3ae820f..68b4907 100644 --- a/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java +++ b/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java @@ -4,7 +4,7 @@ public class TokenBadRequestException extends BusinessException { public TokenBadRequestException() { - super(ErrorMessage.DOES_NOT_MATCH_REFRESH_TOKEN); + super(ErrorMessage.DOES_NOT_MATCH_REFRESH_TOKEN.getMessage()); } } diff --git a/src/main/java/com/example/gtable/reservation/dto/ReservationCreateResponseDto.java b/src/main/java/com/example/gtable/reservation/dto/ReservationCreateResponseDto.java index 7f3515b..543e8ce 100644 --- a/src/main/java/com/example/gtable/reservation/dto/ReservationCreateResponseDto.java +++ b/src/main/java/com/example/gtable/reservation/dto/ReservationCreateResponseDto.java @@ -12,4 +12,5 @@ public class ReservationCreateResponseDto { private Long userId; private LocalDateTime requestedAt; private String status; + private Integer partySize; } diff --git a/src/main/java/com/example/gtable/reservation/entity/Reservation.java b/src/main/java/com/example/gtable/reservation/entity/Reservation.java index a2c8e82..c5b36cb 100644 --- a/src/main/java/com/example/gtable/reservation/entity/Reservation.java +++ b/src/main/java/com/example/gtable/reservation/entity/Reservation.java @@ -33,7 +33,7 @@ public class Reservation { @Column(nullable = false) private ReservationStatus status; - @Column(name = "partysize", nullable = false) + @Column(name = "party_size", nullable = false) private Integer partySize; } diff --git a/src/main/java/com/example/gtable/reservation/service/ReservationService.java b/src/main/java/com/example/gtable/reservation/service/ReservationService.java index 6680036..6193b4d 100644 --- a/src/main/java/com/example/gtable/reservation/service/ReservationService.java +++ b/src/main/java/com/example/gtable/reservation/service/ReservationService.java @@ -51,6 +51,7 @@ public ReservationCreateResponseDto create(Long storeId, CustomOAuth2User custom .userId(saved.getUser().getId()) .requestedAt(saved.getRequestedAt()) .status(saved.getStatus().name()) + .partySize(saved.getPartySize()) .build(); } @Transactional(readOnly = true) From 26f1f89b10e6747305fe5cf2a600482ce99a0f8a Mon Sep 17 00:00:00 2001 From: jeonghyemin Date: Tue, 24 Jun 2025 14:49:04 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor(global,reservation):=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=EC=BD=94=EB=93=9C=20=EC=BB=B4=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 반환타입 불일치 에러 해결 --- .../gtable/global/security/exception/BusinessException.java | 2 +- .../security/exception/RefreshTokenNotFoundException.java | 2 +- .../global/security/exception/ResourceNotFoundException.java | 2 +- .../global/security/exception/TokenBadRequestException.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/gtable/global/security/exception/BusinessException.java b/src/main/java/com/example/gtable/global/security/exception/BusinessException.java index d0b4076..c0338ad 100644 --- a/src/main/java/com/example/gtable/global/security/exception/BusinessException.java +++ b/src/main/java/com/example/gtable/global/security/exception/BusinessException.java @@ -5,7 +5,7 @@ public abstract class BusinessException extends RuntimeException { private final ErrorMessage errorMessage; - protected BusinessException(String errorMessage) { + protected BusinessException(ErrorMessage errorMessage) { super(errorMessage.getMessage()); this.errorMessage = errorMessage; } diff --git a/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java b/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java index 7d30dde..7d3da5a 100644 --- a/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java +++ b/src/main/java/com/example/gtable/global/security/exception/RefreshTokenNotFoundException.java @@ -5,7 +5,7 @@ public class RefreshTokenNotFoundException extends ResourceNotFoundException { public RefreshTokenNotFoundException() { - super(ErrorMessage.REFRESH_TOKEN_NOT_FOUND.getMessage()); + super(ErrorMessage.valueOf(ErrorMessage.REFRESH_TOKEN_NOT_FOUND.getMessage())); } } diff --git a/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java b/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java index fb6c345..4717bd9 100644 --- a/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java +++ b/src/main/java/com/example/gtable/global/security/exception/ResourceNotFoundException.java @@ -5,7 +5,7 @@ public abstract class ResourceNotFoundException extends RuntimeException { private final ErrorMessage errorMessage; - protected ResourceNotFoundException(String errorMessage) { + protected ResourceNotFoundException(ErrorMessage errorMessage) { super(errorMessage.getMessage()); this.errorMessage = errorMessage; } diff --git a/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java b/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java index 68b4907..287bbfc 100644 --- a/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java +++ b/src/main/java/com/example/gtable/global/security/exception/TokenBadRequestException.java @@ -4,7 +4,7 @@ public class TokenBadRequestException extends BusinessException { public TokenBadRequestException() { - super(ErrorMessage.DOES_NOT_MATCH_REFRESH_TOKEN.getMessage()); + super(ErrorMessage.valueOf(ErrorMessage.DOES_NOT_MATCH_REFRESH_TOKEN.getMessage())); } }