diff --git a/api-module/src/main/java/com/foodgo/apimodule/user/presentation/UserController.java b/api-module/src/main/java/com/foodgo/apimodule/user/presentation/UserController.java index 26d86e5..7f0ca95 100644 --- a/api-module/src/main/java/com/foodgo/apimodule/user/presentation/UserController.java +++ b/api-module/src/main/java/com/foodgo/apimodule/user/presentation/UserController.java @@ -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; @@ -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; @@ -48,6 +50,16 @@ public ApiResponse register( return ApiResponse.onSuccess(userService.register(request, file)); } + @GetMapping("/username") + public ApiResponse checkUsername(@RequestParam String username) { + return ApiResponse.onSuccess(userQueryService.checkUsername(username)); + } + + @GetMapping("/nickname") + public ApiResponse checkNickname(@RequestParam String nickname) { + return ApiResponse.onSuccess(userQueryService.checkNickname(nickname)); + } + @GetMapping("/reissue") public ApiResponse reissueToken(@RequestHeader("RefreshToken") String refreshToken) { return ApiResponse.onSuccess(userService.reissueToken(refreshToken)); @@ -70,8 +82,9 @@ public ApiResponse getMyUser(@UserResolver User authUser) @PatchMapping(value = "/me", consumes = "multipart/form-data") public ApiResponse 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") diff --git a/core-module/src/main/java/com/foodgo/coremodule/security/config/SecurityConfig.java b/core-module/src/main/java/com/foodgo/coremodule/security/config/SecurityConfig.java index 55be499..fc55860 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/security/config/SecurityConfig.java +++ b/core-module/src/main/java/com/foodgo/coremodule/security/config/SecurityConfig.java @@ -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) diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/domain/User.java b/core-module/src/main/java/com/foodgo/coremodule/user/domain/User.java index 2235852..f541f19 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/domain/User.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/domain/User.java @@ -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.*; @@ -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; @@ -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; } } diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/dto/request/UserRegisterRequest.java b/core-module/src/main/java/com/foodgo/coremodule/user/dto/request/UserRegisterRequest.java index 8e87f10..aaabc85 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/dto/request/UserRegisterRequest.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/dto/request/UserRegisterRequest.java @@ -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(); diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/dto/request/UserUpdateRequest.java b/core-module/src/main/java/com/foodgo/coremodule/user/dto/request/UserUpdateRequest.java index d28b3e5..411bb67 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/dto/request/UserUpdateRequest.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/dto/request/UserUpdateRequest.java @@ -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 +) { } diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserDetailGetResponse.java b/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserDetailGetResponse.java index 4ed1a02..688ea3d 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserDetailGetResponse.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserDetailGetResponse.java @@ -1,6 +1,8 @@ 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; @@ -8,7 +10,11 @@ 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) { @@ -16,6 +22,10 @@ public static UserDetailGetResponse from(User user) { .id(user.getId()) .username(user.getUsername()) .imageUrl(user.getImageUrl()) + .usageType(user.getUsageType()) + .diseaseType(user.getDiseaseType()) + .lifeStyle(user.getLifeStyle()) + .allergy(user.getAllergy()) .build(); } } diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserRegisterResponse.java b/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserRegisterResponse.java index e9dc34a..fad1fcf 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserRegisterResponse.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserRegisterResponse.java @@ -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(); } } diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserUpdateResponse.java b/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserUpdateResponse.java index e139944..70cd294 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserUpdateResponse.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/dto/response/UserUpdateResponse.java @@ -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(); } } diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/enums/DiseaseType.java b/core-module/src/main/java/com/foodgo/coremodule/user/enums/DiseaseType.java new file mode 100644 index 0000000..378909e --- /dev/null +++ b/core-module/src/main/java/com/foodgo/coremodule/user/enums/DiseaseType.java @@ -0,0 +1,5 @@ +package com.foodgo.coremodule.user.enums; + +public enum DiseaseType { + DIABETES, HYPERLIPIDEMIA, GOUT +} diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/enums/UsageType.java b/core-module/src/main/java/com/foodgo/coremodule/user/enums/UsageType.java new file mode 100644 index 0000000..4d16954 --- /dev/null +++ b/core-module/src/main/java/com/foodgo/coremodule/user/enums/UsageType.java @@ -0,0 +1,5 @@ +package com.foodgo.coremodule.user.enums; + +public enum UsageType { + INGREDIENT, RECIPE, DIARY, CHALLENGE +} diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/repository/UserRepository.java b/core-module/src/main/java/com/foodgo/coremodule/user/repository/UserRepository.java index fc11dc0..b040c85 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/repository/UserRepository.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/repository/UserRepository.java @@ -10,5 +10,9 @@ public interface UserRepository extends JpaRepository, UserRepositor Optional findByUsername(String username); + Boolean existsByUsername(String username); + + Boolean existsByNickname(String nickname); + User save(User user); } diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/service/UserQueryService.java b/core-module/src/main/java/com/foodgo/coremodule/user/service/UserQueryService.java index 8c42bc8..67dafb2 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/service/UserQueryService.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/service/UserQueryService.java @@ -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)); diff --git a/core-module/src/main/java/com/foodgo/coremodule/user/service/UserService.java b/core-module/src/main/java/com/foodgo/coremodule/user/service/UserService.java index cd5148c..c53b572 100644 --- a/core-module/src/main/java/com/foodgo/coremodule/user/service/UserService.java +++ b/core-module/src/main/java/com/foodgo/coremodule/user/service/UserService.java @@ -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; @@ -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); }