Skip to content

Commit

Permalink
feat: 사용자 정보 관련 기능 추가 (#13)
Browse files Browse the repository at this point in the history
  • Loading branch information
xxoznge authored Aug 6, 2024
1 parent 2030e70 commit b8d9a0b
Show file tree
Hide file tree
Showing 13 changed files with 150 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.foodgo.coremodule.security.annotation.UserResolver;
import com.foodgo.coremodule.security.jwt.dto.JwtDto;
import com.foodgo.coremodule.user.dto.request.PasswordUpdateRequest;
import com.foodgo.coremodule.user.dto.request.UserUpdateRequest;
import com.foodgo.coremodule.user.dto.response.UserDetailGetResponse;
import com.foodgo.coremodule.user.dto.response.UserUpdateResponse;
import com.foodgo.coremodule.user.service.UserQueryService;
Expand All @@ -25,6 +26,7 @@
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
Expand All @@ -48,6 +50,16 @@ public ApiResponse<UserRegisterResponse> register(
return ApiResponse.onSuccess(userService.register(request, file));
}

@GetMapping("/username")
public ApiResponse<Boolean> checkUsername(@RequestParam String username) {
return ApiResponse.onSuccess(userQueryService.checkUsername(username));
}

@GetMapping("/nickname")
public ApiResponse<Boolean> checkNickname(@RequestParam String nickname) {
return ApiResponse.onSuccess(userQueryService.checkNickname(nickname));
}

@GetMapping("/reissue")
public ApiResponse<JwtDto> reissueToken(@RequestHeader("RefreshToken") String refreshToken) {
return ApiResponse.onSuccess(userService.reissueToken(refreshToken));
Expand All @@ -70,8 +82,9 @@ public ApiResponse<UserDetailGetResponse> getMyUser(@UserResolver User authUser)
@PatchMapping(value = "/me", consumes = "multipart/form-data")
public ApiResponse<UserUpdateResponse> updateMyUser(
@UserResolver User user,
@RequestPart @Valid UserUpdateRequest request,
@RequestPart(value = "profileImage", required = false) MultipartFile file) {
return ApiResponse.onSuccess(userService.updateMyUser(user, file));
return ApiResponse.onSuccess(userService.updateMyUser(user, request, file));
}

@DeleteMapping("/me")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGE")
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers(allowedUrls).permitAll()
.anyRequest().authenticated()
.anyRequest().permitAll()
);

// Jwt Filter (with login)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import com.fasterxml.jackson.annotation.JsonProperty;
import com.foodgo.commonmodule.common.BaseEntity;
import com.foodgo.coremodule.user.enums.DiseaseType;
import com.foodgo.coremodule.user.enums.RoleType;
import com.foodgo.coremodule.user.enums.UsageType;
import com.foodgo.coremodule.user.enums.UserStatus;

import jakarta.persistence.*;
Expand All @@ -27,14 +29,30 @@ public class User extends BaseEntity {
@Column(name = "user_password", nullable = false)
private String password;

@Column(name = "user_nickname", nullable = false)
private String nickname;

@Column(name = "user_image_url")
private String imageUrl;

@Enumerated(EnumType.STRING)
@Column(name = "user_usagetype", nullable = false)
private UsageType usageType;

@Enumerated(EnumType.STRING)
@Column(name = "user_diseasetype", nullable = false)
private DiseaseType diseaseType;

@Column(name = "user_lifestyle", nullable = false)
private String lifeStyle;

@Column(name = "user_allergy", nullable = false)
private String allergy;

@Column(name = "user_roletype", nullable = false)
@Enumerated(EnumType.STRING)
private RoleType roleType;


@Column(name = "user_status", nullable = false)
@Enumerated(EnumType.STRING)
private UserStatus userStatus;
Expand All @@ -51,7 +69,12 @@ public void updatePassword(String password) {
this.password = password == null ? this.password : password;
}

public void update(String imageUrl) {
public void update(String imageUrl, String nickname, UsageType usageType, DiseaseType diseaseType, String lifeStyle, String allergy) {
this.nickname = nickname == null ? this.nickname : nickname;
this.imageUrl = imageUrl == null ? this.imageUrl : imageUrl;
this.usageType = usageType == null ? this.usageType : usageType;
this.diseaseType = diseaseType == null ? this.diseaseType : diseaseType;
this.lifeStyle = lifeStyle == null ? this.lifeStyle : lifeStyle;
this.allergy = allergy == null ? this.allergy : allergy;
}
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,51 @@
package com.foodgo.coremodule.user.dto.request;

import com.foodgo.coremodule.user.domain.User;
import com.foodgo.coremodule.user.enums.DiseaseType;
import com.foodgo.coremodule.user.enums.RoleType;
import com.foodgo.coremodule.user.enums.UsageType;
import com.foodgo.coremodule.user.enums.UserStatus;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;

public record UserRegisterRequest(

@NotBlank(message = "[ERROR] 아이디 입력은 필수입니다.")
@NotNull(message = "[ERROR] 아이디 입력은 필수입니다.")
String username,

@NotBlank(message = "[ERROR] 비밀번호 입력은 필수 입니다.")
@NotNull(message = "[ERROR] 비밀번호 입력은 필수 입니다.")
@Size(min = 8, message = "[ERROR] 비밀번호는 최소 8자리 이이어야 합니다.")
@Pattern(regexp = "^(?=.*[a-z])(?=.*\\d)(?=.*[!@#$%^&*]).{8,64}$", message = "[ERROR] 비밀번호는 8자 이상, 64자 이하이며 특수문자 한 개를 포함해야 합니다.")
String password
String password,

@NotNull(message = "[ERROR] 닉네임 입력은 필수입니다.")
String nickname,

@NotNull
UsageType usageType,

@NotNull
DiseaseType diseaseType,

@NotNull
String lifeStyle,

@NotNull
String allergy

) {

public User toEntity(String encodedPw) {
return User.builder()
.username(username)
.password(encodedPw)
.nickname(nickname)
.usageType(usageType)
.diseaseType(diseaseType)
.lifeStyle(lifeStyle)
.allergy(allergy)
.roleType(RoleType.USER)
.userStatus(UserStatus.ACTIVE)
.build();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@
package com.foodgo.coremodule.user.dto.request;

public record UserUpdateRequest() {
import com.foodgo.coremodule.user.enums.DiseaseType;
import com.foodgo.coremodule.user.enums.UsageType;

public record UserUpdateRequest(
String nickname,
UsageType usageType,
DiseaseType diseaseType,
String lifeStyle,
String allergy
) {
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,31 @@
package com.foodgo.coremodule.user.dto.response;

import com.foodgo.coremodule.user.domain.User;
import com.foodgo.coremodule.user.enums.DiseaseType;
import com.foodgo.coremodule.user.enums.UsageType;

import lombok.Builder;

@Builder
public record UserDetailGetResponse(
Long id,
String username,
String imageUrl
String imageUrl,
UsageType usageType,
DiseaseType diseaseType,
String lifeStyle,
String allergy
) {

public static UserDetailGetResponse from(User user) {
return UserDetailGetResponse.builder()
.id(user.getId())
.username(user.getUsername())
.imageUrl(user.getImageUrl())
.usageType(user.getUsageType())
.diseaseType(user.getDiseaseType())
.lifeStyle(user.getLifeStyle())
.allergy(user.getAllergy())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,33 @@
package com.foodgo.coremodule.user.dto.response;

import com.foodgo.coremodule.user.domain.User;
import com.foodgo.coremodule.user.enums.DiseaseType;
import com.foodgo.coremodule.user.enums.UsageType;

import lombok.Builder;

@Builder
public record UserRegisterResponse(
Long id,
String username
String username,
String nickname,
String imageUrl,
UsageType usageType,
DiseaseType diseaseType,
String lifeStyle,
String allergy
) {

public static UserRegisterResponse from(User user) {
return UserRegisterResponse.builder()
.id(user.getId())
.username(user.getUsername())
.nickname(user.getNickname())
.imageUrl(user.getImageUrl())
.usageType(user.getUsageType())
.diseaseType(user.getDiseaseType())
.lifeStyle(user.getLifeStyle())
.allergy(user.getAllergy())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
package com.foodgo.coremodule.user.dto.response;

import com.foodgo.coremodule.user.domain.User;
import com.foodgo.coremodule.user.enums.DiseaseType;
import com.foodgo.coremodule.user.enums.UsageType;

import lombok.Builder;

@Builder
public record UserUpdateResponse(
String username,
String imageUrl
String nickname,
String imageUrl,
UsageType usageType,
DiseaseType diseaseType,
String lifeStyle,
String allergy
) {

public static UserUpdateResponse from(User user) {
return UserUpdateResponse.builder()
.username(user.getUsername())
.nickname(user.getNickname())
.imageUrl(user.getImageUrl())
.usageType(user.getUsageType())
.diseaseType(user.getDiseaseType())
.lifeStyle(user.getLifeStyle())
.allergy(user.getAllergy())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.foodgo.coremodule.user.enums;

public enum DiseaseType {
DIABETES, HYPERLIPIDEMIA, GOUT
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.foodgo.coremodule.user.enums;

public enum UsageType {
INGREDIENT, RECIPE, DIARY, CHALLENGE
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,9 @@ public interface UserRepository extends JpaRepository<User, Long>, UserRepositor

Optional<User> findByUsername(String username);

Boolean existsByUsername(String username);

Boolean existsByNickname(String nickname);

User save(User user);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ public class UserQueryService {

private final UserRepository userRepository;

public Boolean checkUsername(String username) {
return userRepository.existsByUsername(username);
}

public Boolean checkNickname(String nickname) {
return userRepository.existsByNickname(nickname);
}

public User findByUserName(String username) {
return userRepository.findByUsername(username)
.orElseThrow(() -> new UserExceptionHandler(UserErrorCode.USER_NOT_FOUND));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
import com.foodgo.coremodule.user.domain.User;
import com.foodgo.coremodule.user.dto.request.PasswordUpdateRequest;
import com.foodgo.coremodule.user.dto.request.UserRegisterRequest;
import com.foodgo.coremodule.user.dto.request.UserUpdateRequest;
import com.foodgo.coremodule.user.dto.response.UserRegisterResponse;
import com.foodgo.coremodule.user.dto.response.UserUpdateResponse;
import com.foodgo.coremodule.user.enums.DiseaseType;
import com.foodgo.coremodule.user.enums.UsageType;
import com.foodgo.coremodule.user.repository.UserRepository;
import com.foodgo.coremodule.security.util.JwtUtil;

Expand Down Expand Up @@ -46,12 +49,18 @@ public void updatePassword(User user, PasswordUpdateRequest request) {
user.updatePassword(encodedNewPassword);
}

public UserUpdateResponse updateMyUser(User user, MultipartFile file) {
public UserUpdateResponse updateMyUser(User user, UserUpdateRequest request, MultipartFile file) {
String imageUrl = null;
if (file != null && !file.isEmpty()) {
imageUrl = awsS3Service.uploadFile(file);
}
user.update(imageUrl);
user.update(
imageUrl,
request.nickname(),
request.usageType(),
request.diseaseType(),
request.lifeStyle(),
request.allergy());
return UserUpdateResponse.from(user);
}

Expand Down

0 comments on commit b8d9a0b

Please sign in to comment.