Skip to content

Commit

Permalink
[feat] 유저 정보 수정 API 작성
Browse files Browse the repository at this point in the history
  • Loading branch information
chanwoo7 committed Aug 19, 2024
1 parent 1fbcbbe commit 8b57dd0
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class SignupDto {
@Past(message = "현재 날짜보다 이전 날짜여야 합니다.")
private LocalDate birthDate;

// FIXME: 아래 필드는 삭제 예정
@Email(message = "유효한 이메일 주소여야 합니다.")
private String email;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.book.backend.domain.auth.dto.SignupDto;
import com.book.backend.domain.user.entity.Gender;
import com.book.backend.domain.user.entity.User;
import com.book.backend.domain.user.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import org.modelmapper.ModelMapper;
import org.springframework.security.crypto.password.PasswordEncoder;
Expand All @@ -13,20 +14,14 @@
public class AuthMapper {

private final ModelMapper mapper;
private final UserMapper userMapper;
private final PasswordEncoder passwordEncoder;

public User convertToUser(SignupDto signupDto) {
User user = mapper.map(signupDto, User.class);
user.setGender(convertStringToGender(signupDto.getGender()));
user.setGender(userMapper.convertStringToGender(signupDto.getGender()));
user.setPassword(passwordEncoder.encode(signupDto.getPassword()));
return user;
}

private Gender convertStringToGender(String gender) {
return switch (gender) {
case "MAN" -> Gender.G1;
case "WOMAN" -> Gender.G2;
default -> Gender.G0;
};
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
package com.book.backend.domain.user.controller;

import com.book.backend.domain.user.dto.UserDto;
import com.book.backend.domain.user.dto.UserInfoDto;
import com.book.backend.domain.user.entity.User;
import com.book.backend.domain.user.mapper.UserMapper;
import com.book.backend.domain.user.service.UserService;
import com.book.backend.global.ResponseTemplate;
import com.book.backend.global.log.RequestLogger;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/user")
Expand All @@ -29,12 +26,22 @@ public class UserController {
public ResponseEntity<?> getUserInfo() {
log.trace("UserController > getUserInfo()");

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();

User user = userService.findByUsername(username);
User user = userService.loadLoggedinUser();
UserDto userDto = userMapper.convertToUserDto(user);

return responseTemplate.success(userDto, HttpStatus.OK);
}

@PutMapping("/info/edit")
public ResponseEntity<?> editUserInfo(@Valid @RequestBody UserInfoDto requestDto) {
log.trace("UserController > editUserInfo()");

User user = userService.loadLoggedinUser();
User updatedUser = userService.updateUserInfo(user, requestDto);

UserInfoDto userInfoDto = userMapper.convertToUserInfoDto(updatedUser);

return responseTemplate.success(userInfoDto, HttpStatus.OK);
}

}
25 changes: 25 additions & 0 deletions src/main/java/com/book/backend/domain/user/dto/UserInfoDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.book.backend.domain.user.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Past;
import jakarta.validation.constraints.Pattern;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDate;

@Getter
@Setter
@NoArgsConstructor
public class UserInfoDto {
@NotBlank(message = "닉네임은 필수 입력값입니다.")
private String nickname;

@NotBlank(message = "성별은 필수 입력값입니다.")
@Pattern(regexp = "NOT_SELECTED|MAN|WOMAN", message = "성별은 NOT_SELECTED, MAN, WOMAN 중 하나여야 합니다.")
private String gender;

@Past(message = "현재 날짜보다 이전 날짜여야 합니다.")
private LocalDate birthDate;
}
30 changes: 28 additions & 2 deletions src/main/java/com/book/backend/domain/user/mapper/UserMapper.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.book.backend.domain.user.mapper;

import com.book.backend.domain.user.dto.UserDto;
import com.book.backend.domain.user.dto.UserInfoDto;
import com.book.backend.domain.user.entity.Gender;
import com.book.backend.domain.user.entity.User;
import com.book.backend.domain.user.repository.UserRepository;
import com.book.backend.exception.CustomException;
import com.book.backend.exception.ErrorCode;
import lombok.RequiredArgsConstructor;
Expand All @@ -11,7 +14,6 @@
@Component
@RequiredArgsConstructor
public class UserMapper {

private final ModelMapper mapper;

public UserDto convertToUserDto(User user) {
Expand All @@ -20,8 +22,32 @@ public UserDto convertToUserDto(User user) {
}

UserDto userDto = mapper.map(user, UserDto.class);
userDto.setGender(user.getGender().name());
if (userDto.getGender() == null) {
userDto.setGender(user.getGender().name());
}

return userDto;
}

public UserInfoDto convertToUserInfoDto(User user) {
if (user == null) {
throw new CustomException(ErrorCode.USER_NOT_FOUND);
}

UserInfoDto userInfoDto = mapper.map(user, UserInfoDto.class);
userInfoDto.setGender(user.getGender().name());
if (userInfoDto.getGender() == null) {
userInfoDto.setGender(user.getGender().name());
}

return userInfoDto;
}

public Gender convertStringToGender(String gender) {
return switch (gender) {
case "MAN" -> Gender.G1;
case "WOMAN" -> Gender.G2;
default -> Gender.G0;
};
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,30 @@
package com.book.backend.domain.user.service;

import com.book.backend.domain.user.dto.UserInfoDto;
import com.book.backend.domain.user.entity.User;
import com.book.backend.domain.user.mapper.UserMapper;
import com.book.backend.domain.user.repository.UserRepository;
import com.book.backend.exception.CustomException;
import com.book.backend.exception.ErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional
@Transactional(readOnly = true)
public class UserService {
private final UserRepository userRepository;
private final UserMapper userMapper;

public User loadLoggedinUser() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();

return findByUsername(username);
}

public User findByUsername(String username) {
try {
Expand All @@ -29,4 +43,18 @@ public User findByKakaoId(String kakaoId) {
return userRepository.findByKakaoId(kakaoId)
.orElseThrow(IllegalArgumentException::new);
}

@Transactional
public User updateUserInfo(User user, UserInfoDto requestDto) {
if (user == null) {
throw new CustomException(ErrorCode.USER_NOT_FOUND);
}

user.setNickname(requestDto.getNickname());
user.setGender(userMapper.convertStringToGender(requestDto.getGender()));
user.setBirthDate(requestDto.getBirthDate());
userRepository.save(user);

return user;
}
}

0 comments on commit 8b57dd0

Please sign in to comment.