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

8주차 미션 / 서버 3조 김민석 #22

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
20 changes: 20 additions & 0 deletions src/main/java/kuit/server/common/exception/MenuException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package kuit.server.common.exception;

import kuit.server.common.response.status.ResponseStatus;
import lombok.Getter;

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

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

public MenuException(ResponseStatus exceptionStatus, String message) {
super(message);
this.exceptionStatus = exceptionStatus;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package kuit.server.common.exception_handler;

import jakarta.annotation.Priority;
import kuit.server.common.exception.MenuException;
import kuit.server.common.response.BaseErrorResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import static kuit.server.common.response.status.BaseExceptionResponseStatus.INVALID_MENU_VALUE;

@Slf4j
@Priority(0)
@RestControllerAdvice
public class MenuExceptionControllerAdvice {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MenuException.class)
public BaseErrorResponse handle_MenuException(MenuException e) {
log.error("[handle_MenuException]", e);
return new BaseErrorResponse(INVALID_MENU_VALUE, e.getMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,20 @@ public enum BaseExceptionResponseStatus implements ResponseStatus {
INVALID_USER_VALUE(5000, HttpStatus.BAD_REQUEST.value(), "회원가입 요청에서 잘못된 값이 존재합니다."),
DUPLICATE_EMAIL(5001, HttpStatus.BAD_REQUEST.value(), "이미 존재하는 이메일입니다."),
DUPLICATE_NICKNAME(5002, HttpStatus.BAD_REQUEST.value(), "이미 존재하는 닉네임입니다."),
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(), "존재하지 않는 이메일입니다.");
USER_NOT_FOUND(5003, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 회원입니다."),
PASSWORD_NO_MATCH(5004, HttpStatus.BAD_REQUEST.value(), "비밀번호가 일치하지 않습니다."),
INVALID_USER_STATUS(5005, HttpStatus.BAD_REQUEST.value(), "잘못된 회원 status 값입니다."),
EMAIL_NOT_FOUND(5006, HttpStatus.BAD_REQUEST.value(), "존재하지 않는 이메일입니다."),

/**
* 6000: Menu 오류
*/
INVALID_MENU_VALUE(6000, HttpStatus.BAD_REQUEST.value(), "메뉴 요청에서 잘못된 값이 존재합니다."),
INVALID_MENU_PRICE(6001, HttpStatus.BAD_REQUEST.value(), "메뉴 값은 양수이어야 합니다"),
DUPLICATE_MENU(6002,HttpStatus.BAD_REQUEST.value(),"이미 등록된 메뉴입니다."),
ALREADY_DELETED_MENU(6003, HttpStatus.BAD_REQUEST.value(), "해당 메뉴는 이미 삭제되었습니다.");



private final int code;
private final int status;
Expand Down
70 changes: 70 additions & 0 deletions src/main/java/kuit/server/controller/MenuController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package kuit.server.controller;

import kuit.server.common.exception.MenuException;
import kuit.server.common.exception.UserException;
import kuit.server.common.response.BaseResponse;
import kuit.server.dto.menu.GetMenuResponse;
import kuit.server.dto.menu.PatchPriceRequest;
import kuit.server.dto.menu.PostMenuRequest;
import kuit.server.dto.menu.PostMenuResponse;
import kuit.server.dto.user.GetUserResponse;
import kuit.server.dto.user.PatchNicknameRequest;
import kuit.server.dto.user.PostUserRequest;
import kuit.server.dto.user.PostUserResponse;
import kuit.server.service.MenuService;
import kuit.server.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static kuit.server.util.BindingResultUtils.getErrorMessages;

import static kuit.server.common.response.status.BaseExceptionResponseStatus.INVALID_MENU_VALUE;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/menus")
public class MenuController {
private final MenuService menuService;
@PostMapping("")
public BaseResponse<PostMenuResponse> registerMenu(@Validated @RequestBody PostMenuRequest postMenuRequest, BindingResult bindingResult) {
log.info("[MenuController.registerMenu]");
if (bindingResult.hasErrors()) {
throw new MenuException(INVALID_MENU_VALUE, getErrorMessages(bindingResult));
}

return new BaseResponse<>(menuService.registerMenu(postMenuRequest));
}
@PatchMapping("/{menuId}/price")
public BaseResponse<String> modifyPrice(@PathVariable long menuId,
@Validated @RequestBody PatchPriceRequest patchPriceRequest, BindingResult bindingResult) {
log.info("[MenuController.modifyPrice]");
if (bindingResult.hasErrors()) {
throw new MenuException(INVALID_MENU_VALUE, getErrorMessages(bindingResult));
}
menuService.modifyPrice(menuId, patchPriceRequest.getPrice());
return new BaseResponse<>(null);
}
@GetMapping("")
public BaseResponse<List<GetMenuResponse>> getMenus(
@RequestParam(required = false, defaultValue = "") String name,
@RequestParam(required = false, defaultValue = "") String category,
@RequestParam(required = false, defaultValue = "") String price) {
log.info("[MenuController.getMenus]");

return new BaseResponse<>(menuService.getMenus(name, category, price));
}

@PatchMapping("/{menuId}/deleted")
public BaseResponse<Object> modifyMenuStatus_deleted(@PathVariable long menuId) {
log.info("[MenuController.modifyMenuStatus_deleted]");
menuService.modifyMenuStatus_deleted(menuId);
return new BaseResponse<>(null);
}

}
11 changes: 11 additions & 0 deletions src/main/java/kuit/server/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,15 @@ public BaseResponse<List<GetUserResponse>> getUsers(
return new BaseResponse<>(userService.getUsers(nickname, email, status));
}

@PostMapping("login")
public BaseResponse<PostLoginResponse> login(@Validated @RequestBody PostLoginRequest postLoginRequest, BindingResult bindingResult) {
log.info("[UserController.login]");
if (bindingResult.hasErrors()) {
throw new UserException(INVALID_USER_VALUE, getErrorMessages(bindingResult));
}
return new BaseResponse<>(userService.login(postLoginRequest));
}



}
92 changes: 92 additions & 0 deletions src/main/java/kuit/server/dao/MenuDao.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package kuit.server.dao;

import kuit.server.dto.menu.GetMenuResponse;
import kuit.server.dto.menu.PostMenuRequest;
import kuit.server.dto.user.GetUserResponse;
import kuit.server.dto.user.PostUserRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.Objects;

@Slf4j
@Repository
public class MenuDao {

private final NamedParameterJdbcTemplate jdbcTemplate;

public MenuDao(NamedParameterJdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

public long createMenu(PostMenuRequest postMenuRequest) {
String sql = "insert into menu(storeId, category, name, price, menuPictureUrl) " +
"values(:storeId, :category, :name, :price, :menuPictureUrl)";

SqlParameterSource param = new BeanPropertySqlParameterSource(postMenuRequest);
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(sql, param, keyHolder);

return Objects.requireNonNull(keyHolder.getKey()).longValue();
}

public boolean hasInvalidMenuPrice(int price) {
// 가격이 음수이면 무조건 유효하지 않음
return price < 0;
}


public int modifyPrice(long menuId, int price) {
String sql = "update menu set price=:price where menuId=:menuId";
Map<String, Object> param = Map.of(
"price", price,
"menuId", menuId);
return jdbcTemplate.update(sql, param);
}
public List<GetMenuResponse> getMenus(String name, String category, String price) {
String sql = "select name, category, price, menuPictureUrl, status from menu ";

Map<String, Object> param = Map.of(
"name", "%" + name + "%",
"category", "%" + category + "%",
"price", price);

return jdbcTemplate.query(sql, param,
(rs, rowNum) -> new GetMenuResponse(
rs.getString("name"),
rs.getString("category"),
rs.getInt("price"),
rs.getString("menuPictureUrl"),
rs.getString("status"))
);
}

public int modifyMenuStatus_deleted(long menuId) {
String sql = "update menu set status=:status where menuId=:menuId";
Map<String, Object> param = Map.of(
"status", "deleted",
"menuId", menuId);
return jdbcTemplate.update(sql, param);
}

public boolean hasDuplicateMenu(String name) {
String sql = "select exists(select name from menu where name=:name and status in ('일반', 'deleted'))";
Map<String, Object> param = Map.of("name", name);
return Boolean.TRUE.equals(jdbcTemplate.queryForObject(sql, param, boolean.class));
}


public boolean isAlreadyDeletedMenu(Long menuId) {
String sql = "select exists(select menuId from menu where menuId=:menuId and status = 'deleted')";
Map<String, Object> param = Map.of("menuId", menuId);
return Boolean.TRUE.equals(jdbcTemplate.queryForObject(sql, param, Boolean.class));
}

}
26 changes: 21 additions & 5 deletions src/main/java/kuit/server/dao/UserDao.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package kuit.server.dao;

import kuit.server.dto.user.GetUserResponse;
import kuit.server.dto.user.PostLoginRequest;
import kuit.server.dto.user.PostLoginResponse;
import kuit.server.dto.user.PostUserRequest;
import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
Expand All @@ -26,13 +30,13 @@ public UserDao(DataSource dataSource) {
}

public boolean hasDuplicateEmail(String email) {
String sql = "select exists(select email from user where email=:email and status in ('active', 'dormant'))";
String sql = "select exists(select email from user where email=:email and status in ('일단', 'deleted'))";
Map<String, Object> param = Map.of("email", email);
return Boolean.TRUE.equals(jdbcTemplate.queryForObject(sql, param, boolean.class));
}

public boolean hasDuplicateNickName(String nickname) {
String sql = "select exists(select email from user where nickname=:nickname and status in ('active', 'dormant'))";
String sql = "select exists(select email from user where nickname=:nickname and status in ('일반', 'deleted'))";
Map<String, Object> param = Map.of("nickname", nickname);
return Boolean.TRUE.equals(jdbcTemplate.queryForObject(sql, param, boolean.class));
}
Expand All @@ -51,7 +55,7 @@ public long createUser(PostUserRequest postUserRequest) {
public int modifyUserStatus_dormant(long userId) {
String sql = "update user set status=:status where user_id=:user_id";
Map<String, Object> param = Map.of(
"status", "dormant",
"status", "휴먼",
"user_id", userId);
return jdbcTemplate.update(sql, param);
}
Expand All @@ -73,8 +77,7 @@ public int modifyNickname(long userId, String nickname) {
}

public List<GetUserResponse> getUsers(String nickname, String email, String status) {
String sql = "select email, phone_number, nickname, profile_image, status from user " +
"where nickname like :nickname and email like :email and status=:status";
String sql = "select email, phone_number, nickname, profile_image, status from user ";

Map<String, Object> param = Map.of(
"nickname", "%" + nickname + "%",
Expand Down Expand Up @@ -103,4 +106,17 @@ public String getPasswordByUserId(long userId) {
return jdbcTemplate.queryForObject(sql, param, String.class);
}

public long login(PostLoginRequest postLoginRequest) {
String sql = "select user_id from user where email=:email and status='일반'";
Map<String, Object> param = Map.of(
"email", postLoginRequest.getEmail()
);
Long userId = jdbcTemplate.queryForObject(sql, param, Long.class);
return userId;
}
//로그인 현재 해싱된 Password를 가지고 데이터베이스에 있는 값과 비교하는 방법을 잘 모르겠어서 email로만 확인하였습니다




}
18 changes: 18 additions & 0 deletions src/main/java/kuit/server/dto/menu/GetMenuResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package kuit.server.dto.menu;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class GetMenuResponse {
private String name;
private String category;
private int price;
private String menuPictureUrl;
private String status;
}
13 changes: 13 additions & 0 deletions src/main/java/kuit/server/dto/menu/PatchPriceRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package kuit.server.dto.menu;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class PatchPriceRequest {
private int price;

}
22 changes: 22 additions & 0 deletions src/main/java/kuit/server/dto/menu/PostMenuRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package kuit.server.dto.menu;

import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.validator.constraints.Length;

@Getter
@Setter
@NoArgsConstructor
public class PostMenuRequest {

private Long storeId;
private String category;

@NotBlank(message = "email: {NotBlank}")
@Length(max = 10, message = "menu: 최대 {max}자리까지 가능합니다")
private String name;
private int price;
private String menuPictureUrl;
}
10 changes: 10 additions & 0 deletions src/main/java/kuit/server/dto/menu/PostMenuResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kuit.server.dto.menu;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class PostMenuResponse {
private long menuId;
}
Loading