RegistrationService.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package com.example.plantsforyou.registration;
  2. import com.example.plantsforyou.appuser.AppUser;
  3. import com.example.plantsforyou.appuser.AppUserRole;
  4. import com.example.plantsforyou.appuser.AppUserService;
  5. import com.example.plantsforyou.email.EmailSender;
  6. import com.example.plantsforyou.email.EmailService;
  7. import com.example.plantsforyou.registration.token.ConfirmationToken;
  8. import com.example.plantsforyou.registration.token.ConfirmationTokenService;
  9. import lombok.AllArgsConstructor;
  10. import org.springframework.stereotype.Service;
  11. import org.springframework.transaction.annotation.Transactional;
  12. import java.time.LocalDateTime;
  13. @Service
  14. @AllArgsConstructor
  15. public class RegistrationService {
  16. private final AppUserService appUserService;
  17. private final EmailValidator emailValidator;
  18. private ConfirmationTokenService confirmationTokenService;
  19. private final EmailSender emailSender;
  20. public String register(RegistrationRequest request) {
  21. boolean isValidEmail = emailValidator.test(request.getEmail());
  22. if(!isValidEmail){
  23. throw new IllegalStateException("email not valid");
  24. }
  25. String token = appUserService.signUpUser(
  26. new AppUser(
  27. request.getFirstName(),
  28. request.getLastName(),
  29. request.getEmail(),
  30. request.getPassword(),
  31. AppUserRole.USER
  32. ));
  33. String link = "http://localhost:8080/confirm?token=" + token;
  34. emailSender.send(request.getEmail(), buildEmail(request.getFirstName(), link));
  35. //TODO: Email server configration
  36. return token;
  37. }
  38. @Transactional
  39. public String confirmToken(String token) {
  40. ConfirmationToken confirmationToken = confirmationTokenService
  41. .getToken(token)
  42. .orElseThrow(() ->
  43. new IllegalStateException("token not found"));
  44. if (confirmationToken.getConfirmedAt() != null) {
  45. throw new IllegalStateException("email already confirmed");
  46. }
  47. LocalDateTime expiredAt = confirmationToken.getExpiresAt();
  48. if (expiredAt.isBefore(LocalDateTime.now())) {
  49. throw new IllegalStateException("token expired");
  50. }
  51. confirmationTokenService.setConfirmedAt(token);
  52. appUserService.enableAppUser(
  53. confirmationToken.getAppUser().getEmail());
  54. return "confirmed";
  55. }
  56. private String buildEmail(String name, String link) {
  57. return "<div style=\"font-family:Helvetica,Arial,sans-serif;font-size:16px;margin:0;color:#0b0c0c\">\n" +
  58. "\n" +
  59. "<span style=\"display:none;font-size:1px;color:#fff;max-height:0\"></span>\n" +
  60. "\n" +
  61. " <table role=\"presentation\" width=\"100%\" style=\"border-collapse:collapse;min-width:100%;width:100%!important\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n" +
  62. " <tbody><tr>\n" +
  63. " <td width=\"100%\" height=\"53\" bgcolor=\"#0b0c0c\">\n" +
  64. " \n" +
  65. " <table role=\"presentation\" width=\"100%\" style=\"border-collapse:collapse;max-width:580px\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\">\n" +
  66. " <tbody><tr>\n" +
  67. " <td width=\"70\" bgcolor=\"#0b0c0c\" valign=\"middle\">\n" +
  68. " <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"border-collapse:collapse\">\n" +
  69. " <tbody><tr>\n" +
  70. " <td style=\"padding-left:10px\">\n" +
  71. " \n" +
  72. " </td>\n" +
  73. " <td style=\"font-size:28px;line-height:1.315789474;Margin-top:4px;padding-left:10px\">\n" +
  74. " <span style=\"font-family:Helvetica,Arial,sans-serif;font-weight:700;color:#ffffff;text-decoration:none;vertical-align:top;display:inline-block\">Confirm your email</span>\n" +
  75. " </td>\n" +
  76. " </tr>\n" +
  77. " </tbody></table>\n" +
  78. " </a>\n" +
  79. " </td>\n" +
  80. " </tr>\n" +
  81. " </tbody></table>\n" +
  82. " \n" +
  83. " </td>\n" +
  84. " </tr>\n" +
  85. " </tbody></table>\n" +
  86. " <table role=\"presentation\" class=\"m_-6186904992287805515content\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"border-collapse:collapse;max-width:580px;width:100%!important\" width=\"100%\">\n" +
  87. " <tbody><tr>\n" +
  88. " <td width=\"10\" height=\"10\" valign=\"middle\"></td>\n" +
  89. " <td>\n" +
  90. " \n" +
  91. " <table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"border-collapse:collapse\">\n" +
  92. " <tbody><tr>\n" +
  93. " <td bgcolor=\"#1D70B8\" width=\"100%\" height=\"10\"></td>\n" +
  94. " </tr>\n" +
  95. " </tbody></table>\n" +
  96. " \n" +
  97. " </td>\n" +
  98. " <td width=\"10\" valign=\"middle\" height=\"10\"></td>\n" +
  99. " </tr>\n" +
  100. " </tbody></table>\n" +
  101. "\n" +
  102. "\n" +
  103. "\n" +
  104. " <table role=\"presentation\" class=\"m_-6186904992287805515content\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"border-collapse:collapse;max-width:580px;width:100%!important\" width=\"100%\">\n" +
  105. " <tbody><tr>\n" +
  106. " <td height=\"30\"><br></td>\n" +
  107. " </tr>\n" +
  108. " <tr>\n" +
  109. " <td width=\"10\" valign=\"middle\"><br></td>\n" +
  110. " <td style=\"font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:1.315789474;max-width:560px\">\n" +
  111. " \n" +
  112. " <p style=\"Margin:0 0 20px 0;font-size:19px;line-height:25px;color:#0b0c0c\">Hi " + name + ",</p><p style=\"Margin:0 0 20px 0;font-size:19px;line-height:25px;color:#0b0c0c\"> Thank you for registering. Please click on the below link to activate your account: </p><blockquote style=\"Margin:0 0 20px 0;border-left:10px solid #b1b4b6;padding:15px 0 0.1px 15px;font-size:19px;line-height:25px\"><p style=\"Margin:0 0 20px 0;font-size:19px;line-height:25px;color:#0b0c0c\"> <a href=\"" + link + "\">Activate Now</a> </p></blockquote>\n Link will expire in 15 minutes. <p>See you soon</p>" +
  113. " \n" +
  114. " </td>\n" +
  115. " <td width=\"10\" valign=\"middle\"><br></td>\n" +
  116. " </tr>\n" +
  117. " <tr>\n" +
  118. " <td height=\"30\"><br></td>\n" +
  119. " </tr>\n" +
  120. " </tbody></table><div class=\"yj6qo\"></div><div class=\"adL\">\n" +
  121. "\n" +
  122. "</div></div>";
  123. }
  124. }