diff --git a/api-user/src/main/java/com/example/apiuser/ApiUserApplication.java b/api-user/src/main/java/com/example/apiuser/ApiUserApplication.java deleted file mode 100644 index fcaf441e..00000000 --- a/api-user/src/main/java/com/example/apiuser/ApiUserApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.apiuser; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; - -@EnableJpaAuditing -@SpringBootApplication(scanBasePackages = { - "com.example.apiuser", - "com.nowait.auth" -}) -@EntityScan(basePackages = { - "com.example.menu.entity", // domain-menu - "com.example.domainstore.entity", // domain-store - "com.example.domaintoken.entity", - "com.nowaiting.user.entity", - "com.nowait.domainbookmark.entity", - "com.nowait.domainreservation.entity", - "com.nowait.domainorder.entity", - "com.nowait.domainorder.entity" -}) -@EnableJpaRepositories(basePackages = { - "com.example.menu.repository", - "com.nowaiting.user.repository", - "com.example.domainstore.repository", - "com.example.domaintoken.repository", - "com.nowait.domainbookmark.repository", - "com.nowait.domainorder.repository", - "com.nowait.domainreservation.repository" -}) -public class ApiUserApplication { - - public static void main(String[] args) { - SpringApplication.run(ApiUserApplication.class, args); - } - -} diff --git a/api-user/src/main/java/com/example/apiuser/bookmark/controller/BookmarkController.java b/api-user/src/main/java/com/example/apiuser/bookmark/controller/BookmarkController.java deleted file mode 100644 index 32c4132a..00000000 --- a/api-user/src/main/java/com/example/apiuser/bookmark/controller/BookmarkController.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.example.apiuser.bookmark.controller; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.example.apiuser.bookmark.dto.BookmarkCreateResponse; -import com.example.apiuser.bookmark.service.BookmarkService; -import com.nowait.auth.dto.CustomOAuth2User; -import com.nowaiting.common.api.ApiUtils; - -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; -@Tag(name = "Bookmark API", description = "북마크 API") -@RestController -@RequestMapping("/bookmarks") -@RequiredArgsConstructor -public class BookmarkController { - private final BookmarkService bookmarkService; - - @PostMapping("/{storeId}") - @Operation(summary = "북마크 생성", description = "특정 주점에 대한 북마크 생성") - @ApiResponse(responseCode = "201", description = "북마크 생성") - public ResponseEntity createBookmark(@PathVariable Long storeId,@AuthenticationPrincipal CustomOAuth2User customOAuth2User) { - BookmarkCreateResponse response = bookmarkService.createBookmark(storeId,customOAuth2User); - - return ResponseEntity - .status(HttpStatus.CREATED) - .body( - ApiUtils.success( - response - ) - ); - } - @GetMapping - @Operation(summary = "북마크 조회", description = "내가 북마크한 주점 조회") - @ApiResponse(responseCode = "200", description = "북마크 조회") - public ResponseEntity getAllBookmarks(@AuthenticationPrincipal CustomOAuth2User customOAuth2User) { - return ResponseEntity - .ok() - .body( - ApiUtils.success( - bookmarkService.getBookmarks(customOAuth2User) - ) - ); - } - @DeleteMapping("/{bookmarkId}") - @Operation(summary = "북마크 삭제", description = "특정 주점에 대한 북마크 삭제") - @ApiResponse(responseCode = "200", description = "북마크 삭제") - public ResponseEntity deleteBookmark(@PathVariable Long bookmarkId, @AuthenticationPrincipal CustomOAuth2User customOAuth2User) { - return ResponseEntity - .ok() - .body( - ApiUtils.success( - bookmarkService.deleteBookmark(bookmarkId,customOAuth2User) - ) - ); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/bookmark/dto/BookmarkCreateResponse.java b/api-user/src/main/java/com/example/apiuser/bookmark/dto/BookmarkCreateResponse.java deleted file mode 100644 index 5e4a8f65..00000000 --- a/api-user/src/main/java/com/example/apiuser/bookmark/dto/BookmarkCreateResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.apiuser.bookmark.dto; - -import com.nowait.domainbookmark.entity.Bookmark; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class BookmarkCreateResponse { - private Long bookmarkId; - private Long userId; - private Long storeId; - - public static BookmarkCreateResponse fromEntity(Bookmark bookmark) { - return BookmarkCreateResponse.builder() - .bookmarkId(bookmark.getId()) - .userId(bookmark.getUser().getId()) - .storeId(bookmark.getStore().getStoreId()) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/bookmark/dto/BookmarkGetResponse.java b/api-user/src/main/java/com/example/apiuser/bookmark/dto/BookmarkGetResponse.java deleted file mode 100644 index 6f05db8e..00000000 --- a/api-user/src/main/java/com/example/apiuser/bookmark/dto/BookmarkGetResponse.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.example.apiuser.bookmark.dto; - -import com.nowait.domainbookmark.entity.Bookmark; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class BookmarkGetResponse { - private Long bookmarkId; - private Long userId; - private Long storeId; - - public static BookmarkGetResponse fromEntity(Bookmark bookmark) { - return BookmarkGetResponse.builder() - .bookmarkId(bookmark.getId()) - .userId(bookmark.getUser().getId()) - .storeId(bookmark.getStore().getStoreId()) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/bookmark/service/BookmarkService.java b/api-user/src/main/java/com/example/apiuser/bookmark/service/BookmarkService.java deleted file mode 100644 index 91ce0ff8..00000000 --- a/api-user/src/main/java/com/example/apiuser/bookmark/service/BookmarkService.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.example.apiuser.bookmark.service; - -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.example.apiuser.bookmark.dto.BookmarkCreateResponse; -import com.example.apiuser.bookmark.dto.BookmarkGetResponse; -import com.example.domainstore.entity.Store; -import com.example.domainstore.repository.StoreRepository; -import com.nowait.auth.dto.CustomOAuth2User; -import com.nowait.domainbookmark.entity.Bookmark; -import com.nowait.domainbookmark.repository.BookmarkRepository; -import com.nowaiting.user.entity.User; -import com.nowaiting.user.repository.UserRepository; - -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class BookmarkService { - private final BookmarkRepository bookmarkRepository; - private final StoreRepository storeRepository; - private final UserRepository userRepository; - @Transactional - public BookmarkCreateResponse createBookmark(Long storeId, CustomOAuth2User customOAuth2User) { - parameterValidation(storeId, customOAuth2User); - Store store = storeRepository.findById(storeId) - .orElseThrow(() -> new EntityNotFoundException(storeId + " store not found.")); - User user = userRepository.findById(customOAuth2User.getUserId()) - .orElseThrow(() -> new EntityNotFoundException("User not found")); - - if (bookmarkRepository.existsByUserAndStore(user, store)) { - throw new IllegalArgumentException("already bookmarked"); - } - - Bookmark bookmark = Bookmark.builder() - .store(store) - .user(user) - .build(); - - return BookmarkCreateResponse.fromEntity(bookmarkRepository.save(bookmark)); - } - - @Transactional(readOnly = true) - public List getBookmarks(CustomOAuth2User customOAuth2User) { - User user = userRepository.findById(customOAuth2User.getUserId()) - .orElseThrow(() -> new EntityNotFoundException("User not found")); - return bookmarkRepository.findAllByUser(user) - .stream() - .map(BookmarkGetResponse::fromEntity) - .toList(); - } - - @Transactional - public String deleteBookmark(Long bookmarkId, CustomOAuth2User customOAuth2User) { - parameterValidation(bookmarkId, 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"); - } - bookmarkRepository.delete(bookmark); - return "Bookmark ID " + bookmarkId + " deleted."; - } - - private static void parameterValidation(Long storeId, CustomOAuth2User customOAuth2User) { - // 파라미터 유효성 검사 - if (storeId == null || storeId < 0) { - throw new IllegalArgumentException("storeId must be a positive number"); - } - if (customOAuth2User == null || customOAuth2User.getUserId() == null) { - throw new IllegalArgumentException("UserInfo is required"); - } - } -} diff --git a/api-user/src/main/java/com/example/apiuser/exception/GlobalExceptionHandler.java b/api-user/src/main/java/com/example/apiuser/exception/GlobalExceptionHandler.java deleted file mode 100644 index fedb029f..00000000 --- a/api-user/src/main/java/com/example/apiuser/exception/GlobalExceptionHandler.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.example.apiuser.exception; - -import static com.nowaiting.common.exception.ErrorMessage.*; -import static org.springframework.http.HttpStatus.*; -import static org.springframework.http.HttpStatus.UNAUTHORIZED; - -import java.util.Map; -import java.util.stream.Collectors; - -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.security.oauth2.core.OAuth2AuthenticationException; -import org.springframework.validation.FieldError; -import org.springframework.validation.ObjectError; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.MissingRequestValueException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.multipart.MultipartException; - -import com.example.apiuser.reservation.exception.ReservationNotFoundException; -import com.nowait.domainbookmark.exception.BookmarkOwnerMismatchException; -import com.nowait.domainbookmark.exception.DuplicateBookmarkException; -import com.nowait.domainorder.exception.DuplicateOrderException; -import com.nowait.domainorder.exception.OrderItemsEmptyException; -import com.nowait.domainorder.exception.OrderParameterEmptyException; -import com.nowait.exception.BusinessException; -import com.nowait.exception.ResourceNotFoundException; -import com.nowait.exception.UnauthorizedException; -import com.nowaiting.common.exception.ErrorMessage; -import com.nowaiting.common.exception.ErrorResponse; -import com.nowaiting.user.exception.UserNotFoundException; - -import io.swagger.v3.oas.annotations.Hidden; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -@Hidden -@RestControllerAdvice -public class GlobalExceptionHandler { - - // OAUTH 인증 실패 에러처리 메서드 - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(OAuth2AuthenticationException.class) - public ErrorResponse handlerOAuth2AuthenticationException(OAuth2AuthenticationException e) { - log.error("handleOAuth2AuthenticationException", e); - - return new ErrorResponse("OAuth 인증 실패 : " + e.getMessage(), INVALID_INPUT_VALUE.getCode()); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(BusinessException.class) - public ErrorResponse handleBusinessException(BusinessException e) { - log.error("handleBusinessException", e); - return new ErrorResponse(e.getMessage(), e.getCode()); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(MethodArgumentNotValidException.class) - public ErrorResponse handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - log.error("handleMethodArgumentNotValidException", e); - Map errors = getErrors(e); - return new ErrorResponse(INVALID_INPUT_VALUE.getMessage(), INVALID_INPUT_VALUE.getCode(), errors); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(HttpMessageNotReadableException.class) - public ErrorResponse handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - log.error("handleHttpMessageNotReadableException", e); - return new ErrorResponse(INVALID_INPUT_VALUE.getMessage(), INVALID_INPUT_VALUE.getCode()); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(IllegalArgumentException.class) - public ErrorResponse handleIllegalArgumentException(IllegalArgumentException e) { - log.error("handleIllegalArgumentException", e); - return new ErrorResponse(e.getMessage(), INVALID_INPUT_VALUE.getCode()); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(MissingRequestValueException.class) - public ErrorResponse handleMissingRequestValueException(MissingRequestValueException e) { - log.error("handleMissingRequestValueExceptionException", e); - return new ErrorResponse(INVALID_INPUT_VALUE.getMessage(), INVALID_INPUT_VALUE.getCode()); - } - - @ResponseStatus(value = UNAUTHORIZED) - @ExceptionHandler(UnauthorizedException.class) - public ErrorResponse handleUnauthorizedException(UnauthorizedException e) { - log.error("handleUnauthorizedExceptionException", e); - return new ErrorResponse(e.getMessage(), e.getCode()); - } - - @ResponseStatus(value = NOT_FOUND) - @ExceptionHandler(ResourceNotFoundException.class) - public ErrorResponse handleResourceNotFoundException(ResourceNotFoundException e) { - log.error("handleResourceNotFoundExceptionException", e); - return new ErrorResponse(e.getMessage(), e.getCode()); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(MultipartException.class) - public ErrorResponse handleMultipartException(MultipartException e) { - log.error("handleMultipartException", 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 = FORBIDDEN) - @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(UserNotFoundException.class) - public ErrorResponse userNotFoundException(UserNotFoundException e) { - log.error("userNotFoundException", e); - return new ErrorResponse(e.getMessage(), NOTFOUND_USER.getCode()); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(OrderParameterEmptyException.class) - public ErrorResponse orderParameterEmptyException(OrderParameterEmptyException e) { - log.error("orderParameterEmptyException", e); - return new ErrorResponse(e.getMessage(), ORDER_PARAMETER_EMPTY.getCode()); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(OrderItemsEmptyException.class) - public ErrorResponse orderItemsEmptyException(OrderItemsEmptyException e) { - log.error("orderItemsEmptyException", e); - return new ErrorResponse(e.getMessage(), ORDER_ITEMS_EMPTY.getCode()); - } - - @ResponseStatus(value = BAD_REQUEST) - @ExceptionHandler(DuplicateOrderException.class) - public ErrorResponse duplicateOrderException(DuplicateOrderException e) { - log.error("duplicateOrderException", e); - return new ErrorResponse(e.getMessage(), ErrorMessage.DUPLICATE_ORDER.getCode()); - } - - @ResponseStatus(value = NOT_FOUND) - @ExceptionHandler(ReservationNotFoundException.class) - public ErrorResponse reservationNotFoundException(ReservationNotFoundException e) { - log.error("reservationNotFoundException", e); - return new ErrorResponse(e.getMessage(), NOTFOUND_RESERVATION.getCode()); - } - - - private static Map getErrors(MethodArgumentNotValidException e) { - return e.getBindingResult() - .getAllErrors() - .stream() - .filter(ObjectError.class::isInstance) - .collect(Collectors.toMap( - error -> error instanceof FieldError ? ((FieldError)error).getField() : error.getObjectName(), - ObjectError::getDefaultMessage, - (msg1, msg2) -> msg1 + ";" + msg2 - )); - } - -} diff --git a/api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java b/api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java deleted file mode 100644 index d3fb6d02..00000000 --- a/api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.apiuser.menu.controller; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -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 com.example.apiuser.menu.service.MenuService; -import com.nowaiting.common.api.ApiUtils; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("/v1/menus") -@RequiredArgsConstructor -public class MenuController { - - private final MenuService menuService; - - @GetMapping("/all-menus/stores/{storeId}") - public ResponseEntity getMenusByStoreId(@PathVariable Long storeId) { - return ResponseEntity - .status(HttpStatus.OK) - .body( - ApiUtils.success( - menuService.getMenusByStoreId(storeId) - ) - ); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/menu/dto/MenuImageUploadResponse.java b/api-user/src/main/java/com/example/apiuser/menu/dto/MenuImageUploadResponse.java deleted file mode 100644 index c32be356..00000000 --- a/api-user/src/main/java/com/example/apiuser/menu/dto/MenuImageUploadResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.example.apiuser.menu.dto; - -import com.example.menu.entity.MenuImage; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class MenuImageUploadResponse { - private final Long id; - private final String imageUrl; - - public static MenuImageUploadResponse fromEntity(MenuImage menuImage) { - return MenuImageUploadResponse.builder() - .id(menuImage.getId()) - .imageUrl(menuImage.getImageUrl()) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java b/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java deleted file mode 100644 index 98dda1f2..00000000 --- a/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.apiuser.menu.dto; - -import java.util.List; - -import com.example.menu.entity.Menu; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class MenuReadDto { - private Long menuId; - private Long storeId; - private String name; - private String description; - private Integer price; - private List images; - - public static MenuReadDto fromEntity(Menu menu, List images) { - return MenuReadDto.builder() - .menuId(menu.getId()) - .storeId(menu.getStoreId()) - .name(menu.getName()) - .description(menu.getDescription()) - .price(menu.getPrice()) - .images(images) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadResponse.java b/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadResponse.java deleted file mode 100644 index 755b243f..00000000 --- a/api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.example.apiuser.menu.dto; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class MenuReadResponse { - - private List menuReadDto; - - public static MenuReadResponse of(List menuReadDto) { - return MenuReadResponse.builder() - .menuReadDto(menuReadDto) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java b/api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java deleted file mode 100644 index 64b9e0b9..00000000 --- a/api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.example.apiuser.menu.service; - -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.example.apiuser.menu.dto.MenuImageUploadResponse; -import com.example.apiuser.menu.dto.MenuReadDto; -import com.example.apiuser.menu.dto.MenuReadResponse; -import com.example.menu.entity.Menu; -import com.example.menu.entity.MenuImage; -import com.example.menu.repository.MenuImageRepository; -import com.example.menu.repository.MenuRepository; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class MenuService { - - private final MenuRepository menuRepository; - private final MenuImageRepository menuImageRepository; - - - @Transactional(readOnly = true) - public MenuReadResponse getMenusByStoreId(Long storeId) { - List menus = menuRepository.findAllByStoreId(storeId); - - List menuReadResponse = menus.stream() - .map(menu -> { - List images = menuImageRepository.findByMenu(menu); - List imageDto = images.stream() - .map(MenuImageUploadResponse::fromEntity) - .toList(); - return MenuReadDto.fromEntity(menu, imageDto); - }) - .toList(); - - return MenuReadResponse.of(menuReadResponse); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/order/controller/OrderController.java b/api-user/src/main/java/com/example/apiuser/order/controller/OrderController.java deleted file mode 100644 index 65238120..00000000 --- a/api-user/src/main/java/com/example/apiuser/order/controller/OrderController.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.example.apiuser.order.controller; - -import java.util.List; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.example.apiuser.order.dto.OrderCreateRequestDto; -import com.example.apiuser.order.dto.OrderCreateResponseDto; -import com.example.apiuser.order.dto.OrderItemListGetResponseDto; -import com.example.apiuser.order.service.OrderService; -import com.nowaiting.common.api.ApiUtils; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.servlet.http.HttpSession; -import jakarta.validation.Valid; -import lombok.RequiredArgsConstructor; - -@Tag(name = "Order API", description = "주문 API") -@RestController -@RequestMapping("/orders") -@RequiredArgsConstructor -public class OrderController { - private final OrderService orderService; - - @PostMapping("/create/{storeId}/{tableId}") - @Operation(summary = "주문 생성", description = "특정 주점 - 특정 테이블에 대한 주문 생성") - @ApiResponse(responseCode = "201", description = "주문 생성") - public ResponseEntity createOrder( - @PathVariable Long storeId, - @PathVariable Long tableId, - @RequestBody @Valid OrderCreateRequestDto orderCreateRequestDto, - HttpSession session - ) { - String sessionId = session.getId(); - OrderCreateResponseDto response = orderService.createOrder(storeId,tableId,orderCreateRequestDto,sessionId); - return ResponseEntity - .status(HttpStatus.CREATED) - .body( - ApiUtils.success(response) - ); - } - - @GetMapping("/items/{storeId}/{tableId}") - @Operation(summary = "테이블별 주문 아이템 조회", description = "비로그인(세션) 기준으로 테이블의 내 주문 목록만 조회") - @ApiResponse(responseCode = "200", description = "주문 조회") - public ResponseEntity getOrderItems( - @PathVariable Long storeId, - @PathVariable Long tableId, - HttpSession session - ) { - // 세션ID 추출 (Spring이 세션 자동 관리) - String sessionId = session.getId(); - - List orderItems = orderService.getOrderItems(storeId, tableId, sessionId); - return ResponseEntity. - status(HttpStatus.OK) - .body( - ApiUtils.success(orderItems) - ); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/order/dto/CartItemDto.java b/api-user/src/main/java/com/example/apiuser/order/dto/CartItemDto.java deleted file mode 100644 index 1b8fc52b..00000000 --- a/api-user/src/main/java/com/example/apiuser/order/dto/CartItemDto.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.example.apiuser.order.dto; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class CartItemDto { - private final Long menuId; // 메뉴 ID - private final int quantity; // 수량 -} diff --git a/api-user/src/main/java/com/example/apiuser/order/dto/OrderCreateRequestDto.java b/api-user/src/main/java/com/example/apiuser/order/dto/OrderCreateRequestDto.java deleted file mode 100644 index 056d44a6..00000000 --- a/api-user/src/main/java/com/example/apiuser/order/dto/OrderCreateRequestDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.example.apiuser.order.dto; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class OrderCreateRequestDto { - private final List items; // 장바구니 항목 리스트 - -} diff --git a/api-user/src/main/java/com/example/apiuser/order/dto/OrderCreateResponseDto.java b/api-user/src/main/java/com/example/apiuser/order/dto/OrderCreateResponseDto.java deleted file mode 100644 index 1293ac0f..00000000 --- a/api-user/src/main/java/com/example/apiuser/order/dto/OrderCreateResponseDto.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.apiuser.order.dto; - -import java.util.List; - -import com.nowait.domainorder.entity.UserOrder; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class OrderCreateResponseDto { - private Long orderId; // 주문 ID // 주문 상태 (예: "주문완료", "배송중" 등) - private Long storeId; // 상점 ID - private String storeName; // 상점 이름 - private List orderItems; // 주문 항목 목록 - - public static OrderCreateResponseDto fromEntity(UserOrder order) { - return OrderCreateResponseDto.builder() - .orderId(order.getId()) - .storeId(order.getStore().getStoreId()) - .storeName(order.getStore().getName()) - .orderItems(List.of()) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/order/dto/OrderItemListGetResponseDto.java b/api-user/src/main/java/com/example/apiuser/order/dto/OrderItemListGetResponseDto.java deleted file mode 100644 index 02e24e3f..00000000 --- a/api-user/src/main/java/com/example/apiuser/order/dto/OrderItemListGetResponseDto.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.apiuser.order.dto; - -import com.nowait.domainorder.entity.OrderItem; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class OrderItemListGetResponseDto { - private Long orderId; - private String menuName; - private Integer quantity; - private Integer price; - - public static OrderItemListGetResponseDto fromEntity(OrderItem orderItem) { - return OrderItemListGetResponseDto.builder() - .orderId(orderItem.getUserOrder().getId()) - .menuName(orderItem.getMenu().getName()) - .quantity(orderItem.getQuantity()) - .price(orderItem.getMenu().getPrice()) - .build(); - - } -} diff --git a/api-user/src/main/java/com/example/apiuser/order/dto/OrderItemResponseDTO.java b/api-user/src/main/java/com/example/apiuser/order/dto/OrderItemResponseDTO.java deleted file mode 100644 index 12f04514..00000000 --- a/api-user/src/main/java/com/example/apiuser/order/dto/OrderItemResponseDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.apiuser.order.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class OrderItemResponseDTO { - private Long menuId; // 메뉴 ID - private String menuName; // 메뉴 이름 - private int quantity; // 수량 -} diff --git a/api-user/src/main/java/com/example/apiuser/order/service/OrderService.java b/api-user/src/main/java/com/example/apiuser/order/service/OrderService.java deleted file mode 100644 index 1644ba16..00000000 --- a/api-user/src/main/java/com/example/apiuser/order/service/OrderService.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.example.apiuser.order.service; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.DigestUtils; - -import com.example.apiuser.order.dto.CartItemDto; -import com.example.apiuser.order.dto.OrderCreateRequestDto; -import com.example.apiuser.order.dto.OrderCreateResponseDto; -import com.example.apiuser.order.dto.OrderItemListGetResponseDto; -import com.example.domainstore.entity.Store; -import com.example.domainstore.repository.StoreRepository; -import com.example.menu.entity.Menu; -import com.example.menu.repository.MenuRepository; -import com.nowait.domainorder.entity.OrderItem; -import com.nowait.domainorder.entity.UserOrder; -import com.nowait.domainorder.exception.DuplicateOrderException; -import com.nowait.domainorder.exception.OrderItemsEmptyException; -import com.nowait.domainorder.exception.OrderParameterEmptyException; -import com.nowait.domainorder.repository.OrderItemRepository; -import com.nowait.domainorder.repository.OrderRepository; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class OrderService { - private final OrderRepository orderRepository; - private final StoreRepository storeRepository; - private final MenuRepository menuRepository; - private final OrderItemRepository orderItemRepository; - @Transactional - public OrderCreateResponseDto createOrder(Long storeId, Long tableId, - OrderCreateRequestDto orderCreateRequestDto, String sessionId) { - parameterValidation(storeId, tableId, orderCreateRequestDto); - - // 💡 [중복 주문 방지] signature 생성 및 체크 - String signature = generateOrderSignature(storeId, tableId, orderCreateRequestDto.getItems()); - checkDuplicateOrderSignature(signature); - - // 1. Store 조회 - Store store = storeRepository.findById(storeId) - .orElseThrow(() -> new IllegalArgumentException("store not found")); - - // 2. UserOrder 생성 및 signature 저장 - UserOrder order = UserOrder.builder() - .tableId(tableId) - .store(store) - .signature(signature) // signature 저장 - .sessionId(sessionId) // sessionId 저장 - .build(); - UserOrder savedOrder = orderRepository.save(order); - - // 3. 메뉴 ID 리스트 수집 -> Map으로 캐싱 - List menuIds = orderCreateRequestDto.getItems().stream() - .map(CartItemDto::getMenuId) - .toList(); - - List menus = menuRepository.findAllById(menuIds); - Map menuMap = menus.stream() - .collect(Collectors.toMap(Menu::getId, Function.identity())); - - // 4. 각 장바구니 항목에 대해 OrderItem 생성 및 저장 - List orderItems = orderCreateRequestDto.getItems().stream() - .map(item -> { - Menu menu = Optional.ofNullable(menuMap.get(item.getMenuId())) - .orElseThrow(() -> new IllegalArgumentException("menu not found: " + item.getMenuId())); - return OrderItem.builder() - .userOrder(savedOrder) - .menu(menu) - .quantity(item.getQuantity()) - .build(); - }) - .collect(Collectors.toList()); - - - orderItemRepository.saveAll(orderItems); - - // 5. 응답 반환 - return OrderCreateResponseDto.fromEntity(savedOrder); - } - - @Transactional(readOnly = true) - public List getOrderItems(Long storeId, Long tableId, String sessionId) { - // 1. UserOrder 목록 조회 (storeId, tableId, sessionId 기준) - List userOrders = orderRepository.findByStore_StoreIdAndTableIdAndSessionId(storeId, tableId, sessionId); - - // 2. OrderItem으로 변환 - return userOrders.stream() - .flatMap(order -> order.getOrderItems().stream()) - .map(OrderItemListGetResponseDto::fromEntity) - .toList(); - } - - - private static void parameterValidation(Long storeId, Long tableId, OrderCreateRequestDto orderCreateRequestDto) { - if (storeId == null || tableId == null || orderCreateRequestDto == null) { - throw new OrderParameterEmptyException(); - } - if (orderCreateRequestDto.getItems() == null || orderCreateRequestDto.getItems().isEmpty()) { - throw new OrderItemsEmptyException(); - } - } - private String generateOrderSignature(Long storeId, Long tableId, List items) { - String cartString = items.stream() - .sorted((a, b) -> a.getMenuId().compareTo(b.getMenuId())) // 메뉴 ID 기준 정렬 - .map(item -> item.getMenuId() + ":" + item.getQuantity()) - .collect(Collectors.joining(",")); - String raw = storeId + "-" + tableId + "-" + cartString; - return DigestUtils.md5DigestAsHex(raw.getBytes()); - } - - private void checkDuplicateOrderSignature(String signature) { - // 최근 2초 이내 동일 signature 주문이 있는지 검사 - LocalDateTime threshold = LocalDateTime.now().minusSeconds(2); - boolean exists = orderRepository.existsBySignatureAndCreatedAtAfter(signature, threshold); - if (exists) { - throw new DuplicateOrderException(); - } - } -} diff --git a/api-user/src/main/java/com/example/apiuser/reservation/controller/ReservationController.java b/api-user/src/main/java/com/example/apiuser/reservation/controller/ReservationController.java deleted file mode 100644 index 75416513..00000000 --- a/api-user/src/main/java/com/example/apiuser/reservation/controller/ReservationController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.example.apiuser.reservation.controller; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.example.apiuser.reservation.dto.ReservationCreateRequestDto; -import com.example.apiuser.reservation.dto.ReservationCreateResponseDto; -import com.example.apiuser.reservation.service.ReservationService; -import com.nowait.auth.dto.CustomOAuth2User; -import com.nowaiting.common.api.ApiUtils; - -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; - -@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 - ) - ); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/reservation/dto/ReservationCreateRequestDto.java b/api-user/src/main/java/com/example/apiuser/reservation/dto/ReservationCreateRequestDto.java deleted file mode 100644 index 03fbfb4f..00000000 --- a/api-user/src/main/java/com/example/apiuser/reservation/dto/ReservationCreateRequestDto.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.example.apiuser.reservation.dto; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class ReservationCreateRequestDto { - private Integer partySize; -} diff --git a/api-user/src/main/java/com/example/apiuser/reservation/dto/ReservationCreateResponseDto.java b/api-user/src/main/java/com/example/apiuser/reservation/dto/ReservationCreateResponseDto.java deleted file mode 100644 index fa581589..00000000 --- a/api-user/src/main/java/com/example/apiuser/reservation/dto/ReservationCreateResponseDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.example.apiuser.reservation.dto; - -import java.time.LocalDateTime; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class ReservationCreateResponseDto { - private Long id; - private Long storeId; - private Long userId; - private LocalDateTime requestedAt; - private String status; - private Integer partySize; -} diff --git a/api-user/src/main/java/com/example/apiuser/reservation/exception/ReservationNotFoundException.java b/api-user/src/main/java/com/example/apiuser/reservation/exception/ReservationNotFoundException.java deleted file mode 100644 index 37dc86eb..00000000 --- a/api-user/src/main/java/com/example/apiuser/reservation/exception/ReservationNotFoundException.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.apiuser.reservation.exception; - -import com.nowaiting.common.exception.ErrorMessage; - -public class ReservationNotFoundException extends RuntimeException { - public ReservationNotFoundException() { - super(ErrorMessage.NOTFOUND_RESERVATION.getMessage()); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/reservation/service/ReservationService.java b/api-user/src/main/java/com/example/apiuser/reservation/service/ReservationService.java deleted file mode 100644 index a5394ec8..00000000 --- a/api-user/src/main/java/com/example/apiuser/reservation/service/ReservationService.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.example.apiuser.reservation.service; - -import java.time.LocalDateTime; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.example.apiuser.reservation.dto.ReservationCreateRequestDto; -import com.example.apiuser.reservation.dto.ReservationCreateResponseDto; -import com.example.domainstore.entity.Store; -import com.example.domainstore.repository.StoreRepository; -import com.nowait.auth.dto.CustomOAuth2User; -import com.nowait.domainreservation.entity.Reservation; -import com.nowait.domainreservation.repository.ReservationRepository; -import com.nowaiting.common.enums.ReservationStatus; -import com.nowaiting.user.entity.User; -import com.nowaiting.user.exception.UserNotFoundException; -import com.nowaiting.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(UserNotFoundException::new); - - Reservation reservation = Reservation.builder() - .store(store) - .user(user) - .requestedAt(LocalDateTime.now()) - .status(ReservationStatus.WAITING) - .partySize(requestDto.getPartySize()) - .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()) - .partySize(saved.getPartySize()) - .build(); - } -} - diff --git a/api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java b/api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java deleted file mode 100644 index 510b19d7..00000000 --- a/api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.example.apiuser.store.controller; - -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -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.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.example.apiuser.store.service.StoreService; -import com.nowaiting.common.api.ApiUtils; - -import lombok.RequiredArgsConstructor; - -@RestController -@RequestMapping("v1/stores") -@RequiredArgsConstructor -public class StoreController { - - private final StoreService storeService; - - - @GetMapping("/all-stores") - public ResponseEntity getAllStores() { - return ResponseEntity - .status(HttpStatus.OK) - .body( - ApiUtils.success( - storeService.getAllStores() - ) - ); - } - - @GetMapping("/{storeId}") - public ResponseEntity getStoreById(@PathVariable Long storeId) { - return ResponseEntity - .status(HttpStatus.OK) - .body( - ApiUtils.success( - storeService.getStoreByStoreId(storeId) - ) - ); - } - - @GetMapping("/search") - public ResponseEntity searchStores(@RequestParam("name") String name) { - return ResponseEntity - .ok() - .body( - ApiUtils.success( - storeService.searchStoresByName(name) - ) - ); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java b/api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java deleted file mode 100644 index 40cb984d..00000000 --- a/api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.example.apiuser.store.dto; - -import com.example.domainstore.entity.StoreImage; - -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class StoreImageUploadResponse { - private final Long id; - private final String imageUrl; - private final String type; - - public static StoreImageUploadResponse fromEntity(StoreImage storeImage) { - return StoreImageUploadResponse.builder() - .id(storeImage.getId()) - .imageUrl(storeImage.getImageUrl()) - .type(storeImage.getType()) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/store/dto/StoreReadDto.java b/api-user/src/main/java/com/example/apiuser/store/dto/StoreReadDto.java deleted file mode 100644 index d6cfab6e..00000000 --- a/api-user/src/main/java/com/example/apiuser/store/dto/StoreReadDto.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.apiuser.store.dto; - -import java.time.LocalDateTime; -import java.util.List; - -import com.example.domainstore.entity.Store; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class StoreReadDto { - private Long storeId; - private Long departmentId; - private String name; - private String location; - private String description; - private List images; - private Boolean isActive; - private Boolean deleted; - private LocalDateTime createdAt; - - public static StoreReadDto fromEntity(Store store, List images) { - return StoreReadDto.builder() - .createdAt(store.getCreatedAt()) - .storeId(store.getStoreId()) - .departmentId(store.getDepartmentId()) - .name(store.getName()) - .location(store.getLocation()) - .description(store.getDescription()) - .isActive(store.getIsActive()) - .deleted(store.getDeleted()) - .images(images) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/store/dto/StoreReadResponse.java b/api-user/src/main/java/com/example/apiuser/store/dto/StoreReadResponse.java deleted file mode 100644 index a580e562..00000000 --- a/api-user/src/main/java/com/example/apiuser/store/dto/StoreReadResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.apiuser.store.dto; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@AllArgsConstructor -@Builder -public class StoreReadResponse { - - private List storeReadDtos; - private boolean hasNext; - - public static StoreReadResponse of(List storeReadDtos, boolean hasNext) { - return StoreReadResponse.builder() - .storeReadDtos(storeReadDtos) - .hasNext(hasNext) - .build(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/store/service/StoreService.java b/api-user/src/main/java/com/example/apiuser/store/service/StoreService.java deleted file mode 100644 index fd90de2a..00000000 --- a/api-user/src/main/java/com/example/apiuser/store/service/StoreService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.example.apiuser.store.service; - -import java.util.List; - -import com.example.apiuser.store.dto.StoreReadDto; -import com.example.apiuser.store.dto.StoreReadResponse; - -public interface StoreService { - - StoreReadResponse getAllStores(); - - StoreReadDto getStoreByStoreId(Long storeId); - - List searchStoresByName(String name); - -} diff --git a/api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java b/api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java deleted file mode 100644 index d641f03e..00000000 --- a/api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.example.apiuser.store.service; - -import java.util.List; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import com.example.apiuser.store.dto.StoreImageUploadResponse; -import com.example.apiuser.store.dto.StoreReadDto; -import com.example.apiuser.store.dto.StoreReadResponse; -import com.example.domainstore.entity.Store; -import com.example.domainstore.entity.StoreImage; -import com.example.domainstore.repository.StoreImageRepository; -import com.example.domainstore.repository.StoreRepository; - -import jakarta.persistence.EntityNotFoundException; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class StoreServiceImpl implements StoreService { - - private final StoreRepository storeRepository; - private final StoreImageRepository storeImageRepository; - - - @Override - @Transactional(readOnly = true) - public StoreReadResponse getAllStores() { - List stores = storeRepository.findAllByDeletedFalse(); - - List storeRead = stores.stream() - .map(store -> { - List images = storeImageRepository.findByStore(store); - List imageDto = images.stream() - .map(StoreImageUploadResponse::fromEntity) - .toList(); - return StoreReadDto.fromEntity(store, imageDto); - }) - .toList(); - - boolean hasNext = false; - - return StoreReadResponse.of(storeRead, hasNext); - } - - @Override - @Transactional(readOnly = true) - public StoreReadDto getStoreByStoreId(Long storeId) { - Store store = storeRepository.findByStoreIdAndDeletedFalse(storeId) - .orElseThrow(() -> new EntityNotFoundException(storeId + " store not found.")); - - List images = storeImageRepository.findByStore(store); - List imageDto = images.stream() - .map(StoreImageUploadResponse::fromEntity) - .toList(); - - return StoreReadDto.fromEntity(store, imageDto); - } - - @Override - public List searchStoresByName(String name) { - List stores = storeRepository.findByNameContainingIgnoreCaseAndDeletedFalse(name); - return stores.stream() - .map(store -> { - List images = storeImageRepository.findByStore(store); - List imageDto = images.stream() - .map(StoreImageUploadResponse::fromEntity) - .toList(); - return StoreReadDto.fromEntity(store, imageDto); - }) - .toList(); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/token/controller/TokenController.java b/api-user/src/main/java/com/example/apiuser/token/controller/TokenController.java deleted file mode 100644 index 67bafe53..00000000 --- a/api-user/src/main/java/com/example/apiuser/token/controller/TokenController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.example.apiuser.token.controller; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.example.apiuser.token.dto.AuthenticationResponse; -import com.example.apiuser.token.dto.RefreshTokenRequest; -import com.example.apiuser.token.service.TokenService; -import com.nowait.auth.jwt.JwtUtil; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/refresh-token") -@Slf4j -public class TokenController { - private final JwtUtil jwtUtil; - private final TokenService tokenService; - @Value("${jwt.access-token-expiration-ms}") - private long accessTokenExpiration; - @Value("${jwt.refresh-token-expiration-ms}") - private long refreshTokenExpiration; - @PostMapping - public ResponseEntity refreshToken(@RequestBody RefreshTokenRequest request){ - String refreshToken = request.getRefreshToken(); - - // 리프레시 토큰 검증 - Long userId = jwtUtil.getUserId(refreshToken); - String role = jwtUtil.getRole(refreshToken); - - long currentAccessTokenExpiration = accessTokenExpiration; - if (role.equals("SUPER_ADMIN")) { - currentAccessTokenExpiration = 7L * 24 * 60 * 60 * 1000L; // 7일 - } - - // 리프레시 토큰 유효성 검증 - if (tokenService.validateToken(refreshToken, userId)){ - // 유효한 토큰이라면, 새로운 accessToken, refreshToken 생성 - String newAccessToken = jwtUtil.createAccessToken("accessToken", userId, role, currentAccessTokenExpiration); - String newRefreshToken = jwtUtil.createRefreshToken("refreshToken", userId, refreshTokenExpiration); - - // DB에 새로운 refreshToken으로 교체 - tokenService.updateRefreshToken(userId, refreshToken, newRefreshToken); - - AuthenticationResponse authenticationResponse = new AuthenticationResponse(newAccessToken, refreshToken); - return ResponseEntity.ok().body(authenticationResponse); - - } - - return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid or expired refresh token"); - } -} diff --git a/api-user/src/main/java/com/example/apiuser/token/dto/AuthenticationResponse.java b/api-user/src/main/java/com/example/apiuser/token/dto/AuthenticationResponse.java deleted file mode 100644 index 71db8914..00000000 --- a/api-user/src/main/java/com/example/apiuser/token/dto/AuthenticationResponse.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.example.apiuser.token.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.ToString; - -@RequiredArgsConstructor -@Getter -@ToString(exclude = {"accessToken", "refreshToken"}) // 로깅 시 토큰 노출 방지 -public class AuthenticationResponse { - @JsonProperty("access_token") - private final String accessToken; - - @JsonProperty("refresh_token") - private final String refreshToken; -} diff --git a/api-user/src/main/java/com/example/apiuser/token/dto/RefreshTokenRequest.java b/api-user/src/main/java/com/example/apiuser/token/dto/RefreshTokenRequest.java deleted file mode 100644 index 4ab8ae75..00000000 --- a/api-user/src/main/java/com/example/apiuser/token/dto/RefreshTokenRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.apiuser.token.dto; - -import jakarta.validation.constraints.NotBlank; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -public class RefreshTokenRequest { - @NotBlank(message = "Refresh token은 필수입니다.") - private String refreshToken; -} diff --git a/api-user/src/main/java/com/example/apiuser/token/service/TokenService.java b/api-user/src/main/java/com/example/apiuser/token/service/TokenService.java deleted file mode 100644 index 56845238..00000000 --- a/api-user/src/main/java/com/example/apiuser/token/service/TokenService.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.example.apiuser.token.service; - -import java.time.LocalDateTime; -import java.util.Optional; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.example.domaintoken.entity.Token; -import com.example.domaintoken.repository.TokenRepository; -import com.nowait.auth.jwt.JwtUtil; -import com.nowait.exception.RefreshTokenNotFoundException; -import com.nowait.exception.TokenBadRequestException; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -@Service -@RequiredArgsConstructor -@Slf4j -public class TokenService { - private final TokenRepository tokenRepository; - private final JwtUtil jwtUtil; - - @Transactional - public Boolean validateToken(String token, Long userId){ - // DB에서 해당 userId와 일치하는 리프레시토큰을 찾는다. - Optional savedToken = tokenRepository.findByUserId(userId); - - // DB에서 userId에 대응되는 리프레시토큰 없으면, 유효하지 않음 - if (savedToken.isEmpty()){ - log.info("여기에 걸렸니 ? -- 1 "); - return false; - } - - // 리프레시 토큰이 DB에 저장된 토큰과 일치하는지 확인 - if (!savedToken.get().getRefreshToken().equals(token)){ - log.info("여기에 걸렸니 ? -- 2 "); - return false; - } - - // 리프레시 토큰의 만료여부 확인 - if(jwtUtil.isExpired(token)){ - log.info("여기에 걸렸니 ? -- 3 "); - return false; // 만료된 토큰은 유효하지 않음 - } - - log.info("여기에 걸렸니 ? -- 4 "); - return true; // 모든 조건 만족 시, 유효한 토큰 - } - - @Transactional - public void updateRefreshToken(Long userId, String oldRefreshToken, String newRefreshToken){ - Token token = tokenRepository.findByUserId(userId) - .orElseThrow(RefreshTokenNotFoundException::new); // 404 - - if (!token.getRefreshToken().equals(oldRefreshToken)){ - throw new TokenBadRequestException(); // 400 - } - - // 기존 토큰 삭제 및 새 토큰 저장 - tokenRepository.delete(token); - Token newToken = Token.toEntity(token.getUser(), newRefreshToken, LocalDateTime.now().plusDays(30)); - tokenRepository.save(newToken); - } -} diff --git a/application-admin/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java b/application-admin/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java index c1a25862..775306e8 100644 --- a/application-admin/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java +++ b/application-admin/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java @@ -1,22 +1,61 @@ package com.nowait.applicationadmin.order.controller; +import java.util.List; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.nowait.applicationadmin.order.dto.OrderResponseDto; +import com.nowait.applicationadmin.order.dto.OrderStatusUpdateRequestDto; +import com.nowait.applicationadmin.order.dto.OrderStatusUpdateResponseDto; +import com.nowait.applicationadmin.order.service.OrderService; +import com.nowait.common.api.ApiUtils; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @Tag(name = "Order API", description = "주문 API") @RestController -@RequestMapping("admin//orders") +@RequestMapping("admin/orders") @RequiredArgsConstructor public class OrderController { - @GetMapping - public void getOrders() { - //TODO - } + private final OrderService orderService; + @GetMapping("/{storeId}") + @Operation(summary = "주점별 주문리스트 조회", description = "특정 주점에 대한 예약리스트 조회") + @ApiResponse(responseCode = "200", description = "주리스트 조회") + public ResponseEntity getOrderListByStoreId(@PathVariable Long storeId) { + List response = orderService.findAllOrders(storeId); + return ResponseEntity + .status(HttpStatus.OK) + .body( + ApiUtils.success( + response + ) + ); + } + @PatchMapping("/status/{orderId}") + @Operation(summary = "주문 상태 변경", description = "특정 주문의 상태를 변경.") + @ApiResponse(responseCode = "200", description = "주문 상태 변경 성공") + @ApiResponse(responseCode = "400", description = "주문을 찾을 수 없음") + public ResponseEntity updateOrderStatus( + @PathVariable Long orderId, + @RequestBody@Valid OrderStatusUpdateRequestDto requestDto + ) { + OrderStatusUpdateResponseDto response = orderService.updateOrderStatus(orderId, requestDto.getOrderStatus()); + return ResponseEntity + .status(HttpStatus.OK) + .body(ApiUtils.success(response)); + } } diff --git a/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderResponseDto.java b/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderResponseDto.java new file mode 100644 index 00000000..afb2a079 --- /dev/null +++ b/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderResponseDto.java @@ -0,0 +1,33 @@ +package com.nowait.applicationadmin.order.dto; + +import java.time.LocalDateTime; + +import com.nowait.applicationadmin.reservation.dto.ReservationGetResponseDto; +import com.nowait.order.entity.UserOrder; +import com.nowait.order.entity.OrderStatus; +import com.nowait.reservation.entity.Reservation; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class OrderResponseDto { + private Long id; + private Long tableId; + private String depositorName; + private Integer totalPrice; + private OrderStatus status; + private LocalDateTime createdAt; + + public static OrderResponseDto fromEntity(UserOrder userOrder) { + return OrderResponseDto.builder() + .id(userOrder.getId()) + .tableId(userOrder.getTableId()) + .depositorName(userOrder.getDepositorName()) + .totalPrice(userOrder.getTotalPrice()) + .status(userOrder.getStatus()) + .createdAt(userOrder.getCreatedAt()) + .build(); + } +} diff --git a/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderStatusUpdateRequestDto.java b/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderStatusUpdateRequestDto.java new file mode 100644 index 00000000..a8a78442 --- /dev/null +++ b/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderStatusUpdateRequestDto.java @@ -0,0 +1,16 @@ +package com.nowait.applicationadmin.order.dto; + +import com.nowait.order.entity.OrderStatus; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class OrderStatusUpdateRequestDto { + @Schema(description = "주문 상태", example = "WAITING_FOR_PAYMENT", allowableValues = {"WAITING_FOR_PAYMENT", "COOKING", "COOKED"}) + @NotNull(message = "주문상태는 필수입니다") + private final OrderStatus orderStatus; +} diff --git a/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderStatusUpdateResponseDto.java b/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderStatusUpdateResponseDto.java new file mode 100644 index 00000000..63de5b53 --- /dev/null +++ b/application-admin/src/main/java/com/nowait/applicationadmin/order/dto/OrderStatusUpdateResponseDto.java @@ -0,0 +1,17 @@ +package com.nowait.applicationadmin.order.dto; + +import com.nowait.order.entity.OrderStatus; +import com.nowait.order.entity.UserOrder; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public class OrderStatusUpdateResponseDto { + private final OrderStatus orderStatus; + + public static OrderStatusUpdateResponseDto fromEntity(UserOrder userOrder) { + return new OrderStatusUpdateResponseDto(userOrder.getStatus()); + } +} diff --git a/application-admin/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java b/application-admin/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java new file mode 100644 index 00000000..c06986cf --- /dev/null +++ b/application-admin/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java @@ -0,0 +1,37 @@ +package com.nowait.applicationadmin.order.service; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.nowait.applicationadmin.order.dto.OrderResponseDto; +import com.nowait.applicationadmin.order.dto.OrderStatusUpdateResponseDto; +import com.nowait.order.entity.OrderStatus; +import com.nowait.order.entity.UserOrder; +import com.nowait.order.repository.OrderRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class OrderService { + + private final OrderRepository orderRepository; + + @Transactional(readOnly = true) + public List findAllOrders(Long storeId) { + return orderRepository.findAllByStore_StoreId(storeId).stream() + .map(OrderResponseDto::fromEntity) + .collect(Collectors.toList()); + } + + @Transactional + public OrderStatusUpdateResponseDto updateOrderStatus(Long orderId, OrderStatus newStatus) { + UserOrder userOrder = orderRepository.findById(orderId) + .orElseThrow(() -> new IllegalArgumentException("Order not found with id: " + orderId)); + userOrder.updateStatus(newStatus); + return OrderStatusUpdateResponseDto.fromEntity(userOrder); + } +} diff --git a/application-user/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateRequestDto.java b/application-user/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateRequestDto.java index 8823d0e4..89de6631 100644 --- a/application-user/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateRequestDto.java +++ b/application-user/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateRequestDto.java @@ -3,6 +3,9 @@ import java.util.List; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Builder; @@ -15,6 +18,10 @@ public class OrderCreateRequestDto { @NotBlank(message = "주문자 이름은 필수입니다") @Size(max = 10, message = "주문자 이름은 10자 이하여야 합니다") private final String depositorName; // 예약자 이름 + @NotEmpty(message = "주문 내역은 필수입니다") private final List items; // 장바구니 항목 리스트 + @NotNull(message = "주문금액은 필수입니다") + @Positive(message = "주문금액은 양수여야 합니다") + private final int totalPrice; } diff --git a/application-user/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateResponseDto.java b/application-user/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateResponseDto.java index 89a0e5e5..6044303e 100644 --- a/application-user/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateResponseDto.java +++ b/application-user/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateResponseDto.java @@ -2,6 +2,7 @@ import java.util.List; +import com.nowait.order.entity.OrderStatus; import com.nowait.order.entity.UserOrder; import lombok.AllArgsConstructor; @@ -18,6 +19,8 @@ public class OrderCreateResponseDto { private String sessionId; private String depositorName; private List orderItems; // 주문 항목 목록 + private OrderStatus status; + private Integer totalPrice; public static OrderCreateResponseDto fromEntity(UserOrder order) { return OrderCreateResponseDto.builder() @@ -27,6 +30,8 @@ public static OrderCreateResponseDto fromEntity(UserOrder order) { .sessionId(order.getSessionId()) .depositorName(order.getDepositorName()) .orderItems(List.of()) + .status(order.getStatus()) + .totalPrice(order.getTotalPrice()) .build(); } } diff --git a/application-user/src/main/java/com/nowait/applicationuser/order/service/OrderService.java b/application-user/src/main/java/com/nowait/applicationuser/order/service/OrderService.java index 35ffdde4..a4835e61 100644 --- a/application-user/src/main/java/com/nowait/applicationuser/order/service/OrderService.java +++ b/application-user/src/main/java/com/nowait/applicationuser/order/service/OrderService.java @@ -15,6 +15,7 @@ import com.nowait.applicationuser.order.dto.OrderCreateRequestDto; import com.nowait.applicationuser.order.dto.OrderCreateResponseDto; import com.nowait.applicationuser.order.dto.OrderItemListGetResponseDto; +import com.nowait.order.entity.OrderStatus; import com.nowait.store.entity.Store; import com.nowait.store.repository.StoreRepository; import com.nowait.menu.entity.Menu; @@ -56,6 +57,9 @@ public OrderCreateResponseDto createOrder(Long storeId, Long tableId, .signature(signature) // signature 저장 .sessionId(sessionId) // sessionId 저장 .depositorName(orderCreateRequestDto.getDepositorName()) + .status(OrderStatus.WAITING_FOR_PAYMENT) + .totalPrice(orderCreateRequestDto.getTotalPrice()) + .build(); UserOrder savedOrder = orderRepository.save(order); diff --git a/domain-order/build.gradle b/domain-order/build.gradle index 263db1df..7c7124e7 100644 --- a/domain-order/build.gradle +++ b/domain-order/build.gradle @@ -29,4 +29,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' + + // SWAGGER + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0' } diff --git a/domain-order/src/main/java/com/nowait/order/entity/OrderStatus.java b/domain-order/src/main/java/com/nowait/order/entity/OrderStatus.java new file mode 100644 index 00000000..7a111111 --- /dev/null +++ b/domain-order/src/main/java/com/nowait/order/entity/OrderStatus.java @@ -0,0 +1,22 @@ +package com.nowait.order.entity; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +@Schema(description = "주문 상태 Enum") +public enum OrderStatus { + @Schema(description = "입금대기") + WAITING_FOR_PAYMENT("입금대기"), + + @Schema(description = "조리중") + COOKING("조리중"), + + @Schema(description = "조리완료") + COOKED("조리완료"); + + private final String description; +} + diff --git a/domain-order/src/main/java/com/nowait/order/entity/UserOrder.java b/domain-order/src/main/java/com/nowait/order/entity/UserOrder.java index 06909f2c..c5e4639a 100644 --- a/domain-order/src/main/java/com/nowait/order/entity/UserOrder.java +++ b/domain-order/src/main/java/com/nowait/order/entity/UserOrder.java @@ -9,6 +9,8 @@ import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -43,10 +45,22 @@ public class UserOrder extends BaseTimeEntity { private Store store; @OneToMany(mappedBy = "userOrder", cascade = CascadeType.ALL, orphanRemoval = true) + @Builder.Default private List orderItems = new ArrayList<>(); private String sessionId; @Column(length = 10) // 예약자 이름 길이 제한 private String depositorName; + @Builder.Default + @Enumerated(value = EnumType.STRING) + private OrderStatus status = OrderStatus.WAITING_FOR_PAYMENT; + + @Column(nullable = false) + private Integer totalPrice; + + public void updateStatus(OrderStatus newStatus) { + this.status = newStatus; + } + } diff --git a/domain-order/src/main/java/com/nowait/order/repository/OrderRepository.java b/domain-order/src/main/java/com/nowait/order/repository/OrderRepository.java index e41b80de..48ca22d4 100644 --- a/domain-order/src/main/java/com/nowait/order/repository/OrderRepository.java +++ b/domain-order/src/main/java/com/nowait/order/repository/OrderRepository.java @@ -13,6 +13,7 @@ public interface OrderRepository extends JpaRepository { boolean existsBySignatureAndCreatedAtAfter(String signature, LocalDateTime createdAt); List findByStore_StoreIdAndTableIdAndSessionId(Long storeId, Long tableId, String sessionId); + List findAllByStore_StoreId(Long storeId); } diff --git a/domain-token/src/main/java/com/example/domaintoken/exception/BusinessException.java b/domain-token/src/main/java/com/example/domaintoken/exception/BusinessException.java index 05dc5c67..7fe9c748 100644 --- a/domain-token/src/main/java/com/example/domaintoken/exception/BusinessException.java +++ b/domain-token/src/main/java/com/example/domaintoken/exception/BusinessException.java @@ -1,6 +1,6 @@ package com.example.domaintoken.exception; -import com.nowaiting.common.exception.ErrorMessage; +import com.nowait.common.exception.ErrorMessage; public abstract class BusinessException extends RuntimeException { private final ErrorMessage errorMessage;