package parkup.configs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import parkup.configs.email.EmailSender;
import parkup.configs.email.EmailValidator;
import parkup.configs.token.ConfirmationToken;
import parkup.configs.token.ConfirmationTokenService;
import parkup.entities.Administrator;
import parkup.services.AdministratorService;
import javax.transaction.Transactional;
import java.time.LocalDateTime;
@Service
public class RegistrationService {
private final AdministratorService administratorService;
private final EmailValidator emailValidator;
private final ConfirmationTokenService confirmationTokenService;
private final EmailSender emailSender;
@Autowired
public RegistrationService(AdministratorService administratorService, EmailValidator emailValidator,
ConfirmationTokenService confirmationTokenService, EmailSender emailSender) {
this.administratorService = administratorService;
this.emailValidator = emailValidator;
this.confirmationTokenService = confirmationTokenService;
this.emailSender = emailSender;
}
public String register(RegistrationRequest request) {
boolean isValidEmail = emailValidator.
test(request.getEmail());
if (!isValidEmail) {
throw new IllegalStateException("email not valid");
}
String token = administratorService.signUpAdministrator(
new Administrator(
request.getFirstName(),
request.getLastName(),
request.getEmail(),
request.getPassword()
)
);
String link = "http://localhost:8080/administrator/registration/confirm?token=" + token;
emailSender.send(
request.getEmail(),
buildEmail(request.getFirstName(), link));
return token;
}
@Transactional
public String confirmToken(String token) {
ConfirmationToken confirmationToken = confirmationTokenService
.getToken(token)
.orElseThrow(() ->
new IllegalStateException("token not found"));
if (confirmationToken.getConfirmedAt() != null) {
throw new IllegalStateException("email already confirmed");
}
LocalDateTime expiredAt = confirmationToken.getExpiresAt();
if (expiredAt.isBefore(LocalDateTime.now())) {
throw new IllegalStateException("token expired");
}
confirmationTokenService.setConfirmedAt(token);
administratorService.enableAdministrator(confirmationToken.getAdministrator().getEmail());
return "confirmed";
}
private String buildEmail(String name, String link) {
return "
\n" +
"\n" +
"
\n" +
"\n" +
"
\n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" | \n" +
" \n" +
" Confirm your email\n" +
" | \n" +
" \n" +
" \n" +
" \n" +
" | \n" +
" \n" +
" \n" +
" \n" +
" | \n" +
"
\n" +
"
\n" +
"
\n" +
" \n" +
" | \n" +
" \n" +
" \n" +
" \n" +
" \n" +
" | \n" +
" \n" +
" \n" +
" \n" +
" | \n" +
" | \n" +
"
\n" +
"
\n" +
"\n" +
"\n" +
"\n" +
"
\n" +
" \n" +
"
| \n" +
"
\n" +
" \n" +
"
| \n" +
" \n" +
" \n" +
" Hi " + name + ", Thank you for registering. Please click on the below link to activate your account: Activate Now \n Link will expire in 15 minutes. See you soon " +
" \n" +
" | \n" +
"
| \n" +
"
\n" +
" \n" +
"
| \n" +
"
\n" +
"
\n" +
"\n" +
"
";
}
}