Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

9주차 미션 / 서버 4조 김광일 #9

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,21 @@
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import java.util.Arrays;

@Slf4j
@Component
public class JwtAuthHandlerArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasAnnotation = parameter.hasParameterAnnotation(PreAuthorize.class);
log.info(Arrays.toString(parameter.getParameterAnnotations()));
boolean hasType = long.class.isAssignableFrom(parameter.getParameterType());
log.info("hasAnnotation={}, hasType={}, hasAnnotation && hasType={}", hasAnnotation, hasType, hasAnnotation&&hasType);
return hasAnnotation && hasType;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package kuit3.backend.common.exception;


import kuit3.backend.common.response.status.ResponseStatus;
import lombok.Getter;

@Getter
public class RestaurantException extends RuntimeException{
private final ResponseStatus exceptionStatus;

public RestaurantException(ResponseStatus exceptionStatus) {
super(exceptionStatus.getMessage());
this.exceptionStatus = exceptionStatus;
}

public RestaurantException(ResponseStatus exceptionStatus, String message){
super(message);
this.exceptionStatus = exceptionStatus;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import kuit3.backend.jwt.JwtProvider;
import kuit3.backend.service.AuthService;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
Expand All @@ -33,9 +34,11 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
validateAccessToken(accessToken);

String email = jwtProvider.getPrincipal(accessToken);
log.info(String.valueOf(email));
validatePayload(email);

long userId = authService.getUserIdByEmail(email);
log.info(String.valueOf(userId));
request.setAttribute("userId", userId);
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,12 @@ public enum BaseExceptionResponseStatus implements ResponseStatus {
USER_NOT_FOUND(4003, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 회원입니다."),
PASSWORD_NO_MATCH(4004, HttpStatus.BAD_REQUEST.value(), "비밀번호가 일치하지 않습니다."),
INVALID_USER_STATUS(4005, HttpStatus.BAD_REQUEST.value(), "잘못된 회원 status 값입니다."),
EMAIL_NOT_FOUND(4006, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 이메일입니다.");
EMAIL_NOT_FOUND(4006, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 이메일입니다."),

/**
* 6000: Menu 오류
*/
INVALID_MENU_VALUE(6000, HttpStatus.BAD_REQUEST.value(), "메뉴 등록에 유효하지 않은 값이 있습니다.");

private final int code;
private final int status;
Expand Down
6 changes: 5 additions & 1 deletion src/main/java/kuit3/backend/config/WebConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@ public class WebConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtAuthenticationInterceptor)
.order(1)
.addPathPatterns("/auth/test");
.addPathPatterns("/users/**")
.excludePathPatterns("/users")
.addPathPatterns("/auth/test")
.addPathPatterns("/category")
.addPathPatterns("/restaurants/**");
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/kuit3/backend/controller/AuthController.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public BaseResponse<LoginResponse> login(@Validated @RequestBody LoginRequest au
* 인가(JWT 검증) 테스트
*/
@GetMapping("/test")
public BaseResponse<String> checkAuthorization(@PreAuthorize Long userId) {
public BaseResponse<String> checkAuthorization(@PreAuthorize long userId) {
return new BaseResponse<>("userId=" + userId);
}

Expand Down
34 changes: 34 additions & 0 deletions src/main/java/kuit3/backend/controller/CategoryController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package kuit3.backend.controller;

import kuit3.backend.common.response.BaseResponse;
import kuit3.backend.dto.category.CategoryResponse;
import kuit3.backend.dto.category.CategoryStoreResponse;
import kuit3.backend.service.CategoryService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/category")
public class CategoryController {
private final CategoryService categoryService;

// 카테고리 목록 조회하기
@GetMapping("")
public BaseResponse<List<CategoryResponse>> getCategories(){
return new BaseResponse<>(categoryService.getCategories());
}

// 해당 카테고리 음식점 목록 조회하기
@GetMapping("/{categoryId}")
public BaseResponse<List<CategoryStoreResponse>> CategoryStoreController(
@PathVariable Long categoryId,
@RequestParam(name = "min-order-fee", required = false) int minOrderFee,
@RequestParam(required = false, defaultValue = "0") int page){
return new BaseResponse<>(categoryService.getStore(categoryId,minOrderFee,page));
}


}
82 changes: 82 additions & 0 deletions src/main/java/kuit3/backend/controller/RestaurantController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package kuit3.backend.controller;


import kuit3.backend.common.exception.RestaurantException;
import kuit3.backend.common.response.BaseResponse;
import kuit3.backend.dto.restaurant.MenuUpdateRequest;
import kuit3.backend.dto.restaurant.RestaurantMenuRequest;
import kuit3.backend.dto.restaurant.RestaurantMenuResponse;
import kuit3.backend.dto.restaurant.RestaurantOrderResponse;
import kuit3.backend.service.RestaurantService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static kuit3.backend.common.response.status.BaseExceptionResponseStatus.INVALID_MENU_VALUE;
import static kuit3.backend.util.BindingResultUtils.getErrorMessages;


@RestController
@RequiredArgsConstructor
@RequestMapping("/restaurants")
public class RestaurantController {

private final RestaurantService restaurantService;

// 주문 내역 가져오기
@GetMapping("/{restaurantId}/orders")
public BaseResponse<List<RestaurantOrderResponse>> getRestaurantOrders(@PathVariable Long restaurantId,
@RequestParam(required = false, defaultValue = "0") int page){
return new BaseResponse<>(restaurantService.getOrders(restaurantId,page));
}

// 음식점 메뉴 가져오기
@GetMapping("/{restaurantId}/menus")
public BaseResponse<List<RestaurantMenuResponse>> getRestaurantMenu(@PathVariable Long restaurantId,
@RequestParam(required = false, defaultValue = "0") int page){
return new BaseResponse<>(restaurantService.getMenu(restaurantId,page));
}

// 메뉴 등록하기
@PostMapping("/{restaurantId}/menu")
public BaseResponse<String> createMenu(@PathVariable Long restaurantId,
@Validated @RequestBody RestaurantMenuRequest menuRequest, BindingResult bindingResult){
if (bindingResult.hasErrors()) {
throw new RestaurantException(INVALID_MENU_VALUE, getErrorMessages(bindingResult));
}
restaurantService.createMenu(restaurantId,menuRequest);
return new BaseResponse<>(null);
}


// 메뉴 삭제하기
@PatchMapping("/{restaurantId}/menu/{menuId}/deleted")
public BaseResponse<String> deleteMenu(@PathVariable Long restaurantId, @PathVariable Long menuId){
restaurantService.modifyMenuStatus_delete(restaurantId,menuId);
return new BaseResponse<>(null);
}

// 메뉴 수정하기
@PutMapping("/{restaurantId}/menu/{menuId}/updated")
public BaseResponse<String> updateMenu(@PathVariable Long restaurantId, @PathVariable Long menuId,
@Validated @RequestBody MenuUpdateRequest menuUpdateRequest, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
throw new RestaurantException(INVALID_MENU_VALUE, getErrorMessages(bindingResult));
}

restaurantService.updateMenu(restaurantId,menuId,menuUpdateRequest);
return new BaseResponse<>(null);
}

// 가게 폐업
@PatchMapping("/{restaurantId}/deleted")
public BaseResponse<String> deleteRestaurant(@PathVariable Long restaurantId){
restaurantService.modifyStatus_delete(restaurantId);
return new BaseResponse<>(null);
}


}
34 changes: 28 additions & 6 deletions src/main/java/kuit3/backend/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package kuit3.backend.controller;

import kuit3.backend.common.argument_resolver.PreAuthorize;
import kuit3.backend.common.exception.UserException;
import kuit3.backend.common.response.BaseResponse;
import kuit3.backend.dto.user.*;
Expand Down Expand Up @@ -38,26 +39,26 @@ public BaseResponse<PostUserResponse> signUp(@Validated @RequestBody PostUserReq
/**
* 회원 휴면
*/
@PatchMapping("/{userId}/dormant")
public BaseResponse<Object> modifyUserStatus_dormant(@PathVariable long userId) {
@PatchMapping("/dormant")
public BaseResponse<Object> modifyUserStatus_dormant(@PreAuthorize long userId) {
userService.modifyUserStatus_dormant(userId);
return new BaseResponse<>(null);
}

/**
* 회원 탈퇴
*/
@PatchMapping("/{userId}/deleted")
public BaseResponse<Object> modifyUserStatus_deleted(@PathVariable long userId) {
@PatchMapping("/deleted")
public BaseResponse<Object> modifyUserStatus_deleted(@PreAuthorize long userId) {
userService.modifyUserStatus_deleted(userId);
return new BaseResponse<>(null);
}

/**
* 닉네임 변경
*/
@PatchMapping("/{userId}/nickname")
public BaseResponse<String> modifyNickname(@PathVariable long userId,
@PatchMapping("/nickname")
public BaseResponse<String> modifyNickname(@PreAuthorize long userId,
@Validated @RequestBody PatchNicknameRequest patchNicknameRequest, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
throw new UserException(INVALID_USER_VALUE, getErrorMessages(bindingResult));
Expand All @@ -79,4 +80,25 @@ public BaseResponse<List<GetUserResponse>> getUsers(
}
return new BaseResponse<>(userService.getUsers(nickname, email, status));
}

// 유저가 주문한 모든 주문 내역 가져오기
@GetMapping("/orders")
public BaseResponse<List<UserOrdersResponse>> getOrders(@PreAuthorize Long userId,
@RequestParam(required = false, defaultValue = "0") int page){

return new BaseResponse<>(userService.getOrders(userId,page));
}


// 주소 추가하기
@PostMapping("/address")
public BaseResponse<String> createAddress(@PreAuthorize String userId,
@Validated @RequestBody UserAddressRequest userAddressRequest, BindingResult bindingResult ){
if (bindingResult.hasErrors()) {
throw new UserException(INVALID_USER_VALUE, getErrorMessages(bindingResult));
}

userService.createAddress(userId,userAddressRequest);
return new BaseResponse<>(null);
}
}
57 changes: 57 additions & 0 deletions src/main/java/kuit3/backend/dao/CategoryDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package kuit3.backend.dao;


import kuit3.backend.dto.category.CategoryResponse;
import kuit3.backend.dto.category.CategoryStoreResponse;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Repository
public class CategoryDao {
private final JdbcTemplate jdbcTemplate;

public CategoryDao(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}

public List<CategoryResponse> getAllCategories() {
String sql = "SELECT * FROM category";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
CategoryResponse category = new CategoryResponse();
if(rs.getString("status").equals("active")){
category.setId(rs.getLong("category_id"));
category.setName(rs.getString("name"));
return category;
}
return null;

}).stream().filter(Objects::nonNull).collect(Collectors.toList());
}

public List<CategoryStoreResponse> getStores(Long categoryId, int minOrderFee, int page) {
int pageSize = 5;
String sql = "SELECT * FROM store s " +
"JOIN category c ON s.category_id = c.category_id " +
"WHERE c.category_id = ? AND s.min_price >= ? AND c.category_id > ? " +
"LIMIT ?";

return jdbcTemplate.query(sql, new Object[]{categoryId, minOrderFee,page,pageSize}, (rs, rowNum) -> {
CategoryStoreResponse store = new CategoryStoreResponse();
if(rs.getString("s.status").equals("active")){
store.setStoreName(rs.getString("store_name"));
store.setMinOrderFee(rs.getInt("min_price"));
store.setWorkingTime(rs.getString("working_time"));
store.setAddressName(rs.getString("address_name"));
store.setHoliday(rs.getString("holiday"));
return store;
}

return null;
}).stream().filter(Objects::nonNull).collect(Collectors.toList());
}
}
34 changes: 34 additions & 0 deletions src/main/java/kuit3/backend/dao/MenuDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package kuit3.backend.dao;


import kuit3.backend.dto.menu.MenuResponse;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.util.List;

@Repository
public class MenuDao {
private final JdbcTemplate jdbcTemplate;

public MenuDao(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}

public List<MenuResponse> getMenusByOrderId(Long orderId) {
String sql = "SELECT * FROM menu m " +
"JOIN order_menu om ON m.menu_id = om.menu_id " +
"LEFT JOIN options os ON m.menu_id = os.menu_id " +
"WHERE om.order_id = ?";
return jdbcTemplate.query(sql, new Object[]{orderId}, (rs, rowNum) -> {
MenuResponse menu = new MenuResponse();
menu.setMenuId(rs.getLong("menu_id"));
menu.setMenuName(rs.getString("menu_name"));
menu.setPrice(rs.getInt("m.price") + rs.getInt("os.price"));
menu.setOptionName(rs.getString("name"));

return menu;
});
}
}
Loading