Skip to content
Merged
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
4 changes: 2 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.1'
id 'io.spring.dependency-management' version '1.1.7'
id 'org.springframework.boot' version '3.2.0' // 최신 Spring Boot 버전
id 'io.spring.dependency-management' version '1.1.3'
}

group = 'com.neighbors'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ public enum BaseResponseMessage {

//user
이미_존재하는_유저입니다("이미 존재하는 유저입니다"),
유저_이름_변경이_완료되었습니다("유저 이름 변경이 완료되었습니다"),
존재하지_않는_유저입니다("존재하지 않는 유저입니다"),
유저_이름의_길이는_1부터_5까지만_가능합니다("유저 이름의 길이는 1부터 5까지만 가능합니다"),

//jwt error message
JWT_토큰_오류입니다("JWT 토큰 오류입니다"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.neighbors.tohero.application.user.dto;

import org.hibernate.validator.constraints.Length;

public record UpdateUserName(
@Length(min = 1, max = 5)
String nickname
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.neighbors.tohero.application.user.service;

import com.neighbors.tohero.application.baseResponse.BaseResponse;
import com.neighbors.tohero.application.baseResponse.BaseResponseMessage;
import com.neighbors.tohero.application.baseResponse.BaseResponseStatus;
import com.neighbors.tohero.domain.user.service.UpdateUser;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {

private final UpdateUser updateUser;

public BaseResponse updateUserName(long userId, String nickname){

updateUser.updateUserName(userId, nickname);

return new BaseResponse(
BaseResponseStatus.OK,
BaseResponseMessage.유저_이름_변경이_완료되었습니다.getMessage()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class ErrorResponseUtil {

public static void setResponse(HttpServletResponse response, BaseResponseStatus responseStatus) throws IOException {

BaseResponse errorResponse = new BaseResponse(responseStatus, "");
BaseResponse errorResponse = new BaseResponse(responseStatus, "JWT TOKEN 오류입니다.");

response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setContentType("application/json");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import com.neighbors.tohero.common.security.CustomAccessDeniedHandler;
import com.neighbors.tohero.common.security.CustomJwtAuthenticationEntryPoint;
import com.neighbors.tohero.common.security.JwtAuthenticationFilter;
import jakarta.annotation.Priority;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
Expand All @@ -19,6 +19,7 @@
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
@Priority(0)
public class SecurityConfig {

private final JwtAuthenticationFilter jwtAuthenticationFilter;
Expand Down Expand Up @@ -46,7 +47,7 @@ SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
.httpBasic(AbstractHttpConfigurer::disable)//http 기본 인증 비활성화
.cors(Customizer.withDefaults())
.authorizeHttpRequests(auth -> auth
.requestMatchers(HttpMethod.POST, "/user").permitAll()
.requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()
.anyRequest().authenticated())
.sessionManagement(session -> {
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@

public interface UserRepository {
User createUser(User user);
void updateUserName(long userId, String nickname);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.neighbors.tohero.domain.user.service;

import com.neighbors.tohero.common.annotaion.DomainService;
import com.neighbors.tohero.domain.query.UserRepository;
import lombok.RequiredArgsConstructor;

@DomainService
@RequiredArgsConstructor
public class UpdateUser {

private final UserRepository userRepository;

public void updateUserName(long userId, String nickname) {
userRepository.updateUserName(userId, nickname);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ public UserEntity(String nickName, String email, Role role){
this.role = role;
}

public void changeNickname(final String nickName){
this.nickName = nickName;
}

public static UserEntity of(String nickName, String email, Role role) {
return new UserEntity(nickName, email, role);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.neighbors.tohero.infrastructure.query.impl;

import com.neighbors.tohero.application.baseResponse.BaseResponseMessage;
import com.neighbors.tohero.application.baseResponse.BaseResponseStatus;
import com.neighbors.tohero.common.exception.user.UserException;
import com.neighbors.tohero.domain.login.model.User;
import com.neighbors.tohero.domain.query.UserRepository;
import com.neighbors.tohero.infrastructure.entity.UserEntity;
import com.neighbors.tohero.infrastructure.mapper.UserMapper;
import com.neighbors.tohero.infrastructure.repository.UserEntityRepository;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

Expand All @@ -26,4 +30,16 @@ public User createUser(User user) {
UserEntity createdUserEntity = userEntityRepository.findByEmail(user.getEmail());
return userMapper.toDomain(createdUserEntity);
}

@Override
public void updateUserName(long userId, String nickname) {
UserEntity matchedUserEntity = userEntityRepository.findByUserId(userId)
.orElseThrow(() -> new UserException(
BaseResponseStatus.BAD_REQUEST,
BaseResponseMessage.존재하지_않는_유저입니다.getMessage()
));

matchedUserEntity.changeNickname(nickname);
userEntityRepository.save(matchedUserEntity);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

@Repository
public interface UserEntityRepository extends JpaRepository<UserEntity, Long> {
boolean existsByEmail(String email);
UserEntity findByEmail(String email);
Optional<UserEntity> findByUserId(long userId);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.neighbors.tohero.presentation;
package com.neighbors.tohero.presentation.controller;

import com.neighbors.tohero.application.baseResponse.BaseResponse;
import com.neighbors.tohero.application.notice.service.NoticeService;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.neighbors.tohero.presentation;
package com.neighbors.tohero.presentation.controller;

import com.neighbors.tohero.application.login.service.OAuthService;
import com.neighbors.tohero.application.baseResponse.BaseResponse;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.neighbors.tohero.presentation.controller;

import com.neighbors.tohero.application.baseResponse.BaseResponse;
import com.neighbors.tohero.application.user.dto.UpdateUserName;
import com.neighbors.tohero.application.user.service.UserService;
import com.neighbors.tohero.common.jwt.JwtUserDetails;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("")
public class UserController {

private final UserService userService;

@Operation(summary = "유저 API", description = "유저 이름 변경 API입니다.")
@PutMapping("/user/name")
public ResponseEntity<BaseResponse> updateUserName(
@Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail,
@ParameterObject @Validated UpdateUserName updateUserName
){
return ResponseEntity.ok()
.body(userService.updateUserName(jwtUserDetail.getUserId(), updateUserName.nickname()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.neighbors.tohero.presentation.exception_handler;

import com.neighbors.tohero.application.baseResponse.BaseResponse;
import com.neighbors.tohero.application.baseResponse.BaseResponseMessage;
import com.neighbors.tohero.application.baseResponse.BaseResponseStatus;
import jakarta.annotation.Priority;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

import static com.neighbors.tohero.application.baseResponse.BaseResponseMessage.유저_이름의_길이는_1부터_5까지만_가능합니다;

@Priority(0)
@RestControllerAdvice
public class UserExceptionControllerAdvice {

private final Map<String, BaseResponseMessage> fieldErrorMapper;

public UserExceptionControllerAdvice() {
fieldErrorMapper = new HashMap<>();
fieldErrorMapper.put("nickname", 유저_이름의_길이는_1부터_5까지만_가능합니다);
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<BaseResponse> handle_UserValidationException(MethodArgumentNotValidException e) {
BaseResponse response = new BaseResponse(
BaseResponseStatus.BAD_REQUEST,
fieldErrorMapper.get(e.getBindingResult().getFieldError().getField()).getMessage()
);

return ResponseEntity.badRequest()
.body(response);
}
}