From 5ab47bc0c674f98a289434a6a8c8a3c580740344 Mon Sep 17 00:00:00 2001 From: bu2000 Date: Wed, 12 Nov 2025 23:04:20 +0900 Subject: [PATCH] complete user_survey_domain and separate userservice into userservice and authservice --- .../controller/AllergyController.java | 30 ++++ .../controller/AuthController.java | 89 ++++++++++ .../controller/HealthGoalController.java | 30 ++++ .../controller/UserController.java | 75 ++++----- .../dto/allergy/AllergyResponse.java | 17 ++ .../dto/healthgoal/HealthGoalResponse.java | 18 ++ .../dto/user/mypage/MyPageResponse.java | 46 ++++++ .../dto/user/survey/MessageResponse.java | 13 ++ .../dto/user/survey/NudgeRequest.java | 14 ++ .../dto/user/{ => survey}/SurveyRequest.java | 8 +- .../algorithmchef/model/UserPreference.java | 3 + .../algorithmchef/service/AllergyService.java | 28 ++++ .../algorithmchef/service/AuthService.java | 110 ++++++++++++ .../service/HealthGoalService.java | 30 ++++ .../algorithmchef/service/UserService.java | 156 +++++++++--------- 15 files changed, 542 insertions(+), 125 deletions(-) create mode 100644 src/main/java/com/webservice/algorithmchef/controller/AllergyController.java create mode 100644 src/main/java/com/webservice/algorithmchef/controller/AuthController.java create mode 100644 src/main/java/com/webservice/algorithmchef/controller/HealthGoalController.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/allergy/AllergyResponse.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/healthgoal/HealthGoalResponse.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/user/mypage/MyPageResponse.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/user/survey/MessageResponse.java create mode 100644 src/main/java/com/webservice/algorithmchef/dto/user/survey/NudgeRequest.java rename src/main/java/com/webservice/algorithmchef/dto/user/{ => survey}/SurveyRequest.java (73%) create mode 100644 src/main/java/com/webservice/algorithmchef/service/AllergyService.java create mode 100644 src/main/java/com/webservice/algorithmchef/service/AuthService.java create mode 100644 src/main/java/com/webservice/algorithmchef/service/HealthGoalService.java diff --git a/src/main/java/com/webservice/algorithmchef/controller/AllergyController.java b/src/main/java/com/webservice/algorithmchef/controller/AllergyController.java new file mode 100644 index 0000000..612701a --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/controller/AllergyController.java @@ -0,0 +1,30 @@ +package com.webservice.algorithmchef.controller; + +import java.util.List; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.webservice.algorithmchef.dto.allergy.AllergyResponse; +import com.webservice.algorithmchef.service.AllergyService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +public class AllergyController { + + private final AllergyService allergyService; + + @GetMapping("/allergies") + public ResponseEntity retrieveAll(){ + try { + List allergies = allergyService.retrieveAll(); + return ResponseEntity.ok(allergies); + + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } +} diff --git a/src/main/java/com/webservice/algorithmchef/controller/AuthController.java b/src/main/java/com/webservice/algorithmchef/controller/AuthController.java new file mode 100644 index 0000000..9981442 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/controller/AuthController.java @@ -0,0 +1,89 @@ +package com.webservice.algorithmchef.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.webservice.algorithmchef.dto.user.ChangePasswordRequest; +import com.webservice.algorithmchef.dto.user.ChangePasswordResponse; +import com.webservice.algorithmchef.dto.user.FindPasswordRequest; +import com.webservice.algorithmchef.dto.user.FindPasswordResponse; +import com.webservice.algorithmchef.dto.user.FindUserIdRequest; +import com.webservice.algorithmchef.dto.user.FindUserIdResponse; +import com.webservice.algorithmchef.dto.user.UserLoginRequest; +import com.webservice.algorithmchef.dto.user.UserLoginResponse; +import com.webservice.algorithmchef.dto.user.UserSignUpRequest; +import com.webservice.algorithmchef.dto.user.UserSignUpResponse; +import com.webservice.algorithmchef.service.AuthService; + +import lombok.RequiredArgsConstructor; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/auth") +public class AuthController { + + private final AuthService authService; + + @PostMapping("/login") + public ResponseEntity login(@RequestBody UserLoginRequest userLoginRequest){ + try { + UserLoginResponse userLoginResponse = authService.login(userLoginRequest); + return ResponseEntity.ok(userLoginResponse); + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + + @PostMapping("/signUp") + public ResponseEntity signUp(@RequestBody UserSignUpRequest userSignUpRequest){ + try { + UserSignUpResponse userSignUpResponse = authService.signUp(userSignUpRequest); + return ResponseEntity.status(HttpStatus.CREATED).body(userSignUpResponse); + + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + + @Transactional + @PatchMapping("/findPassword") + public ResponseEntity findPassword(@RequestBody FindPasswordRequest fPasswordRequest){ + try { + FindPasswordResponse pResponse = authService.findPassword(fPasswordRequest); + return ResponseEntity.ok(pResponse); + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + + @PatchMapping("/update-tempPassword") + public ResponseEntity updateTempPasswod(@RequestBody ChangePasswordRequest cPasswordRequest, + @AuthenticationPrincipal UserDetails userDetails){ + try { + String userId = userDetails.getUsername(); + ChangePasswordResponse cResponse = authService.updateTempPassword(cPasswordRequest, userId); + return ResponseEntity.ok(cResponse); + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + + @PostMapping("/findUserId") + public ResponseEntity findUserId(@RequestBody FindUserIdRequest fIdRequest){ + try { + FindUserIdResponse idResponse = authService.findUserId(fIdRequest); + return ResponseEntity.ok(idResponse); + }catch(IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/controller/HealthGoalController.java b/src/main/java/com/webservice/algorithmchef/controller/HealthGoalController.java new file mode 100644 index 0000000..6b1dd0a --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/controller/HealthGoalController.java @@ -0,0 +1,30 @@ +package com.webservice.algorithmchef.controller; + +import java.util.List; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.webservice.algorithmchef.dto.healthgoal.HealthGoalResponse; +import com.webservice.algorithmchef.service.HealthGoalService; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@RestController +public class HealthGoalController { + + private final HealthGoalService hGoalService; + + @GetMapping("/healthGoals") + public ResponseEntity retrieveAll(){ + try { + List goals = hGoalService.retriveAll(); + return ResponseEntity.ok(goals); + }catch (IllegalArgumentException e) { + return ResponseEntity.badRequest().body(e.getMessage()); + } + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/controller/UserController.java b/src/main/java/com/webservice/algorithmchef/controller/UserController.java index 1cc5ebe..75181ae 100644 --- a/src/main/java/com/webservice/algorithmchef/controller/UserController.java +++ b/src/main/java/com/webservice/algorithmchef/controller/UserController.java @@ -4,87 +4,76 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import com.webservice.algorithmchef.dto.user.ChangePasswordRequest; -import com.webservice.algorithmchef.dto.user.ChangePasswordResponse; -import com.webservice.algorithmchef.dto.user.FindPasswordRequest; -import com.webservice.algorithmchef.dto.user.FindPasswordResponse; -import com.webservice.algorithmchef.dto.user.FindUserIdRequest; -import com.webservice.algorithmchef.dto.user.FindUserIdResponse; -import com.webservice.algorithmchef.dto.user.UserLoginRequest; -import com.webservice.algorithmchef.dto.user.UserLoginResponse; -import com.webservice.algorithmchef.dto.user.UserSignUpRequest; -import com.webservice.algorithmchef.dto.user.UserSignUpResponse; +import com.webservice.algorithmchef.dto.user.mypage.MyPageResponse; +import com.webservice.algorithmchef.dto.user.survey.SurveyRequest; +import com.webservice.algorithmchef.dto.user.survey.MessageResponse; +import com.webservice.algorithmchef.dto.user.survey.NudgeRequest; import com.webservice.algorithmchef.service.UserService; import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor -@RequestMapping("/auth") +@RequestMapping("/user") public class UserController { private final UserService userService; - @PostMapping("/login") - public ResponseEntity login(@RequestBody UserLoginRequest userLoginRequest){ + @PostMapping("/survey") + public ResponseEntity makeSurvey(@RequestBody SurveyRequest sRequest, + @AuthenticationPrincipal UserDetails userDetails){ try { - UserLoginResponse userLoginResponse = userService.login(userLoginRequest); - return ResponseEntity.ok(userLoginResponse); + String userId = userDetails.getUsername(); + MessageResponse sResponse = userService.makeOrUpdateSurvey(sRequest, userId); + return ResponseEntity.status(HttpStatus.CREATED).body(sResponse); }catch(IllegalArgumentException e) { return ResponseEntity.badRequest().body(e.getMessage()); } } - @PostMapping("/signUp") - public ResponseEntity signUp(@RequestBody UserSignUpRequest userSignUpRequest){ - try { - UserSignUpResponse userSignUpResponse = userService.signUp(userSignUpRequest); - return ResponseEntity.status(HttpStatus.CREATED).body(userSignUpResponse); - - }catch (IllegalArgumentException e) { - return ResponseEntity.badRequest().body(e.getMessage()); - } - } - - @Transactional - @PatchMapping("/findPassword") - public ResponseEntity findPassword(@RequestBody FindPasswordRequest fPasswordRequest){ + @GetMapping("/mypage") + public ResponseEntity retrieveMyInformation(@AuthenticationPrincipal UserDetails userDetails){ try { - FindPasswordResponse pResponse = userService.findPassword(fPasswordRequest); - return ResponseEntity.ok(pResponse); + String userId = userDetails.getUsername(); + MyPageResponse pageResponse = userService.retrieveMyInformation(userId); + return ResponseEntity.ok(pageResponse); }catch(IllegalArgumentException e) { return ResponseEntity.badRequest().body(e.getMessage()); } } - @PatchMapping("/update-tempPassword") - public ResponseEntity updateTempPasswod(@RequestBody ChangePasswordRequest cPasswordRequest, + @PatchMapping("/survey") + public ResponseEntity updateSurvey(@RequestBody SurveyRequest sRequest, @AuthenticationPrincipal UserDetails userDetails){ try { String userId = userDetails.getUsername(); - ChangePasswordResponse cResponse = userService.updateTempPassword(cPasswordRequest, userId); - return ResponseEntity.ok(cResponse); - }catch(IllegalArgumentException e) { + MessageResponse mResponse = userService.makeOrUpdateSurvey(sRequest, userId); + return ResponseEntity.ok(mResponse); + }catch (IllegalArgumentException e) { + // TODO: handle exception return ResponseEntity.badRequest().body(e.getMessage()); } } - @PostMapping("/findUserId") - public ResponseEntity findUserId(@RequestBody FindUserIdRequest fIdRequest){ + @PatchMapping("/postpone/register") + public ResponseEntity postponeNudge(@RequestBody NudgeRequest nRequest, + @AuthenticationPrincipal UserDetails userDetails){ try { - FindUserIdResponse idResponse = userService.findUserId(fIdRequest); - return ResponseEntity.ok(idResponse); - }catch(IllegalArgumentException e) { + String userId = userDetails.getUsername(); + MessageResponse mResponse = userService.postponeNudge(nRequest, userId); + return ResponseEntity.ok(mResponse); + }catch (IllegalArgumentException e) { + // TODO: handle exception return ResponseEntity.badRequest().body(e.getMessage()); } + } - } diff --git a/src/main/java/com/webservice/algorithmchef/dto/allergy/AllergyResponse.java b/src/main/java/com/webservice/algorithmchef/dto/allergy/AllergyResponse.java new file mode 100644 index 0000000..19fdd55 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/allergy/AllergyResponse.java @@ -0,0 +1,17 @@ +package com.webservice.algorithmchef.dto.allergy; + +import com.webservice.algorithmchef.model.Allergy; + +import lombok.Getter; + +@Getter +public class AllergyResponse { + + private Long id; + private String name; + + public AllergyResponse(Allergy allergy) { + this.id = allergy.getId(); + this.name = allergy.getName(); + } +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/healthgoal/HealthGoalResponse.java b/src/main/java/com/webservice/algorithmchef/dto/healthgoal/HealthGoalResponse.java new file mode 100644 index 0000000..855a8f8 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/healthgoal/HealthGoalResponse.java @@ -0,0 +1,18 @@ +package com.webservice.algorithmchef.dto.healthgoal; + +import com.webservice.algorithmchef.model.HealthGoal; + +import lombok.Getter; + +@Getter +public class HealthGoalResponse { + private String name; + private Long id; + private String category; + + public HealthGoalResponse(HealthGoal goal) { + this.name = goal.getName(); + this.id = goal.getId(); + this.category = goal.getCategory(); + } +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/user/mypage/MyPageResponse.java b/src/main/java/com/webservice/algorithmchef/dto/user/mypage/MyPageResponse.java new file mode 100644 index 0000000..2fe6925 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/user/mypage/MyPageResponse.java @@ -0,0 +1,46 @@ +package com.webservice.algorithmchef.dto.user.mypage; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.Period; +import java.util.List; + +import com.webservice.algorithmchef.model.User; + +import lombok.Getter; + +@Getter +public class MyPageResponse { + + private String userId; + private LocalDateTime birthDate; + private int age; + private List goals; + private List allergyList; + private String dislikedIngredients; + private String likedIngredients; + private String preferredCuisine; + private String spiceLevel; + private boolean allowPushConsumption; + private boolean allowPushComment; + private boolean allowPushNudge; + + public MyPageResponse(User user) { + this.userId = user.getUserId(); + this.birthDate = user.getBirthDate(); + this.age = Period.between(birthDate.toLocalDate(), LocalDate.now()).getYears(); + this.goals = user.getUserHealthGoals().stream() + .map(userHealthGoal -> userHealthGoal.getHealthGoal().getName()) + .toList(); + this.allergyList = user.getUserAllergyList().stream() + .map(userAllergy -> userAllergy.getAllergy().getName()) + .toList(); + this.dislikedIngredients = user.getUserPreference().getDisLikedIngredients(); + this.likedIngredients = user.getUserPreference().getLikedIngredients(); + this.preferredCuisine = user.getUserPreference().getPreferredCuisine(); + this.spiceLevel = user.getUserPreference().getSpiceLevel(); + this.allowPushConsumption = user.getUserPreference().isAllowPushConsumption(); + this.allowPushComment = user.getUserPreference().isAllowPushComment(); + this.allowPushNudge = user.getUserPreference().isAllowPushNudge(); + } +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/user/survey/MessageResponse.java b/src/main/java/com/webservice/algorithmchef/dto/user/survey/MessageResponse.java new file mode 100644 index 0000000..7e00f0a --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/user/survey/MessageResponse.java @@ -0,0 +1,13 @@ +package com.webservice.algorithmchef.dto.user.survey; + +import lombok.Getter; + +@Getter +public class MessageResponse { + + private String message; + + public MessageResponse(String userId, String message) { + this.message = userId + message; + } +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/user/survey/NudgeRequest.java b/src/main/java/com/webservice/algorithmchef/dto/user/survey/NudgeRequest.java new file mode 100644 index 0000000..019e744 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/dto/user/survey/NudgeRequest.java @@ -0,0 +1,14 @@ +package com.webservice.algorithmchef.dto.user.survey; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class NudgeRequest { + + @JsonProperty("wants_register_nudge") + private boolean wantsRegisterNudge; +} diff --git a/src/main/java/com/webservice/algorithmchef/dto/user/SurveyRequest.java b/src/main/java/com/webservice/algorithmchef/dto/user/survey/SurveyRequest.java similarity index 73% rename from src/main/java/com/webservice/algorithmchef/dto/user/SurveyRequest.java rename to src/main/java/com/webservice/algorithmchef/dto/user/survey/SurveyRequest.java index 23f19b6..0966bab 100644 --- a/src/main/java/com/webservice/algorithmchef/dto/user/SurveyRequest.java +++ b/src/main/java/com/webservice/algorithmchef/dto/user/survey/SurveyRequest.java @@ -1,20 +1,20 @@ -package com.webservice.algorithmchef.dto.user; +package com.webservice.algorithmchef.dto.user.survey; import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter -@AllArgsConstructor +@NoArgsConstructor public class SurveyRequest { private List healthGoalIds; private List allergyIds; private String dislikedIngredients; private String likedIngredients; - private String preferredIngredients; - private String preferredCuisinel; + private String preferredCuisine; private String spiceLevel; private boolean allowPushConsumption; private boolean allowPushComment; diff --git a/src/main/java/com/webservice/algorithmchef/model/UserPreference.java b/src/main/java/com/webservice/algorithmchef/model/UserPreference.java index 9215f04..ab87353 100644 --- a/src/main/java/com/webservice/algorithmchef/model/UserPreference.java +++ b/src/main/java/com/webservice/algorithmchef/model/UserPreference.java @@ -35,6 +35,9 @@ public class UserPreference { @Column private String likedIngredients; + @Column + private String preferredCuisine; + @Column(nullable = false, columnDefinition = "varchar(255) default '보통'") private String spiceLevel; diff --git a/src/main/java/com/webservice/algorithmchef/service/AllergyService.java b/src/main/java/com/webservice/algorithmchef/service/AllergyService.java new file mode 100644 index 0000000..9d8a229 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/service/AllergyService.java @@ -0,0 +1,28 @@ +package com.webservice.algorithmchef.service; + +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.webservice.algorithmchef.dto.allergy.AllergyResponse; +import com.webservice.algorithmchef.model.Allergy; +import com.webservice.algorithmchef.repository.AllergyRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class AllergyService { + + private final AllergyRepository allergyRepository; + + public List retrieveAll(){ + List allergies = allergyRepository.findAll(); + List allergyList = allergies.stream().map(allergy ->{ + return new AllergyResponse(allergy); + }).toList(); + + return allergyList; + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/service/AuthService.java b/src/main/java/com/webservice/algorithmchef/service/AuthService.java new file mode 100644 index 0000000..de64c86 --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/service/AuthService.java @@ -0,0 +1,110 @@ +package com.webservice.algorithmchef.service; + +import java.time.LocalDateTime; + +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.webservice.algorithmchef.dto.user.ChangePasswordRequest; +import com.webservice.algorithmchef.dto.user.ChangePasswordResponse; +import com.webservice.algorithmchef.dto.user.FindPasswordRequest; +import com.webservice.algorithmchef.dto.user.FindPasswordResponse; +import com.webservice.algorithmchef.dto.user.FindUserIdRequest; +import com.webservice.algorithmchef.dto.user.FindUserIdResponse; +import com.webservice.algorithmchef.dto.user.UserLoginRequest; +import com.webservice.algorithmchef.dto.user.UserLoginResponse; +import com.webservice.algorithmchef.dto.user.UserSignUpRequest; +import com.webservice.algorithmchef.dto.user.UserSignUpResponse; +import com.webservice.algorithmchef.model.User; +import com.webservice.algorithmchef.repository.UserRepository; +import com.webservice.algorithmchef.util.JwtUtil; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor + +public class AuthService { + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + private final JwtUtil jwtUtil; + private final EmailService emailService; + + public UserSignUpResponse signUp(UserSignUpRequest userSignUpRequest) { + String userId = userSignUpRequest.getUserId(); + String password = userSignUpRequest.getPassword(); + String encodedPassword = passwordEncoder.encode(password); + String email = userSignUpRequest.getEmail(); + String gender = userSignUpRequest.getGender(); + LocalDateTime birthDate = userSignUpRequest.getBirthDate(); + User user = User.builder() + .email(email) + .gender(gender) + .birthDate(birthDate) + .userId(userId) + .password(encodedPassword) + .role("ROLE_USER") + .build(); + User newUser = userRepository.save(user); + return new UserSignUpResponse(newUser); + } + + public UserLoginResponse login(UserLoginRequest userLoginRequest) { + String userId = userLoginRequest.getUserId(); + String password = userLoginRequest.getPassword(); + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다.")); + if(!passwordEncoder.matches(password, user.getPassword())) { + throw new IllegalArgumentException("비밀번호가 일치하지 않습니다."); + } + + String token = jwtUtil.createAccessToken(user.getUserId(),user.getRole(),user.isTemporaryPassword()); + if(user.isTemporaryPassword()) { + return new UserLoginResponse(token,UserLoginResponse.LoginStatus.FORCE_PASSWORD_CHANGE); + }else { + return new UserLoginResponse(token,UserLoginResponse.LoginStatus.SUCCESS); + } + } + + @Transactional + public ChangePasswordResponse updateTempPassword(ChangePasswordRequest cRequest,String userId) { + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다.")); + String newPassword = cRequest.getPassword(); + String encodedPassword = passwordEncoder.encode(newPassword); + user.setPassword(encodedPassword); + user.setTemporaryPassword(false); + String token = jwtUtil.createAccessToken(user.getUserId(), user.getRole(), user.isTemporaryPassword()); + String message = "임시 비밀번호 변경되었습니다. 메인 화면으로 이동합니다."; + return new ChangePasswordResponse(token, message); + } + + @Transactional + public FindUserIdResponse findUserId(FindUserIdRequest findUserIdRequest) { + String email = findUserIdRequest.getEmail(); + LocalDateTime birthDate = findUserIdRequest.getBirthDate(); + User user = userRepository.findByEmailAndBirthDate(email, birthDate) + .orElseThrow(() -> new IllegalArgumentException("해당하는 정보와 일치하는 사용자가 없습니다.")); + String userId = user.getUserId(); + return new FindUserIdResponse(userId); + } + + @Transactional + public FindPasswordResponse findPassword(FindPasswordRequest fPasswordRequest) { + String userId = fPasswordRequest.getUserId(); + String email = fPasswordRequest.getEmail(); + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다.")); + if(!user.getEmail().equals(email)) { + throw new IllegalArgumentException("등록된 사용자의 이메일이 아닙니다."); + } + String tempPassword = emailService.makeTemporaryPassword(); + String encodedPassword = passwordEncoder.encode(tempPassword); + user.setPassword(encodedPassword); + user.setTemporaryPassword(true); + emailService.sendTemporaryPasswordEmail(email,tempPassword); + return new FindPasswordResponse(user); + } + +} diff --git a/src/main/java/com/webservice/algorithmchef/service/HealthGoalService.java b/src/main/java/com/webservice/algorithmchef/service/HealthGoalService.java new file mode 100644 index 0000000..1c0a28b --- /dev/null +++ b/src/main/java/com/webservice/algorithmchef/service/HealthGoalService.java @@ -0,0 +1,30 @@ +package com.webservice.algorithmchef.service; + +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.webservice.algorithmchef.dto.healthgoal.HealthGoalResponse; +import com.webservice.algorithmchef.model.HealthGoal; +import com.webservice.algorithmchef.repository.HealthGoalRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class HealthGoalService { + + private final HealthGoalRepository healthGoalRepository; + + public List retriveAll() { + List goals = healthGoalRepository.findAll(); + + List healthGoals = + goals.stream().map(goal -> { + return new HealthGoalResponse(goal); + }) + .toList(); + + return healthGoals; + } +} diff --git a/src/main/java/com/webservice/algorithmchef/service/UserService.java b/src/main/java/com/webservice/algorithmchef/service/UserService.java index ef83bec..ba73adb 100644 --- a/src/main/java/com/webservice/algorithmchef/service/UserService.java +++ b/src/main/java/com/webservice/algorithmchef/service/UserService.java @@ -1,27 +1,26 @@ package com.webservice.algorithmchef.service; -import java.time.LocalDateTime; +import java.util.List; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.webservice.algorithmchef.dto.user.ChangePasswordRequest; -import com.webservice.algorithmchef.dto.user.ChangePasswordResponse; -import com.webservice.algorithmchef.dto.user.FindPasswordRequest; -import com.webservice.algorithmchef.dto.user.FindPasswordResponse; -import com.webservice.algorithmchef.dto.user.FindUserIdRequest; -import com.webservice.algorithmchef.dto.user.FindUserIdResponse; -import com.webservice.algorithmchef.dto.user.UserLoginRequest; -import com.webservice.algorithmchef.dto.user.UserLoginResponse; -import com.webservice.algorithmchef.dto.user.UserSignUpRequest; -import com.webservice.algorithmchef.dto.user.UserSignUpResponse; +import com.webservice.algorithmchef.dto.user.mypage.MyPageResponse; +import com.webservice.algorithmchef.dto.user.survey.SurveyRequest; +import com.webservice.algorithmchef.dto.user.survey.MessageResponse; +import com.webservice.algorithmchef.dto.user.survey.NudgeRequest; +import com.webservice.algorithmchef.model.Allergy; +import com.webservice.algorithmchef.model.HealthGoal; import com.webservice.algorithmchef.model.User; +import com.webservice.algorithmchef.model.UserAllergy; +import com.webservice.algorithmchef.model.UserHealthGoal; +import com.webservice.algorithmchef.model.UserPreference; +import com.webservice.algorithmchef.repository.AllergyRepository; +import com.webservice.algorithmchef.repository.HealthGoalRepository; import com.webservice.algorithmchef.repository.UserRepository; -import com.webservice.algorithmchef.util.JwtUtil; import lombok.RequiredArgsConstructor; @Service @@ -30,9 +29,8 @@ public class UserService implements UserDetailsService{ private final UserRepository userRepository; - private final PasswordEncoder passwordEncoder; - private final JwtUtil jwtUtil; - private final EmailService emailService; + private final HealthGoalRepository healthGoalRepository; + private final AllergyRepository allergyRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { @@ -41,80 +39,82 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx .orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다: " + username)); } - public UserSignUpResponse signUp(UserSignUpRequest userSignUpRequest) { - String userId = userSignUpRequest.getUserId(); - String password = userSignUpRequest.getPassword(); - String encodedPassword = passwordEncoder.encode(password); - String email = userSignUpRequest.getEmail(); - String gender = userSignUpRequest.getGender(); - LocalDateTime birthDate = userSignUpRequest.getBirthDate(); - User user = User.builder() - .email(email) - .gender(gender) - .birthDate(birthDate) - .userId(userId) - .password(encodedPassword) - .role("ROLE_USER") - .build(); - User newUser = userRepository.save(user); - return new UserSignUpResponse(newUser); - } - public UserLoginResponse login(UserLoginRequest userLoginRequest) { - String userId = userLoginRequest.getUserId(); - String password = userLoginRequest.getPassword(); + @Transactional + public MessageResponse makeOrUpdateSurvey(SurveyRequest sRequest,String userId) { User user = userRepository.findByUserId(userId) - .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다.")); - if(!passwordEncoder.matches(password, user.getPassword())) { - throw new IllegalArgumentException("비밀번호가 일치하지 않습니다."); + .orElseThrow(()-> new IllegalArgumentException("해당 아이디에 적합한 사용자를 찾을 수 없습니다")); + + List healthGoalIds = sRequest.getHealthGoalIds(); + List allergyIds = sRequest.getAllergyIds(); + + if(user.getUserHealthGoals() != null) { + user.getUserHealthGoals().clear(); } + List newHealthGoals = healthGoalIds.stream().map(id ->{ + HealthGoal goal = healthGoalRepository.findById(id) + .orElseThrow(()-> new IllegalArgumentException("해당하는 아이디로 건강 목표를 찾을 수 없습니다.")); + return UserHealthGoal.builder() + .user(user) + .healthGoal(goal) + .build(); + }).toList(); + user.getUserHealthGoals().addAll(newHealthGoals); - String token = jwtUtil.createAccessToken(user.getUserId(),user.getRole(),user.isTemporaryPassword()); - if(user.isTemporaryPassword()) { - return new UserLoginResponse(token,UserLoginResponse.LoginStatus.FORCE_PASSWORD_CHANGE); - }else { - return new UserLoginResponse(token,UserLoginResponse.LoginStatus.SUCCESS); + if(user.getUserAllergyList()!=null) { + user.getUserAllergyList().clear(); + } + List newUserAllergies = allergyIds.stream().map(id ->{ + Allergy allergy = allergyRepository.findById(id) + .orElseThrow(()-> new IllegalArgumentException("해당하는 아이디로 알러지 정보를 찾을 수 없습니다.")); + return UserAllergy.builder() + .allergy(allergy) + .user(user) + .build(); + }).toList(); + user.getUserAllergyList().addAll(newUserAllergies); + + + UserPreference userPreference = user.getUserPreference(); + boolean isNewPreference = false; + + if(userPreference == null) { + isNewPreference = true; + userPreference = UserPreference.builder() + .user(user) + .build(); + user.setUserPreference(userPreference); } + + userPreference.setDisLikedIngredients(sRequest.getDislikedIngredients()); + userPreference.setLikedIngredients(sRequest.getLikedIngredients()); + userPreference.setSpiceLevel(sRequest.getSpiceLevel()); + userPreference.setPreferredCuisine(sRequest.getPreferredCuisine()); + userPreference.setAllowPushComment(sRequest.isAllowPushComment()); + userPreference.setAllowPushConsumption(sRequest.isAllowPushConsumption()); + userPreference.setAllowPushNudge(sRequest.isAllowPushNudge()); + + String message = isNewPreference ? + "님의 취향과 알림 설정이 성공적으로 저장되었습니다." : + "님의 취향과 알림 설정이 성공적으로 업데이트 되었습니다."; + + return new MessageResponse(userId,message); } - @Transactional - public ChangePasswordResponse updateTempPassword(ChangePasswordRequest cRequest,String userId) { + public MyPageResponse retrieveMyInformation(String userId) { User user = userRepository.findByUserId(userId) - .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다.")); - String newPassword = cRequest.getPassword(); - String encodedPassword = passwordEncoder.encode(newPassword); - user.setPassword(encodedPassword); - user.setTemporaryPassword(false); - String token = jwtUtil.createAccessToken(user.getUserId(), user.getRole(), user.isTemporaryPassword()); - String message = "임시 비밀번호 변경되었습니다. 메인 화면으로 이동합니다."; - return new ChangePasswordResponse(token, message); - } - - @Transactional - public FindUserIdResponse findUserId(FindUserIdRequest findUserIdRequest) { - String email = findUserIdRequest.getEmail(); - LocalDateTime birthDate = findUserIdRequest.getBirthDate(); - User user = userRepository.findByEmailAndBirthDate(email, birthDate) - .orElseThrow(() -> new IllegalArgumentException("해당하는 정보와 일치하는 사용자가 없습니다.")); - String userId = user.getUserId(); - return new FindUserIdResponse(userId); + .orElseThrow(()-> new IllegalArgumentException("해당 아이디에 적합한 사용자를 찾을 수 없습니다")); + return new MyPageResponse(user); } @Transactional - public FindPasswordResponse findPassword(FindPasswordRequest fPasswordRequest) { - String userId = fPasswordRequest.getUserId(); - String email = fPasswordRequest.getEmail(); + public MessageResponse postponeNudge(NudgeRequest nRequest, String userId) { + boolean isWantsRegisterNudge = nRequest.isWantsRegisterNudge(); User user = userRepository.findByUserId(userId) - .orElseThrow(() -> new IllegalArgumentException("사용자를 찾을 수 없습니다.")); - if(!user.getEmail().equals(email)) { - throw new IllegalArgumentException("등록된 사용자의 이메일이 아닙니다."); - } - String tempPassword = emailService.makeTemporaryPassword(); - String encodedPassword = passwordEncoder.encode(tempPassword); - user.setPassword(encodedPassword); - user.setTemporaryPassword(true); - emailService.sendTemporaryPasswordEmail(email,tempPassword); - return new FindPasswordResponse(user); + .orElseThrow(()-> new IllegalArgumentException("해당 아이디에 적합한 사용자를 찾을 수 없습니다")); + user.getUserPreference().setWantsRegisterNudge(isWantsRegisterNudge); + String message = "알림이 예약되었습니다. 3일 뒤에 다시 알려드릴게요!"; + return new MessageResponse(userId, message); }