Skip to content

Commit

Permalink
Merge pull request #39 from OurMenu/KAN-26-fix/user
Browse files Browse the repository at this point in the history
[Feat] User API 수정
  • Loading branch information
david-parkk authored Jan 24, 2025
2 parents eb08738 + b27245b commit 627d8d5
Show file tree
Hide file tree
Showing 34 changed files with 390 additions and 240 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.ourmenu.backend.domain.user.dto.request.EmailRequest;
import com.ourmenu.backend.domain.user.dto.response.EmailResponse;
import com.ourmenu.backend.domain.user.dto.request.VerifyEmailRequest;
import com.ourmenu.backend.domain.user.dto.response.TemporaryPasswordResponse;
import com.ourmenu.backend.global.response.ApiResponse;
import com.ourmenu.backend.global.response.util.ApiUtil;
import jakarta.validation.Valid;
Expand All @@ -27,8 +28,14 @@ private ApiResponse<EmailResponse> sendConfirmCode(@Valid @RequestBody EmailRequ
}

@PostMapping("/confirm-code")
private ApiResponse<String> verifyEmail(@Valid @RequestBody VerifyEmailRequest request){
String response = emailService.verifyConfirmCode(request);
private ApiResponse<Void> verifyEmail(@Valid @RequestBody VerifyEmailRequest request){
emailService.verifyConfirmCode(request);
return ApiUtil.successOnly();
}

@PostMapping("/temporary-password")
private ApiResponse<TemporaryPasswordResponse> sendTemporaryPassword(@RequestBody EmailRequest request){
TemporaryPasswordResponse response = emailService.sendTemporaryPassword(request);
return ApiUtil.success(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.ourmenu.backend.domain.user.dto.request.SignUpRequest;
import com.ourmenu.backend.global.response.ApiResponse;
import com.ourmenu.backend.global.response.util.ApiUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
Expand All @@ -30,9 +31,9 @@ public class UserController {
* @return
*/
@PostMapping("/sign-up")
private ApiResponse<String> signUp(@Valid @RequestBody SignUpRequest signUpRequest){
String response = userService.signUp(signUpRequest);
return ApiUtil.success(response);
private ApiResponse<Void> signUp(@Valid @RequestBody SignUpRequest signUpRequest){
userService.signUp(signUpRequest);
return ApiUtil.successOnly();
}

/**
Expand All @@ -48,15 +49,15 @@ private ApiResponse<TokenDto> signIn(@Valid @RequestBody SignInRequest request,
}

@PatchMapping("/password")
private ApiResponse<String> changePassword(@Valid @RequestBody PasswordRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){
String response = userService.changePassword(request, userDetails);
return ApiUtil.success(response);
private ApiResponse<Void> changePassword(@Valid @RequestBody PasswordRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){
userService.changePassword(request, userDetails);
return ApiUtil.successOnly();
}

@PatchMapping("/meal-time")
private ApiResponse<String> changeMealTime(@Valid @RequestBody MealTimeRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){
String response = userService.changeMealTime(request, userDetails);
return ApiUtil.success(response);
private ApiResponse<Void> changeMealTime(@Valid @RequestBody MealTimeRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){
userService.changeMealTime(request, userDetails);
return ApiUtil.successOnly();
}

@GetMapping("")
Expand All @@ -66,8 +67,9 @@ private ApiResponse<UserDto> getUserInfo(@AuthenticationPrincipal CustomUserDeta
}

@PostMapping("/sign-out")
private ApiResponse<String> signOut(){
return ApiUtil.success("OK");
private ApiResponse<Void> signOut(HttpServletRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){
userService.signOut(request, userDetails.getId());
return ApiUtil.successOnly();
}

@PostMapping("/reissue-token")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.ourmenu.backend.domain.user.application;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
@Slf4j
public class AsyncEmailSenderService {

private final JavaMailSender emailSender;

@Async("mailExecutor")
public void sendEmail(String toEmail, String title, String content) throws MessagingException {
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(toEmail);
helper.setSubject(title);
helper.setText(content, true);
helper.setReplyTo("ourmenuv2@gmail.com");
emailSender.send(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.ourmenu.backend.domain.user.dao.UserRepository;
import com.ourmenu.backend.domain.user.domain.User;
import com.ourmenu.backend.domain.user.domain.CustomUserDetails;
import com.ourmenu.backend.domain.user.exception.UserNotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.userdetails.UserDetails;
Expand All @@ -20,9 +21,8 @@ public class CustomUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {

User user= userRepository.findByEmail(email).orElseThrow(
() -> new RuntimeException("Not Found Account")
);
User user= userRepository.findByEmail(email).
orElseThrow(UserNotFoundException::new);

return new CustomUserDetails(
user.getId(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,45 +1,37 @@
package com.ourmenu.backend.domain.user.application;

import com.ourmenu.backend.domain.user.dao.ConfirmCodeRepository;
import com.ourmenu.backend.domain.user.dao.UserRepository;
import com.ourmenu.backend.domain.user.domain.ConfirmCode;
import com.ourmenu.backend.domain.user.domain.User;
import com.ourmenu.backend.domain.user.dto.request.EmailRequest;
import com.ourmenu.backend.domain.user.dto.response.EmailResponse;
import com.ourmenu.backend.domain.user.dto.request.VerifyEmailRequest;
import com.ourmenu.backend.domain.user.dto.response.TemporaryPasswordResponse;
import com.ourmenu.backend.domain.user.exception.ConfirmCodeNotFoundException;
import com.ourmenu.backend.domain.user.exception.NotMatchConfirmCodeException;
import com.ourmenu.backend.domain.user.exception.SendCodeFailureException;
import com.ourmenu.backend.domain.user.exception.UserNotFoundException;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;

@Slf4j
@Service
@RequiredArgsConstructor
public class EmailService {

private final JavaMailSender emailSender;
private final AsyncEmailSenderService asyncEmailSenderService;
private final int CONFIRM_CODE_LENGTH = 6;
private final ConfirmCodeRepository confirmCodeRepository;
private final UserRepository userRepository;

public void sendEmail(String toEmail, String title, String content) throws MessagingException {
MimeMessage message = emailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(toEmail);
helper.setSubject(title);
helper.setText(content, true);
helper.setReplyTo("ourmenuv2@gmail.com");
try {
emailSender.send(message);
} catch (RuntimeException e) {
e.printStackTrace();
throw new RuntimeException("Unable to send email in sendEmail", e);
}
}

public EmailResponse sendCodeToEmail(EmailRequest request) {
public EmailResponse sendCodeToEmail(EmailRequest request){
String email = request.getEmail();
String title = "아워메뉴 이메일 인증 번호";
String generatedRandomCode = generateRandomCode(CONFIRM_CODE_LENGTH);
Expand All @@ -51,20 +43,17 @@ public EmailResponse sendCodeToEmail(EmailRequest request) {
+ "</html>";

try {
sendEmail(email, title, content);
} catch (RuntimeException | MessagingException e) {
e.printStackTrace();
throw new RuntimeException("Unable to send email in sendCodeToEmail", e);
asyncEmailSenderService.sendEmail(email, title, content);
}catch (MessagingException e){
throw new SendCodeFailureException();
}

ConfirmCode confirmCode = ConfirmCode.of(email, generatedRandomCode);
confirmCodeRepository.save(confirmCode);

EmailResponse response = EmailResponse.builder()
return EmailResponse.builder()
.code(generatedRandomCode)
.build();

return response;
}

public String generateRandomCode(int length) {
Expand All @@ -80,20 +69,26 @@ public String generateRandomCode(int length) {
return confirmCode.toString();
}

public String verifyConfirmCode(VerifyEmailRequest request){
public void verifyConfirmCode(VerifyEmailRequest request){
String email = request.getEmail();
String inputConfirmCode = request.getConfirmCode();

log.error("{},{}", email, inputConfirmCode);

ConfirmCode confirmCode = confirmCodeRepository.findConfirmCodeByEmail(email)
.orElseThrow(() -> new RuntimeException("ConfirmCode not found"));
.orElseThrow(ConfirmCodeNotFoundException::new);

if (!confirmCode.getConfirmCode().equals(inputConfirmCode)) {
throw new IllegalArgumentException("Confirmation code does not match.");
throw new NotMatchConfirmCodeException();
}

return "OK";
}

public TemporaryPasswordResponse sendTemporaryPassword(EmailRequest request) {
String email = request.getEmail();
String temporaryPassword = generateRandomCode(8);
User user = userRepository.findByEmail(email)
.orElseThrow(UserNotFoundException::new);

user.changePassword(temporaryPassword);
userRepository.save(user);
return TemporaryPasswordResponse.from(temporaryPassword);
}
}
Loading

0 comments on commit 627d8d5

Please sign in to comment.