diff --git a/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java b/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java index a1909a8..30ac8f1 100644 --- a/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java +++ b/src/main/java/com/kusitms/jipbap/common/response/ErrorCode.java @@ -32,7 +32,8 @@ public enum ErrorCode { STORE_ALREADY_EXISTS_ERROR(false, HttpStatus.BAD_REQUEST.value(), "이미 존재하는 가게입니다."), //food - CATEGORY_NOT_FOUND_ERROR(false, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 카테고리입니다.") + CATEGORY_NOT_FOUND_ERROR(false, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 카테고리입니다."), + FOOD_NOT_FOUND_ERROR(false, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 메뉴입니다."), ; private Boolean isSuccess; diff --git a/src/main/java/com/kusitms/jipbap/food/FoodController.java b/src/main/java/com/kusitms/jipbap/food/FoodController.java index acb7c4c..df363d2 100644 --- a/src/main/java/com/kusitms/jipbap/food/FoodController.java +++ b/src/main/java/com/kusitms/jipbap/food/FoodController.java @@ -1,15 +1,16 @@ package com.kusitms.jipbap.food; import com.kusitms.jipbap.common.response.CommonResponse; +import com.kusitms.jipbap.food.dto.CategoryDto; import com.kusitms.jipbap.food.dto.FoodDto; +import com.kusitms.jipbap.food.dto.RegisterCategoryRequestDto; import com.kusitms.jipbap.food.dto.RegisterFoodRequestDto; import com.kusitms.jipbap.security.Auth; import com.kusitms.jipbap.security.AuthInfo; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/food") @@ -18,10 +19,24 @@ public class FoodController { private final FoodService foodService; - @Operation(summary = "음식 등록하기") + @Operation(summary = "카테고리 등록하기") + @PostMapping("/category") + @ResponseStatus(HttpStatus.CREATED) + public CommonResponse registerCategory(@RequestBody RegisterCategoryRequestDto dto) { + return new CommonResponse<>(foodService.registerCategory(dto)); + } + + @Operation(summary = "메뉴 등록하기") @PostMapping - public CommonResponse registerFood(@Auth AuthInfo authInfo, RegisterFoodRequestDto dto) { + @ResponseStatus(HttpStatus.CREATED) + public CommonResponse registerFood(@Auth AuthInfo authInfo, @RequestBody RegisterFoodRequestDto dto) { return new CommonResponse<>(foodService.registerFood(authInfo.getEmail(), dto)); } + @Operation(summary = "메뉴 하나 상세조회") + @GetMapping("/{foodId}") + @ResponseStatus(HttpStatus.OK) + public CommonResponse getFoodDetail(@PathVariable Long foodId) { + return new CommonResponse<>(foodService.getFoodDetail(foodId)); + } } diff --git a/src/main/java/com/kusitms/jipbap/food/FoodExceptionHandler.java b/src/main/java/com/kusitms/jipbap/food/FoodExceptionHandler.java index 6489194..f74daf8 100644 --- a/src/main/java/com/kusitms/jipbap/food/FoodExceptionHandler.java +++ b/src/main/java/com/kusitms/jipbap/food/FoodExceptionHandler.java @@ -3,6 +3,7 @@ import com.kusitms.jipbap.common.response.CommonResponse; import com.kusitms.jipbap.common.response.ErrorCode; import com.kusitms.jipbap.food.exception.CategoryNotExistsException; +import com.kusitms.jipbap.food.exception.FoodNotExistsException; import com.kusitms.jipbap.store.exception.StoreExistsException; import com.kusitms.jipbap.store.exception.StoreNotExistsException; import jakarta.servlet.http.HttpServletRequest; @@ -22,4 +23,11 @@ public CommonResponse handleCategoryNotExistsException(CategoryNotExistsExcep return new CommonResponse<>(ErrorCode.CATEGORY_NOT_FOUND_ERROR); } + @ExceptionHandler(FoodNotExistsException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResponse handelFoodNotExistsException(FoodNotExistsException e, HttpServletRequest request) { + log.warn("FOOD-002> 요청 URI: " + request.getRequestURI() + ", 에러 메세지: " + e.getMessage()); + return new CommonResponse<>(ErrorCode.FOOD_NOT_FOUND_ERROR); + } + } diff --git a/src/main/java/com/kusitms/jipbap/food/FoodService.java b/src/main/java/com/kusitms/jipbap/food/FoodService.java index 4cec56a..467c4cd 100644 --- a/src/main/java/com/kusitms/jipbap/food/FoodService.java +++ b/src/main/java/com/kusitms/jipbap/food/FoodService.java @@ -1,8 +1,11 @@ package com.kusitms.jipbap.food; +import com.kusitms.jipbap.food.dto.CategoryDto; import com.kusitms.jipbap.food.dto.FoodDto; +import com.kusitms.jipbap.food.dto.RegisterCategoryRequestDto; import com.kusitms.jipbap.food.dto.RegisterFoodRequestDto; import com.kusitms.jipbap.food.exception.CategoryNotExistsException; +import com.kusitms.jipbap.food.exception.FoodNotExistsException; import com.kusitms.jipbap.store.Store; import com.kusitms.jipbap.store.StoreRepository; import com.kusitms.jipbap.store.exception.StoreNotExistsException; @@ -24,6 +27,14 @@ public class FoodService { private final FoodRepository foodRepository; private final CategoryRepository categoryRepository; + @Transactional + public CategoryDto registerCategory(RegisterCategoryRequestDto dto) { + Category category = categoryRepository.save( + new Category(null, dto.getName(), dto.getImage()) + ); + return new CategoryDto(category.getId(), category.getName(), category.getImage()); + } + @Transactional public FoodDto registerFood(String email, RegisterFoodRequestDto dto) { userRepository.findByEmail(email).orElseThrow(()-> new UserNotFoundException("유저 정보가 존재하지 않습니다.")); @@ -35,4 +46,9 @@ public FoodDto registerFood(String email, RegisterFoodRequestDto dto) { ); return new FoodDto(food.getId(), store.getId(), category.getId(), food.getName(), food.getPrice(), food.getDescription()); } + + public FoodDto getFoodDetail(Long foodId) { + Food food = foodRepository.findById(foodId).orElseThrow(()-> new FoodNotExistsException("해당 음식 Id는 유효하지 않습니다.")); + return new FoodDto(food.getId(), food.getStore().getId(), food.getCategory().getId(), food.getName(), food.getPrice(), food.getDescription()); + } } diff --git a/src/main/java/com/kusitms/jipbap/food/dto/CategoryDto.java b/src/main/java/com/kusitms/jipbap/food/dto/CategoryDto.java new file mode 100644 index 0000000..82ae499 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/food/dto/CategoryDto.java @@ -0,0 +1,16 @@ +package com.kusitms.jipbap.food.dto; + +import jakarta.persistence.Column; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class CategoryDto { + + private Long id; + private String name; + private String image; +} diff --git a/src/main/java/com/kusitms/jipbap/food/dto/RegisterCategoryRequestDto.java b/src/main/java/com/kusitms/jipbap/food/dto/RegisterCategoryRequestDto.java new file mode 100644 index 0000000..1a8c906 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/food/dto/RegisterCategoryRequestDto.java @@ -0,0 +1,11 @@ +package com.kusitms.jipbap.food.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class RegisterCategoryRequestDto { + private String name; + private String image; +} diff --git a/src/main/java/com/kusitms/jipbap/food/exception/FoodNotExistsException.java b/src/main/java/com/kusitms/jipbap/food/exception/FoodNotExistsException.java new file mode 100644 index 0000000..446d488 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/food/exception/FoodNotExistsException.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.food.exception; + +public class FoodNotExistsException extends RuntimeException { + public FoodNotExistsException(String message) { + super(message); + } +} diff --git a/src/main/java/com/kusitms/jipbap/order/Order.java b/src/main/java/com/kusitms/jipbap/order/Order.java index 4ebac54..e74800d 100644 --- a/src/main/java/com/kusitms/jipbap/order/Order.java +++ b/src/main/java/com/kusitms/jipbap/order/Order.java @@ -1,9 +1,7 @@ package com.kusitms.jipbap.order; import com.kusitms.jipbap.common.entity.DateEntity; -import com.kusitms.jipbap.food.Category; import com.kusitms.jipbap.food.Food; -import com.kusitms.jipbap.store.Store; import com.kusitms.jipbap.user.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/kusitms/jipbap/order/OrderController.java b/src/main/java/com/kusitms/jipbap/order/OrderController.java new file mode 100644 index 0000000..ccf4a35 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/order/OrderController.java @@ -0,0 +1,29 @@ +package com.kusitms.jipbap.order; + +import com.kusitms.jipbap.common.response.CommonResponse; +import com.kusitms.jipbap.food.dto.CategoryDto; +import com.kusitms.jipbap.food.dto.RegisterCategoryRequestDto; +import com.kusitms.jipbap.order.dto.OrderDto; +import com.kusitms.jipbap.order.dto.OrderFoodRequestDto; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequestMapping("/order") +@RequiredArgsConstructor +public class OrderController { + + private final OrderService orderService; + + @Operation(summary = "음식 주문하기") + @PostMapping("/food") + @ResponseStatus(HttpStatus.CREATED) + public CommonResponse orderFood(@Valid @RequestBody OrderFoodRequestDto dto) { + return new CommonResponse<>(orderService.orderFood(dto)); + } + +} diff --git a/src/main/java/com/kusitms/jipbap/order/OrderRepository.java b/src/main/java/com/kusitms/jipbap/order/OrderRepository.java new file mode 100644 index 0000000..1ba896d --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/order/OrderRepository.java @@ -0,0 +1,7 @@ +package com.kusitms.jipbap.order; + +import com.kusitms.jipbap.food.Food; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderRepository extends JpaRepository { +} diff --git a/src/main/java/com/kusitms/jipbap/order/OrderService.java b/src/main/java/com/kusitms/jipbap/order/OrderService.java new file mode 100644 index 0000000..520cc61 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/order/OrderService.java @@ -0,0 +1,36 @@ +package com.kusitms.jipbap.order; + +import com.kusitms.jipbap.food.Category; +import com.kusitms.jipbap.food.Food; +import com.kusitms.jipbap.food.FoodRepository; +import com.kusitms.jipbap.food.dto.CategoryDto; +import com.kusitms.jipbap.food.exception.FoodNotExistsException; +import com.kusitms.jipbap.order.dto.OrderDto; +import com.kusitms.jipbap.order.dto.OrderFoodRequestDto; +import com.kusitms.jipbap.user.User; +import com.kusitms.jipbap.user.UserRepository; +import com.kusitms.jipbap.user.exception.UserNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@RequiredArgsConstructor +public class OrderService { + + private final OrderRepository orderRepository; + private final UserRepository userRepository; + private final FoodRepository foodRepository; + + public OrderDto orderFood(OrderFoodRequestDto dto) { + User user = userRepository.findById(dto.getUser()).orElseThrow(()-> new UserNotFoundException("유저 정보가 존재하지 않습니다.")); + Food food = foodRepository.findById(dto.getFood()).orElseThrow(()-> new FoodNotExistsException("해당 음식은 유효하지 않습니다.")); + + Order order = orderRepository.save( + new Order(null, user, food, dto.getOrderCount()) + ); + + return new OrderDto(order.getId(), user.getId(), food.getId(), order.getOrderCount()); + } +} diff --git a/src/main/java/com/kusitms/jipbap/order/dto/OrderDto.java b/src/main/java/com/kusitms/jipbap/order/dto/OrderDto.java new file mode 100644 index 0000000..e5f190d --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/order/dto/OrderDto.java @@ -0,0 +1,19 @@ +package com.kusitms.jipbap.order.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class OrderDto { + + private Long id; + + private Long user; + + private Long food; + + private Long orderCount; +} diff --git a/src/main/java/com/kusitms/jipbap/order/dto/OrderFoodRequestDto.java b/src/main/java/com/kusitms/jipbap/order/dto/OrderFoodRequestDto.java new file mode 100644 index 0000000..3f3b928 --- /dev/null +++ b/src/main/java/com/kusitms/jipbap/order/dto/OrderFoodRequestDto.java @@ -0,0 +1,15 @@ +package com.kusitms.jipbap.order.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class OrderFoodRequestDto { + private Long user; + + private Long food; + + private Long orderCount; +} diff --git a/src/main/java/com/kusitms/jipbap/store/StoreController.java b/src/main/java/com/kusitms/jipbap/store/StoreController.java index 7d6ce0a..0c767c0 100644 --- a/src/main/java/com/kusitms/jipbap/store/StoreController.java +++ b/src/main/java/com/kusitms/jipbap/store/StoreController.java @@ -12,6 +12,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -26,7 +27,8 @@ public class StoreController { @Operation(summary = "가게 등록하기") @PostMapping - public CommonResponse registerStore(@Auth AuthInfo authInfo, @Valid @RequestBody RegisterStoreRequestDto dto) { + @ResponseStatus(HttpStatus.CREATED) + public CommonResponse registerStore(@Auth AuthInfo authInfo, @Valid @RequestBody RegisterStoreRequestDto dto){ return new CommonResponse<>(storeService.registerStore(authInfo.getEmail(), dto)); } diff --git a/src/main/java/com/kusitms/jipbap/store/dto/RegisterStoreRequestDto.java b/src/main/java/com/kusitms/jipbap/store/dto/RegisterStoreRequestDto.java index 192a44d..ca6b1f7 100644 --- a/src/main/java/com/kusitms/jipbap/store/dto/RegisterStoreRequestDto.java +++ b/src/main/java/com/kusitms/jipbap/store/dto/RegisterStoreRequestDto.java @@ -1,10 +1,10 @@ package com.kusitms.jipbap.store.dto; -import lombok.Getter; -import lombok.Setter; +import lombok.*; @Getter @Setter +@AllArgsConstructor public class RegisterStoreRequestDto { private String name;