diff --git a/src/main/java/kuit3/backend/common/argument_resolver/PreAuthorize.java b/src/main/java/kuit3/backend/common/argument_resolver/JWTAuthorize.java similarity index 89% rename from src/main/java/kuit3/backend/common/argument_resolver/PreAuthorize.java rename to src/main/java/kuit3/backend/common/argument_resolver/JWTAuthorize.java index 79bffd6..b601004 100644 --- a/src/main/java/kuit3/backend/common/argument_resolver/PreAuthorize.java +++ b/src/main/java/kuit3/backend/common/argument_resolver/JWTAuthorize.java @@ -7,5 +7,5 @@ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) -public @interface PreAuthorize { +public @interface JWTAuthorize { } diff --git a/src/main/java/kuit3/backend/common/argument_resolver/JwtAuthHandlerArgumentResolver.java b/src/main/java/kuit3/backend/common/argument_resolver/JwtAuthHandlerArgumentResolver.java index 474afa1..a83f7eb 100644 --- a/src/main/java/kuit3/backend/common/argument_resolver/JwtAuthHandlerArgumentResolver.java +++ b/src/main/java/kuit3/backend/common/argument_resolver/JwtAuthHandlerArgumentResolver.java @@ -1,6 +1,8 @@ package kuit3.backend.common.argument_resolver; import jakarta.servlet.http.HttpServletRequest; +import kuit3.backend.common.interceptor.JwtAuthInterceptor; +import kuit3.backend.service.AuthService; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; import org.springframework.security.access.prepost.PreAuthorize; @@ -13,9 +15,18 @@ @Slf4j @Component public class JwtAuthHandlerArgumentResolver implements HandlerMethodArgumentResolver { + + private final JwtAuthInterceptor jwtAuthInterceptor; + private final AuthService authService; + + public JwtAuthHandlerArgumentResolver(JwtAuthInterceptor jwtAuthInterceptor, AuthService authService) { + this.jwtAuthInterceptor = jwtAuthInterceptor; + this.authService = authService; + } + @Override public boolean supportsParameter(MethodParameter parameter) { - boolean hasAnnotation = parameter.hasParameterAnnotation(PreAuthorize.class); + boolean hasAnnotation = parameter.hasParameterAnnotation(JWTAuthorize.class); boolean hasType = long.class.isAssignableFrom(parameter.getParameterType()); log.info("hasAnnotation={}, hasType={}, hasAnnotation && hasType={}", hasAnnotation, hasType, hasAnnotation&&hasType); return hasAnnotation && hasType; @@ -25,6 +36,15 @@ public boolean supportsParameter(MethodParameter parameter) { public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest(); log.info("userId={}", request.getAttribute("userId")); - return request.getAttribute("userId"); + String accessToken = jwtAuthInterceptor.resolveAccessToken(request); + jwtAuthInterceptor.validateAccessToken(accessToken); + String email = jwtAuthInterceptor.getEmail(accessToken); + jwtAuthInterceptor.validatePayload(email); + long userId = authService.getUserIdByEmail(email); + + // HttpServletRequest에 userId 속성 설정 + //HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest(); + request.setAttribute("userId", userId); + return userId; } } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/common/exception/RestaurantException.java b/src/main/java/kuit3/backend/common/exception/RestaurantException.java new file mode 100644 index 0000000..2e58879 --- /dev/null +++ b/src/main/java/kuit3/backend/common/exception/RestaurantException.java @@ -0,0 +1,19 @@ +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; + } +} diff --git a/src/main/java/kuit3/backend/common/exception_handler/BaseExceptionControllerAdvice.java b/src/main/java/kuit3/backend/common/exception_handler/BaseExceptionControllerAdvice.java index df5360d..f4b0e6f 100644 --- a/src/main/java/kuit3/backend/common/exception_handler/BaseExceptionControllerAdvice.java +++ b/src/main/java/kuit3/backend/common/exception_handler/BaseExceptionControllerAdvice.java @@ -1,9 +1,9 @@ package kuit3.backend.common.exception_handler; -import jakarta.validation.ConstraintViolationException; import kuit3.backend.common.exception.BadRequestException; import kuit3.backend.common.exception.InternalServerErrorException; import kuit3.backend.common.response.BaseErrorResponse; +import jakarta.validation.ConstraintViolationException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.TypeMismatchException; import org.springframework.http.HttpStatus; @@ -63,4 +63,4 @@ public BaseErrorResponse handle_RuntimeException(Exception e) { return new BaseErrorResponse(SERVER_ERROR); } -} \ No newline at end of file +} diff --git a/src/main/java/kuit3/backend/common/exception_handler/DatabaseExceptionControllerAdvice.java b/src/main/java/kuit3/backend/common/exception_handler/DatabaseExceptionControllerAdvice.java index 1a8dda1..ce2d165 100644 --- a/src/main/java/kuit3/backend/common/exception_handler/DatabaseExceptionControllerAdvice.java +++ b/src/main/java/kuit3/backend/common/exception_handler/DatabaseExceptionControllerAdvice.java @@ -1,7 +1,7 @@ package kuit3.backend.common.exception_handler; -import jakarta.annotation.Priority; import kuit3.backend.common.response.BaseErrorResponse; +import jakarta.annotation.Priority; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DataAccessException; import org.springframework.http.HttpStatus; @@ -31,4 +31,5 @@ public BaseErrorResponse handle_DataAccessException(DataAccessException e) { log.error("[handle_DataAccessException]", e); return new BaseErrorResponse(DATABASE_ERROR); } + } diff --git a/src/main/java/kuit3/backend/common/exception_handler/JwtExceptionControllerAdvice.java b/src/main/java/kuit3/backend/common/exception_handler/JwtExceptionControllerAdvice.java index 6b76461..2012fa7 100644 --- a/src/main/java/kuit3/backend/common/exception_handler/JwtExceptionControllerAdvice.java +++ b/src/main/java/kuit3/backend/common/exception_handler/JwtExceptionControllerAdvice.java @@ -1,9 +1,9 @@ package kuit3.backend.common.exception_handler; -import jakarta.annotation.Priority; import kuit3.backend.common.exception.jwt.bad_request.JwtBadRequestException; import kuit3.backend.common.exception.jwt.unauthorized.JwtUnauthorizedTokenException; import kuit3.backend.common.response.BaseErrorResponse; +import jakarta.annotation.Priority; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -28,4 +28,5 @@ public BaseErrorResponse handle_JwtUnauthorizedException(JwtUnauthorizedTokenExc log.error("[handle_JwtUnauthorizedException]", e); return new BaseErrorResponse(e.getExceptionStatus()); } -} \ No newline at end of file + +} diff --git a/src/main/java/kuit3/backend/common/exception_handler/RestaurantExceptionContorollerAdvice.java b/src/main/java/kuit3/backend/common/exception_handler/RestaurantExceptionContorollerAdvice.java new file mode 100644 index 0000000..81fb690 --- /dev/null +++ b/src/main/java/kuit3/backend/common/exception_handler/RestaurantExceptionContorollerAdvice.java @@ -0,0 +1,25 @@ +package kuit3.backend.common.exception_handler; + +import jakarta.annotation.Priority; +import kuit3.backend.common.exception.RestaurantException; +import kuit3.backend.common.exception.UserException; +import kuit3.backend.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 kuit3.backend.common.response.status.BaseExceptionResponseStatus.INVALID_RESTAURANT_VALUE; + +@Slf4j +@Priority(0) +@RestControllerAdvice +public class RestaurantExceptionContorollerAdvice { + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(RestaurantException.class) + public BaseErrorResponse handle_RestaurantException(RestaurantException e) { + log.error("[handle_RestaurantException]", e); + return new BaseErrorResponse(e.getExceptionStatus(), e.getMessage()); + } +} diff --git a/src/main/java/kuit3/backend/common/exception_handler/UserExceptionControllerAdvice.java b/src/main/java/kuit3/backend/common/exception_handler/UserExceptionControllerAdvice.java index d3f5bdd..3fdd7e4 100644 --- a/src/main/java/kuit3/backend/common/exception_handler/UserExceptionControllerAdvice.java +++ b/src/main/java/kuit3/backend/common/exception_handler/UserExceptionControllerAdvice.java @@ -1,8 +1,8 @@ package kuit3.backend.common.exception_handler; -import jakarta.annotation.Priority; import kuit3.backend.common.exception.UserException; import kuit3.backend.common.response.BaseErrorResponse; +import jakarta.annotation.Priority; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -20,6 +20,7 @@ public class UserExceptionControllerAdvice { @ExceptionHandler(UserException.class) public BaseErrorResponse handle_UserException(UserException e) { log.error("[handle_UserException]", e); - return new BaseErrorResponse(INVALID_USER_VALUE, e.getMessage()); + return new BaseErrorResponse(e.getExceptionStatus(), e.getMessage()); } -} \ No newline at end of file + +} diff --git a/src/main/java/kuit3/backend/common/interceptor/JwtAuthInterceptor.java b/src/main/java/kuit3/backend/common/interceptor/JwtAuthInterceptor.java index 3196eaf..74ebaab 100644 --- a/src/main/java/kuit3/backend/common/interceptor/JwtAuthInterceptor.java +++ b/src/main/java/kuit3/backend/common/interceptor/JwtAuthInterceptor.java @@ -1,13 +1,12 @@ package kuit3.backend.common.interceptor; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import kuit3.backend.common.exception.jwt.unauthorized.JwtExpiredTokenException; -import kuit3.backend.common.exception.jwt.unauthorized.JwtInvalidTokenException; import kuit3.backend.common.exception.jwt.bad_request.JwtNoTokenException; import kuit3.backend.common.exception.jwt.bad_request.JwtUnsupportedTokenException; +import kuit3.backend.common.exception.jwt.unauthorized.JwtExpiredTokenException; +import kuit3.backend.common.exception.jwt.unauthorized.JwtInvalidTokenException; import kuit3.backend.jwt.JwtProvider; -import kuit3.backend.service.AuthService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; @@ -24,10 +23,10 @@ public class JwtAuthInterceptor implements HandlerInterceptor { private static final String JWT_TOKEN_PREFIX = "Bearer "; private final JwtProvider jwtProvider; - private final AuthService authService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + log.info("[JwtAuthInterceptor.preHandle]"); String accessToken = resolveAccessToken(request); validateAccessToken(accessToken); @@ -35,18 +34,17 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons String email = jwtProvider.getPrincipal(accessToken); validatePayload(email); - long userId = authService.getUserIdByEmail(email); - request.setAttribute("userId", userId); + request.setAttribute("userid", 1); return true; } - private String resolveAccessToken(HttpServletRequest request) { + public String resolveAccessToken(HttpServletRequest request) { String token = request.getHeader(HttpHeaders.AUTHORIZATION); validateToken(token); return token.substring(JWT_TOKEN_PREFIX.length()); } - private void validateToken(String token) { + public void validateToken(String token) { if (token == null) { throw new JwtNoTokenException(TOKEN_NOT_FOUND); } @@ -55,16 +53,19 @@ private void validateToken(String token) { } } - private void validateAccessToken(String accessToken) { + public void validateAccessToken(String accessToken) { if (jwtProvider.isExpiredToken(accessToken)) { throw new JwtExpiredTokenException(EXPIRED_TOKEN); } } - private void validatePayload(String email) { + public void validatePayload(String email) { if (email == null) { throw new JwtInvalidTokenException(INVALID_TOKEN); } } -} \ No newline at end of file + public String getEmail(String accessToken) { + return jwtProvider.getPrincipal(accessToken); + } +} diff --git a/src/main/java/kuit3/backend/common/response/BaseErrorResponse.java b/src/main/java/kuit3/backend/common/response/BaseErrorResponse.java index a6214c0..41b8163 100644 --- a/src/main/java/kuit3/backend/common/response/BaseErrorResponse.java +++ b/src/main/java/kuit3/backend/common/response/BaseErrorResponse.java @@ -1,11 +1,11 @@ package kuit3.backend.common.response; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; import kuit3.backend.common.response.status.ResponseStatus; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.Getter; import java.time.LocalDateTime; - +// 실패 응답 객체 @Getter @JsonPropertyOrder({"code", "status", "message", "timestamp"}) public class BaseErrorResponse implements ResponseStatus { @@ -44,4 +44,4 @@ public String getMessage() { return message; } -} \ No newline at end of file +} diff --git a/src/main/java/kuit3/backend/common/response/BaseResponse.java b/src/main/java/kuit3/backend/common/response/BaseResponse.java index f2f9560..c4e5c48 100644 --- a/src/main/java/kuit3/backend/common/response/BaseResponse.java +++ b/src/main/java/kuit3/backend/common/response/BaseResponse.java @@ -1,12 +1,12 @@ package kuit3.backend.common.response; +import kuit3.backend.common.response.status.ResponseStatus; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import kuit3.backend.common.response.status.ResponseStatus; import lombok.Getter; import static kuit3.backend.common.response.status.BaseExceptionResponseStatus.SUCCESS; - +// 성공 응답 객체 @Getter @JsonPropertyOrder({"code", "status", "message", "result"}) public class BaseResponse implements ResponseStatus { @@ -40,4 +40,4 @@ public String getMessage() { return message; } -} \ No newline at end of file +} diff --git a/src/main/java/kuit3/backend/common/response/status/BaseExceptionResponseStatus.java b/src/main/java/kuit3/backend/common/response/status/BaseExceptionResponseStatus.java index 3354ad9..72a76ad 100644 --- a/src/main/java/kuit3/backend/common/response/status/BaseExceptionResponseStatus.java +++ b/src/main/java/kuit3/backend/common/response/status/BaseExceptionResponseStatus.java @@ -1,6 +1,7 @@ package kuit3.backend.common.response.status; import lombok.RequiredArgsConstructor; +import org.hibernate.validator.internal.constraintvalidators.hv.ru.INNValidator; import org.springframework.http.HttpStatus; @RequiredArgsConstructor @@ -42,10 +43,18 @@ 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: Restaurant 오류 + */ + INVALID_RESTAURANT_VALUE(6000,HttpStatus.BAD_REQUEST.value(),"식당등록 요청에서 잘못된 값이 존재합니다."), + DUPLICATE_PHONE(6001,HttpStatus.BAD_REQUEST.value(),"이미 존재하는 전화번호입니다."), + INVALID_RESTAURANT_STATUS(6002,HttpStatus.BAD_REQUEST.value(),"잘못된 식당 status입니다."), + RESTAURANT_NOT_FOUND(6003,HttpStatus.BAD_REQUEST.value(),"존재하지 않는 식당입니다."); private final int code; private final int status; diff --git a/src/main/java/kuit3/backend/common/response/status/ResponseStatus.java b/src/main/java/kuit3/backend/common/response/status/ResponseStatus.java index 6fc0dad..6795f70 100644 --- a/src/main/java/kuit3/backend/common/response/status/ResponseStatus.java +++ b/src/main/java/kuit3/backend/common/response/status/ResponseStatus.java @@ -8,4 +8,4 @@ public interface ResponseStatus { String getMessage(); -} \ No newline at end of file +} diff --git a/src/main/java/kuit3/backend/config/SecurityConfig.java b/src/main/java/kuit3/backend/config/SecurityConfig.java index 35335ff..6eb7b1d 100644 --- a/src/main/java/kuit3/backend/config/SecurityConfig.java +++ b/src/main/java/kuit3/backend/config/SecurityConfig.java @@ -1,12 +1,9 @@ package kuit3.backend.config; - import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; -import org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @@ -23,15 +20,11 @@ public PasswordEncoder passwordEncoder() { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - http - .csrf(AbstractHttpConfigurer::disable) - - .formLogin(FormLoginConfigurer::disable) - - .sessionManagement((sessionManagement) -> - sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS) - ); + .csrf().disable() + .formLogin().disable() + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); return http.build(); } -} \ No newline at end of file + +} diff --git a/src/main/java/kuit3/backend/config/WebConfig.java b/src/main/java/kuit3/backend/config/WebConfig.java index 2f5ebf4..050a5ce 100644 --- a/src/main/java/kuit3/backend/config/WebConfig.java +++ b/src/main/java/kuit3/backend/config/WebConfig.java @@ -28,4 +28,5 @@ public void addInterceptors(InterceptorRegistry registry) { public void addArgumentResolvers(List resolvers) { resolvers.add(jwtAuthHandlerArgumentResolver); } -} \ No newline at end of file + +} diff --git a/src/main/java/kuit3/backend/controller/AuthController.java b/src/main/java/kuit3/backend/controller/AuthController.java index 8d480ce..4d83f7d 100644 --- a/src/main/java/kuit3/backend/controller/AuthController.java +++ b/src/main/java/kuit3/backend/controller/AuthController.java @@ -1,6 +1,6 @@ package kuit3.backend.controller; -import kuit3.backend.common.argument_resolver.PreAuthorize; +import kuit3.backend.common.argument_resolver.JWTAuthorize; import kuit3.backend.common.exception.UserException; import kuit3.backend.common.response.BaseResponse; import kuit3.backend.dto.auth.LoginRequest; @@ -28,6 +28,7 @@ public class AuthController { */ @PostMapping("/login") public BaseResponse login(@Validated @RequestBody LoginRequest authRequest, BindingResult bindingResult) { + log.info("[AuthController.login]"); if (bindingResult.hasErrors()) { throw new UserException(INVALID_USER_VALUE, getErrorMessages(bindingResult)); } @@ -38,8 +39,9 @@ public BaseResponse login(@Validated @RequestBody LoginRequest au * 인가(JWT 검증) 테스트 */ @GetMapping("/test") - public BaseResponse checkAuthorization(@PreAuthorize Long userId) { - return new BaseResponse<>("userId=" + userId); + public BaseResponse checkAuthorization(@JWTAuthorize long userid) { + log.info("[AuthController.checkAuthorization]"); + return new BaseResponse<>("userid=" + userid); } } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/controller/ResponseController.java b/src/main/java/kuit3/backend/controller/ResponseController.java new file mode 100644 index 0000000..fd9c36b --- /dev/null +++ b/src/main/java/kuit3/backend/controller/ResponseController.java @@ -0,0 +1,24 @@ +package kuit3.backend.controller; + +import kuit3.backend.common.response.BaseErrorResponse; +import kuit3.backend.common.response.BaseResponse; +import kuit3.backend.temp.UserData; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static kuit3.backend.common.response.status.BaseExceptionResponseStatus.BAD_REQUEST; + +@RestController +public class ResponseController { + + @RequestMapping("/base-response") + public BaseResponse getSuccessResponse(){ + UserData userData = new UserData("soeun", 24); // @AllArgsConstructor + return new BaseResponse<>(userData); + } + + @RequestMapping("/base-error-response") + public BaseErrorResponse getErrorResponse(){ + return new BaseErrorResponse(BAD_REQUEST); + } +} diff --git a/src/main/java/kuit3/backend/controller/RestaurantController.java b/src/main/java/kuit3/backend/controller/RestaurantController.java new file mode 100644 index 0000000..f3615d7 --- /dev/null +++ b/src/main/java/kuit3/backend/controller/RestaurantController.java @@ -0,0 +1,92 @@ +package kuit3.backend.controller; + +import kuit3.backend.common.exception.UserException; +import kuit3.backend.common.response.BaseResponse; +import kuit3.backend.dto.restaurant.GetRestaurantResponse; +import kuit3.backend.dto.restaurant.PostRestaurantRequest; +import kuit3.backend.service.RestaurantService; +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 kuit3.backend.common.response.status.BaseExceptionResponseStatus.INVALID_RESTAURANT_STATUS; +import static kuit3.backend.common.response.status.BaseExceptionResponseStatus.INVALID_RESTAURANT_VALUE; +import static kuit3.backend.common.response.status.BaseExceptionResponseStatus.DUPLICATE_PHONE; +import static kuit3.backend.util.BindingResultUtils.getErrorMessages; + +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/restaurant") +public class RestaurantController { + + private final RestaurantService restaurantService; + + /** + * 레스토랑 등록 + */ + @PostMapping("") + public BaseResponse registerRestaurant(@Validated @RequestBody PostRestaurantRequest postRestaurantRequest, BindingResult bindingResult) { + log.info("[RestaurantController.registerRestaurant]"); + if (bindingResult.hasErrors()) { + throw new UserException(INVALID_RESTAURANT_VALUE, getErrorMessages(bindingResult)); + } + long restaurantId = restaurantService.registerRestaurant(postRestaurantRequest); + return new BaseResponse<>(restaurantId); + } + + /** + * 레스토랑 상태 수정 + */ + @PatchMapping("/{restaurantid}/status") + public BaseResponse modifyRestaurantStatus(@PathVariable long restaurantid, @RequestParam String status) { + log.info("[RestaurantController.modifyRestaurantStatus]"); + restaurantService.updateRestaurantStatus(restaurantid, status); + return new BaseResponse<>(null); + } + + /** + * 레스토랑 정보 수정 + */ + @PutMapping("/{restaurantid}") + public BaseResponse modifyRestaurantDetails(@PathVariable long restaurantid, + @Validated @RequestBody PostRestaurantRequest postRestaurantRequest, + BindingResult bindingResult) { + log.info("[RestaurantController.modifyRestaurantDetails]"); + if (bindingResult.hasErrors()) { + throw new UserException(INVALID_RESTAURANT_VALUE, getErrorMessages(bindingResult)); + } + restaurantService.updateRestaurantDetails(restaurantid, postRestaurantRequest); + return new BaseResponse<>(null); + } + + /** + * 레스토랑 목록 조회 + */ + @GetMapping("") + public BaseResponse> getRestaurants( + @RequestParam(required = false, defaultValue = "") String name, + @RequestParam(required = false, defaultValue = "") String location, + @RequestParam(required = false, defaultValue = "Open") String status, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + log.info("[RestaurantController.getRestaurants]"); + if (!status.equals("Close") && !status.equals("Open")) { + throw new UserException(INVALID_RESTAURANT_STATUS); + } + return new BaseResponse<>(restaurantService.getRestaurants(name, location, status, page, size)); + } + + /** + * 레스토랑 ID로 레스토랑 조회 + */ + @GetMapping("/{restaurantid}") + public BaseResponse getRestaurantById(@PathVariable long restaurantid) { + log.info("[RestaurantController.getRestaurantById]"); + return new BaseResponse<>(restaurantService.getRestaurantById(restaurantid)); + } +} \ No newline at end of file diff --git a/src/main/java/kuit3/backend/controller/UserController.java b/src/main/java/kuit3/backend/controller/UserController.java index 70b712b..9cf1722 100644 --- a/src/main/java/kuit3/backend/controller/UserController.java +++ b/src/main/java/kuit3/backend/controller/UserController.java @@ -1,5 +1,6 @@ package kuit3.backend.controller; +import kuit3.backend.common.argument_resolver.JWTAuthorize; import kuit3.backend.common.exception.UserException; import kuit3.backend.common.response.BaseResponse; import kuit3.backend.dto.user.*; @@ -19,7 +20,7 @@ @Slf4j @RestController @RequiredArgsConstructor -@RequestMapping("/users") +@RequestMapping("/user") public class UserController { private final UserService userService; @@ -29,6 +30,7 @@ public class UserController { */ @PostMapping("") public BaseResponse signUp(@Validated @RequestBody PostUserRequest postUserRequest, BindingResult bindingResult) { + log.info("[UserController.signUp]"); if (bindingResult.hasErrors()) { throw new UserException(INVALID_USER_VALUE, getErrorMessages(bindingResult)); } @@ -38,31 +40,35 @@ public BaseResponse signUp(@Validated @RequestBody PostUserReq /** * 회원 휴면 */ - @PatchMapping("/{userId}/dormant") - public BaseResponse modifyUserStatus_dormant(@PathVariable long userId) { - userService.modifyUserStatus_dormant(userId); + @PatchMapping("/Inactive") + public BaseResponse modifyUserStatus_Inactive(@JWTAuthorize long userid) { + log.info("[UserController.modifyUserStatus_Inactive]"); + userService.modifyUserStatus_Inactive(userid); return new BaseResponse<>(null); +// USER_NOT_FOUND } /** * 회원 탈퇴 */ - @PatchMapping("/{userId}/deleted") - public BaseResponse modifyUserStatus_deleted(@PathVariable long userId) { - userService.modifyUserStatus_deleted(userId); + @PatchMapping("/deleted") + public BaseResponse modifyUserStatus_deleted(@JWTAuthorize long userid) { + log.info("[UserController.modifyUserStatus_delete]"); + userService.modifyUserStatus_deleted(userid); return new BaseResponse<>(null); } /** * 닉네임 변경 */ - @PatchMapping("/{userId}/nickname") - public BaseResponse modifyNickname(@PathVariable long userId, + @PatchMapping("/name") + public BaseResponse modifyNickname(@JWTAuthorize long userid, @Validated @RequestBody PatchNicknameRequest patchNicknameRequest, BindingResult bindingResult) { + log.info("[UserController.modifyNickname]"); if (bindingResult.hasErrors()) { throw new UserException(INVALID_USER_VALUE, getErrorMessages(bindingResult)); } - userService.modifyNickname(userId, patchNicknameRequest.getNickname()); + userService.modifyNickname(userid, patchNicknameRequest.getName()); return new BaseResponse<>(null); } @@ -71,12 +77,15 @@ public BaseResponse modifyNickname(@PathVariable long userId, */ @GetMapping("") public BaseResponse> getUsers( - @RequestParam(required = false, defaultValue = "") String nickname, + @RequestParam(required = false, defaultValue = "") String name, @RequestParam(required = false, defaultValue = "") String email, - @RequestParam(required = false, defaultValue = "active") String status) { - if (!status.equals("active") && !status.equals("dormant") && !status.equals("deleted")) { + @RequestParam(required = false, defaultValue = "Active") String status) { + log.info("[UserController.getUsers]"); + if (!status.equals("Active") && !status.equals("Inactive") && !status.equals("Deleted")) { throw new UserException(INVALID_USER_STATUS); } - return new BaseResponse<>(userService.getUsers(nickname, email, status)); + return new BaseResponse<>(userService.getUsers(name, email, status)); } + + } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/dao/RestaurantDao.java b/src/main/java/kuit3/backend/dao/RestaurantDao.java new file mode 100644 index 0000000..d4caa05 --- /dev/null +++ b/src/main/java/kuit3/backend/dao/RestaurantDao.java @@ -0,0 +1,120 @@ +package kuit3.backend.dao; + +import kuit3.backend.dto.restaurant.PostRestaurantRequest; +import kuit3.backend.dto.restaurant.RestaurantDto; +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 javax.sql.DataSource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Slf4j +@Repository +public class RestaurantDao { + + private final NamedParameterJdbcTemplate jdbcTemplate; + + public RestaurantDao(DataSource dataSource) { + this.jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); + } + + // 레스토랑 생성 + public long createRestaurant(PostRestaurantRequest postRestaurantRequest) { + String sql = "insert into Restaurant(name, location, phone, category, min_order_amount, status) " + + "values(:name, :location, :phone, :category, :minOrderAmount, :status)"; + + SqlParameterSource param = new BeanPropertySqlParameterSource(postRestaurantRequest); + KeyHolder keyHolder = new GeneratedKeyHolder(); + jdbcTemplate.update(sql, param, keyHolder); + + return Objects.requireNonNull(keyHolder.getKey()).longValue(); + } + + // 레스토랑 상태 변경 + public int modifyRestaurantStatus(long restaurantid, String status) { + String sql = "update Restaurant set status=:status where restaurantid=:restaurantid"; + Map param = Map.of( + "status", status, + "restaurantid", restaurantid); + return jdbcTemplate.update(sql, param); + } + + // 디테일 수정 + public int modifyRestaurantDetails(long restaurantid, String name, String location, String phone, String category, int minOrderAmount) { + String sql = "update Restaurant set name=:name, location=:location, phone=:phone, category=:category, min_order_amount=:minOrderAmount where restaurantid=:restaurantid"; + Map param = Map.of( + "name", name, + "location", location, + "phone", phone, + "category", category, + "minOrderAmount", minOrderAmount, + "restaurantid", restaurantid); + return jdbcTemplate.update(sql, param); + } + + public List getRestaurants(String name, String location, String status, int offset, int limit) { + String sql = "select restaurantid, name, location, phone, category, min_order_amount, status from Restaurant " + + "where name like :name and location like :location"; + + Map param = Map.of( + "name", "%" + name + "%", + "location", "%" + location + "%" + ); + + if (status != null && !status.isEmpty()) { + sql += " and status = :status"; + param = new HashMap<>(param); + param.put("status", status); + } + + sql += " limit :limit offset :offset"; + param.put("limit", limit); + param.put("offset", offset); + + return jdbcTemplate.query(sql, param, + (rs, rowNum) -> new RestaurantDto( + rs.getLong("restaurantid"), + rs.getString("name"), + rs.getString("location"), + rs.getString("phone"), + rs.getString("category"), + rs.getInt("min_order_amount"), + rs.getString("status")) + ); + } + + public RestaurantDto getRestaurantById(long restaurantid) { + String sql = "select restaurantid, name, location, phone, category, min_order_amount, status from Restaurant where restaurantid=:restaurantid"; + Map param = Map.of("restaurantid", restaurantid); + return jdbcTemplate.queryForObject(sql, param, + (rs, rowNum) -> new RestaurantDto( + rs.getLong("restaurantid"), + rs.getString("name"), + rs.getString("location"), + rs.getString("phone"), + rs.getString("category"), + rs.getInt("min_order_amount"), + rs.getString("status")) + ); + } + + public long getRestaurantIdByName(String name) { + String sql = "select restaurantid from Restaurant where name=:name"; + Map param = Map.of("name", name); + return jdbcTemplate.queryForObject(sql, param, Long.class); + } + + public boolean hasDuplicatePhone(String phone) { + String sql = "select exists(select phone from restaurant where phone=:phone)"; + Map param = Map.of("phone", phone); + return Boolean.TRUE.equals(jdbcTemplate.queryForObject(sql, param, Boolean.class)); + } +} \ No newline at end of file diff --git a/src/main/java/kuit3/backend/dao/UserDao.java b/src/main/java/kuit3/backend/dao/UserDao.java index 4447633..9d5881e 100644 --- a/src/main/java/kuit3/backend/dao/UserDao.java +++ b/src/main/java/kuit3/backend/dao/UserDao.java @@ -4,6 +4,7 @@ import kuit3.backend.dto.user.PostUserRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.jdbc.support.GeneratedKeyHolder; @@ -18,7 +19,7 @@ @Slf4j @Repository public class UserDao { - + // DB 접근할때 Dao private final NamedParameterJdbcTemplate jdbcTemplate; public UserDao(DataSource dataSource) { @@ -26,20 +27,20 @@ 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)"; Map 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'))"; - Map param = Map.of("nickname", nickname); + public boolean hasDuplicateNickName(String name) { + String sql = "select exists(select email from user where name=:name)"; + Map param = Map.of("name", name); return Boolean.TRUE.equals(jdbcTemplate.queryForObject(sql, param, boolean.class)); } public long createUser(PostUserRequest postUserRequest) { - String sql = "insert into user(email, password, phone_number, nickname, profile_image) " + - "values(:email, :password, :phoneNumber, :nickname, :profileImage)"; + String sql = "insert into user(email, password, phone, name) " + + "values(:email, :password, :phone, :name)"; SqlParameterSource param = new BeanPropertySqlParameterSource(postUserRequest); KeyHolder keyHolder = new GeneratedKeyHolder(); @@ -48,58 +49,68 @@ public long createUser(PostUserRequest postUserRequest) { return Objects.requireNonNull(keyHolder.getKey()).longValue(); } - public List 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"; + public int modifyUserStatus_Inactive(long userid) { + String sql = "update user set status=:status where userid=:userid"; + Map param = Map.of( + "status", "Inactive", + "userid", userid); + return jdbcTemplate.update(sql, param); + } + + public int modifyUserStatus_deleted(long userid) { + String sql = "update user set status=:status where userid=:userid"; + Map param = Map.of( + "status", "Deleted", + "userid", userid); + return jdbcTemplate.update(sql, param); + } + + public int modifyNickname(long userid, String name) { + String sql = "update user set name=:name where userid=:userid"; + Map param = Map.of( + "name", name, + "userid", userid); + return jdbcTemplate.update(sql, param); + } + + public List getUsers(String name, String email, String status) { + String sql = "select email, phone, name, status from user " + + "where name like :name and email like :email and status=:status"; Map param = Map.of( - "nickname", "%" + nickname + "%", + "name", "%" + name + "%", "email", "%" + email + "%", "status", status); return jdbcTemplate.query(sql, param, (rs, rowNum) -> new GetUserResponse( rs.getString("email"), - rs.getString("phone_number"), - rs.getString("nickname"), - rs.getString("profile_image"), + rs.getString("phone"), + rs.getString("name"), rs.getString("status")) ); } public long getUserIdByEmail(String email) { - String sql = "select user_id from user where email=:email and status='active'"; + String sql = "select userid from user where email=:email and status='active'"; Map param = Map.of("email", email); return jdbcTemplate.queryForObject(sql, param, long.class); } - public String getPasswordByUserId(long userId) { - String sql = "select password from user where user_id=:user_id and status='active'"; - Map param = Map.of("user_id", userId); + public String getPasswordByUserId(long userid) { + String sql = "select password from user where userid=:userid and status='active'"; + Map param = Map.of("userid", userid); return jdbcTemplate.queryForObject(sql, param, String.class); } - public int modifyUserStatus_dormant(long userId) { - String sql = "update user set status=:status where user_id=:user_id"; - Map param = Map.of( - "status", "dormant", - "user_id", userId); - return jdbcTemplate.update(sql, param); - } - - public int modifyUserStatus_deleted(long userId) { - String sql = "update user set status=:status where user_id=:user_id"; - Map param = Map.of( - "status", "deleted", - "user_id", userId); - return jdbcTemplate.update(sql, param); - } - - public int modifyNickname(long userId, String nickname) { - String sql = "update user set nickname=:nickname where user_id=:user_id"; - Map param = Map.of( - "nickname", nickname, - "user_id", userId); + public int modifyUserInfo(long userid,String name, String email, String phone,String password) { + String sql = "update user set email=:email, name=:name, phone=:phone, password=:password where userid=:userid"; + MapSqlParameterSource param = (MapSqlParameterSource) Map.of( + "name", name, + "email", email, + "phone", phone, + "password", password, + "userid", userid); return jdbcTemplate.update(sql, param); } } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/dto/restaurant/GetRestaurantResponse.java b/src/main/java/kuit3/backend/dto/restaurant/GetRestaurantResponse.java new file mode 100644 index 0000000..6fa1943 --- /dev/null +++ b/src/main/java/kuit3/backend/dto/restaurant/GetRestaurantResponse.java @@ -0,0 +1,20 @@ +package kuit3.backend.dto.restaurant; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class GetRestaurantResponse { + private long restaurantid; + private String name; + private String location; + private String phone; + private String category; + private int minOrderAmount; + private String status; +} diff --git a/src/main/java/kuit3/backend/dto/restaurant/PostRestaurantRequest.java b/src/main/java/kuit3/backend/dto/restaurant/PostRestaurantRequest.java new file mode 100644 index 0000000..7bd9d5a --- /dev/null +++ b/src/main/java/kuit3/backend/dto/restaurant/PostRestaurantRequest.java @@ -0,0 +1,19 @@ +package kuit3.backend.dto.restaurant; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class PostRestaurantRequest { + private String name; + private String location; + private String phone; + private String category; + private int minOrderAmount; + private String status; +} diff --git a/src/main/java/kuit3/backend/dto/restaurant/RestaurantDto.java b/src/main/java/kuit3/backend/dto/restaurant/RestaurantDto.java new file mode 100644 index 0000000..5ab9b91 --- /dev/null +++ b/src/main/java/kuit3/backend/dto/restaurant/RestaurantDto.java @@ -0,0 +1,20 @@ +package kuit3.backend.dto.restaurant; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class RestaurantDto { + private long restaurantid; + private String name; + private String location; + private String phone; + private String category; + private int minOrderAmount; + private String status; +} diff --git a/src/main/java/kuit3/backend/dto/restaurant/RestaurantStatusRequest.java b/src/main/java/kuit3/backend/dto/restaurant/RestaurantStatusRequest.java new file mode 100644 index 0000000..544c0a5 --- /dev/null +++ b/src/main/java/kuit3/backend/dto/restaurant/RestaurantStatusRequest.java @@ -0,0 +1,14 @@ +package kuit3.backend.dto.restaurant; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class RestaurantStatusRequest { + private String status; +} diff --git a/src/main/java/kuit3/backend/dto/user/GetUserResponse.java b/src/main/java/kuit3/backend/dto/user/GetUserResponse.java index 1d1ab4c..f88fe6c 100644 --- a/src/main/java/kuit3/backend/dto/user/GetUserResponse.java +++ b/src/main/java/kuit3/backend/dto/user/GetUserResponse.java @@ -12,8 +12,8 @@ public class GetUserResponse { private String email; - private String phoneNumber; - private String nickname; - private String profileImage; + private String phone; + private String name; private String status; + } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/dto/user/PatchNicknameRequest.java b/src/main/java/kuit3/backend/dto/user/PatchNicknameRequest.java index dc2b122..3a023c4 100644 --- a/src/main/java/kuit3/backend/dto/user/PatchNicknameRequest.java +++ b/src/main/java/kuit3/backend/dto/user/PatchNicknameRequest.java @@ -10,7 +10,7 @@ @NoArgsConstructor public class PatchNicknameRequest { - @NotNull(message = "nickname: {NotNull}") - private String nickname; + @NotNull(message = "name: {NotNull}") + private String name; } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/dto/user/PostLoginRequest.java b/src/main/java/kuit3/backend/dto/user/PostLoginRequest.java index 5cb0232..1f07673 100644 --- a/src/main/java/kuit3/backend/dto/user/PostLoginRequest.java +++ b/src/main/java/kuit3/backend/dto/user/PostLoginRequest.java @@ -15,4 +15,5 @@ public class PostLoginRequest { @NotBlank(message = "password: {NotBlank}") private String password; + } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/dto/user/PostLoginResponse.java b/src/main/java/kuit3/backend/dto/user/PostLoginResponse.java index e898ec7..6c1fffb 100644 --- a/src/main/java/kuit3/backend/dto/user/PostLoginResponse.java +++ b/src/main/java/kuit3/backend/dto/user/PostLoginResponse.java @@ -2,11 +2,15 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; @Getter +@Setter +@NoArgsConstructor @AllArgsConstructor public class PostLoginResponse { - private long userId; private String jwt; + } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/dto/user/PostUserRequest.java b/src/main/java/kuit3/backend/dto/user/PostUserRequest.java index dddd102..ce2f723 100644 --- a/src/main/java/kuit3/backend/dto/user/PostUserRequest.java +++ b/src/main/java/kuit3/backend/dto/user/PostUserRequest.java @@ -26,18 +26,17 @@ public class PostUserRequest { message = "password: 대문자, 소문자, 특수문자가 적어도 하나씩은 있어야 합니다") private String password; - @NotBlank(message = "phoneNumber: {NotBlank}") - @Length(max = 20, message = "phoneNumber: 최대 {max}자리까지 가능합니다") - private String phoneNumber; + @NotBlank(message = "phone: {NotBlank}") + @Length(max = 20, message = "phone: 최대 {max}자리까지 가능합니다") + private String phone; @Nullable - @Length(max = 25, message = "nickname: 최대 {max}자리까지 가능합니다") - private String nickname; + @Length(max = 25, message = "name: 최대 {max}자리까지 가능합니다") + private String name; - @Nullable - private String profileImage; public void resetPassword(String encodedPassword) { this.password = encodedPassword; } + } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/dto/user/PostUserResponse.java b/src/main/java/kuit3/backend/dto/user/PostUserResponse.java index 4ebc26e..b0ade3d 100644 --- a/src/main/java/kuit3/backend/dto/user/PostUserResponse.java +++ b/src/main/java/kuit3/backend/dto/user/PostUserResponse.java @@ -7,6 +7,6 @@ @AllArgsConstructor public class PostUserResponse { - private long userId; private String jwt; + } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/service/AuthService.java b/src/main/java/kuit3/backend/service/AuthService.java index be51805..f1c9592 100644 --- a/src/main/java/kuit3/backend/service/AuthService.java +++ b/src/main/java/kuit3/backend/service/AuthService.java @@ -21,31 +21,32 @@ public class AuthService { private final UserDao userDao; private final PasswordEncoder passwordEncoder; - private final JwtProvider jwtProvider; + private final JwtProvider jwtTokenProvider; public LoginResponse login(LoginRequest authRequest) { + log.info("[AuthService.login]"); String email = authRequest.getEmail(); // TODO: 1. 이메일 유효성 확인 - long userId; + long userid; try { - userId = userDao.getUserIdByEmail(email); + userid = userDao.getUserIdByEmail(email); } catch (IncorrectResultSizeDataAccessException e) { throw new UserException(EMAIL_NOT_FOUND); } // TODO: 2. 비밀번호 일치 확인 - validatePassword(authRequest.getPassword(), userId); + validatePassword(authRequest.getPassword(), userid); // TODO: 3. JWT 갱신 - String updatedJwt = jwtProvider.createToken(email, userId); + String updatedJwt = jwtTokenProvider.createToken(email, userid); - return new LoginResponse(userId, updatedJwt); + return new LoginResponse(userid, updatedJwt); } - private void validatePassword(String password, long userId) { - String encodedPassword = userDao.getPasswordByUserId(userId); + private void validatePassword(String password, long userid) { + String encodedPassword = userDao.getPasswordByUserId(userid); if (!passwordEncoder.matches(password, encodedPassword)) { throw new UserException(PASSWORD_NO_MATCH); } diff --git a/src/main/java/kuit3/backend/service/RestaurantService.java b/src/main/java/kuit3/backend/service/RestaurantService.java new file mode 100644 index 0000000..2c9ded5 --- /dev/null +++ b/src/main/java/kuit3/backend/service/RestaurantService.java @@ -0,0 +1,79 @@ +package kuit3.backend.service; + +import kuit3.backend.common.exception.RestaurantException; +import kuit3.backend.common.exception.UserException; +import kuit3.backend.dao.RestaurantDao; +import kuit3.backend.dto.restaurant.GetRestaurantResponse; +import kuit3.backend.dto.restaurant.PostRestaurantRequest; +import kuit3.backend.dto.restaurant.RestaurantDto; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +import static kuit3.backend.common.response.status.BaseExceptionResponseStatus.*; + +@Slf4j +@Service +@RequiredArgsConstructor +public class RestaurantService { + + private final RestaurantDao restaurantDao; + + public long registerRestaurant(PostRestaurantRequest postRestaurantRequest) { + validatePhone(postRestaurantRequest.getPhone()); + return restaurantDao.createRestaurant(postRestaurantRequest); + } + + public void updateRestaurantStatus(long restaurantid, String status) { + if (restaurantDao.modifyRestaurantStatus(restaurantid, status) != 1) { + throw new RestaurantException(RESTAURANT_NOT_FOUND); + } + } + + public void updateRestaurantDetails(long restaurantid, PostRestaurantRequest postRestaurantRequest) { + if (restaurantDao.modifyRestaurantDetails(restaurantid, postRestaurantRequest.getName(), postRestaurantRequest.getLocation(), + postRestaurantRequest.getPhone(), postRestaurantRequest.getCategory(), postRestaurantRequest.getMinOrderAmount()) != 1) { + throw new RestaurantException(RESTAURANT_NOT_FOUND); + } + } + + public List getRestaurants(String name, String location, String status, int page, int size) { + int offset = page * size; + List restaurantDtos = restaurantDao.getRestaurants(name, location, status, offset, size); + return restaurantDtos.stream() + .map(dto -> new GetRestaurantResponse( + dto.getRestaurantid(), + dto.getName(), + dto.getLocation(), + dto.getPhone(), + dto.getCategory(), + dto.getMinOrderAmount(), + dto.getStatus())) + .collect(Collectors.toList()); + } + + public GetRestaurantResponse getRestaurantById(long restaurantid) { + RestaurantDto dto = restaurantDao.getRestaurantById(restaurantid); + if (dto == null) { + throw new RestaurantException(RESTAURANT_NOT_FOUND); + } + + return new GetRestaurantResponse( + dto.getRestaurantid(), + dto.getName(), + dto.getLocation(), + dto.getPhone(), + dto.getCategory(), + dto.getMinOrderAmount(), + dto.getStatus()); + } + + private void validatePhone(String phone) { + if (restaurantDao.hasDuplicatePhone(phone)) { + throw new RestaurantException(DUPLICATE_PHONE); + } + } +} \ No newline at end of file diff --git a/src/main/java/kuit3/backend/service/UserService.java b/src/main/java/kuit3/backend/service/UserService.java index 7a8dabd..98cbf64 100644 --- a/src/main/java/kuit3/backend/service/UserService.java +++ b/src/main/java/kuit3/backend/service/UserService.java @@ -9,7 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; + import java.util.List; @@ -24,14 +24,14 @@ public class UserService { private final PasswordEncoder passwordEncoder; private final JwtProvider jwtProvider; - @Transactional - public PostUserResponse signUp(PostUserRequest postUserRequest) { + public kuit3.backend.dto.user.PostUserResponse signUp(kuit3.backend.dto.user.PostUserRequest postUserRequest) { + log.info("[UserService.createUser]"); // TODO: 1. validation (중복 검사) validateEmail(postUserRequest.getEmail()); - String nickname = postUserRequest.getNickname(); - if (nickname != null) { - validateNickname(postUserRequest.getNickname()); + String name = postUserRequest.getName(); + if (name != null) { + validateNickname(postUserRequest.getName()); } // TODO: 2. password 암호화 @@ -39,38 +39,52 @@ public PostUserResponse signUp(PostUserRequest postUserRequest) { postUserRequest.resetPassword(encodedPassword); // TODO: 3. DB insert & userId 반환 - long userId = userDao.createUser(postUserRequest); + long userid = userDao.createUser(postUserRequest); // TODO: 4. JWT 토큰 생성 - String jwt = jwtProvider.createToken(postUserRequest.getEmail(), userId); + String jwt = jwtProvider.createToken(postUserRequest.getEmail(), userid); + + return new kuit3.backend.dto.user.PostUserResponse(jwt); + } - return new PostUserResponse(userId, jwt); + public kuit3.backend.dto.user.PostLoginResponse login(kuit3.backend.dto.user.PostLoginRequest postLoginRequest) { + log.info("[UserService.loginUser]"); + long userid=1; + String jwt = jwtProvider.createToken(postLoginRequest.getEmail(), userid); + return new kuit3.backend.dto.user.PostLoginResponse(jwt); } - public void modifyUserStatus_deleted(long userId) { - int affectedRows = userDao.modifyUserStatus_deleted(userId); + public void modifyUserStatus_Inactive(long userid) { + log.info("[UserService.modifyUserStatus_Inactive]"); + + int affectedRows = userDao.modifyUserStatus_Inactive(userid); if (affectedRows != 1) { - throw new DatabaseException(DATABASE_ERROR); + throw new UserException(USER_NOT_FOUND); } } - public void modifyUserStatus_dormant(long userId) { - int affectedRows = userDao.modifyUserStatus_dormant(userId); + public void modifyUserStatus_deleted(long userid) { + log.info("[UserService.modifyUserStatus_deleted]"); + + int affectedRows = userDao.modifyUserStatus_deleted(userid); if (affectedRows != 1) { - throw new DatabaseException(DATABASE_ERROR); + throw new UserException(USER_NOT_FOUND); } } - public void modifyNickname(long userId, String nickname) { - validateNickname(nickname); - int affectedRows = userDao.modifyNickname(userId, nickname); + public void modifyNickname(long userid, String name) { + log.info("[UserService.modifyNickname]"); + + validateNickname(name); + int affectedRows = userDao.modifyNickname(userid, name); if (affectedRows != 1) { - throw new DatabaseException(DATABASE_ERROR); + throw new UserException(USER_NOT_FOUND); } } - public List getUsers(String nickname, String email, String status) { - return userDao.getUsers(nickname, email, status); + public List getUsers(String name, String email, String status) { + log.info("[UserService.getUsers]"); + return userDao.getUsers(name, email, status); } private void validateEmail(String email) { @@ -79,9 +93,11 @@ private void validateEmail(String email) { } } - private void validateNickname(String nickname) { - if (userDao.hasDuplicateNickName(nickname)) { + private void validateNickname(String name) { + if (userDao.hasDuplicateNickName(name)) { throw new UserException(DUPLICATE_NICKNAME); } } + + } \ No newline at end of file diff --git a/src/main/java/kuit3/backend/temp/TempController.java b/src/main/java/kuit3/backend/temp/TempController.java new file mode 100644 index 0000000..f228f83 --- /dev/null +++ b/src/main/java/kuit3/backend/temp/TempController.java @@ -0,0 +1,69 @@ +package kuit3.backend.temp; + +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpEntity; +import org.springframework.stereotype.Controller; +import org.springframework.util.StreamUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +@Slf4j +@Controller +@RestController // @ResponseBody를 적용시켜준다 , @RequestBody는 생략 불가능 +public class TempController { + //Json 객체를 Java 객체로 변환하기 위한 objectMapper + private ObjectMapper objectMapper = new ObjectMapper(); + + // /request-body-json-v1을 가진 POST 요청을 가질 , 아래의 메소드가 실행 + @PostMapping("/request-body-json-v1") + public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException { + ServletInputStream inputStream = request.getInputStream(); + String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8); + log.info("messageBody={}", messageBody); + UserData userData= objectMapper.readValue(messageBody,UserData.class); + log.info("user name:{}, user age:{}", userData.getUsername(),userData.getAge()); + response.getWriter().write("ok"); + } + + @ResponseBody + @PostMapping("/request-body-json-v2") + public String requestBodyJsonV2(@RequestBody String message) throws IOException{ + UserData userData = objectMapper.readValue(message, UserData.class); + log.info("user name:{}, user age:{}", userData.getUsername(),userData.getAge()); + return "ok"; + } + + //objectMapper 없이 UserData 객체로 자동 변환 해줌 + @ResponseBody + @PostMapping("/request-body-json-v3") + public String requestBodyJsonV3(@RequestBody UserData userData){ + log.info("user name:{}, user age:{}", userData.getUsername(),userData.getAge()); + return "ok"; + } + + @ResponseBody + @PostMapping("/request-body-json-v4") + public String requestBodyJsonV4(HttpEntity httpEntity){ + UserData userData = httpEntity.getBody(); + log.info("user name:{}, user age:{}", userData.getUsername(),userData.getAge()); + return "ok"; + } + + //가장 많이 씀 + @ResponseBody + @PostMapping("/request-body-json-v5") + public UserData requestBodyJsonV5(@RequestBody UserData userData){ + log.info("user name:{}, user age:{}", userData.getUsername(),userData.getAge()); + return userData; + } + +} diff --git a/src/main/java/kuit3/backend/temp/UserData.java b/src/main/java/kuit3/backend/temp/UserData.java new file mode 100644 index 0000000..624a798 --- /dev/null +++ b/src/main/java/kuit3/backend/temp/UserData.java @@ -0,0 +1,13 @@ +package kuit3.backend.temp; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter //롬복어노테이션 , 기본 생성자 생략 가능 +@NoArgsConstructor +@AllArgsConstructor // 모든 필드를 파라미터를 넣을 수 있는 생성자 만듦 +public class UserData { + private String username; + private int age; +}