use of com.sanctionco.thunder.ThunderException in project thunder by RohanNagar.
the class VerificationResource method sendEmail.
/**
* Sends an email message to the given email address. The email message will contain
* a custom URL that can be called to verify the email address. This method will update the user
* in the database to include the generated verification token.
*
* @param uriInfo the HTTP metadata of the incoming request
* @param response the async response object used to notify that the operation has completed
* @param auth the auth principal required to access the resource
* @param email the message recipient's email address
* @param password the user's password
*
* @see VerificationResource#verifyEmail(AsyncResponse, String, String, ResponseType)
*/
@POST
@Metered(name = "send-email-requests")
@SwaggerAnnotations.Methods.Email
public void sendEmail(@Context UriInfo uriInfo, @Suspended AsyncResponse response, @Parameter(hidden = true) @Auth Principal auth, @Parameter(hidden = true) @QueryParam("email") String email, @Parameter(hidden = true) @HeaderParam("password") String password) {
requestOptions.setTimeout(response, sendEmailTimeoutCounter);
try {
requestValidator.validate(password, email, false);
} catch (RequestValidationException e) {
response.resume(e.response(email));
return;
}
LOG.info("Attempting to send verification email to user {}", email);
usersDao.findByEmail(email).thenApply(user -> {
// Check that the supplied password is correct for the user's account
requestValidator.verifyPasswordHeader(password, user.getPassword());
// Generate the unique verification token
String token = generateVerificationToken();
// Update the user's verification token
return new User(new Email(user.getEmail().getAddress(), false, token), user.getPassword(), user.getProperties());
}).thenCompose(user -> usersDao.update(user.getEmail().getAddress(), user)).thenCompose(result -> {
// Build the verification URL
String verificationUrl = uriInfo.getBaseUriBuilder().path("/verify").queryParam("email", result.getEmail().getAddress()).queryParam("token", result.getEmail().getVerificationToken()).queryParam("response_type", "html").build().toString();
LOG.info("Built verification URL {}", verificationUrl);
// Send the email to the user's email address
return emailService.sendVerificationEmail(result.getEmail(), verificationUrl).thenApply(success -> {
if (!success) {
LOG.error("Error sending email to address {}", result.getEmail().getAddress());
throw new ThunderException("An error occurred while attempting to send email.");
}
return result;
});
}).whenComplete((result, throwable) -> {
if (Objects.isNull(throwable)) {
LOG.info("Successfully sent verification email to user {}.", email);
response.resume(Response.ok(result).build());
} else {
LOG.error("Error sending email to {}. Caused by: {}", email, throwable.getMessage());
response.resume(ThunderException.responseFromThrowable(throwable, email));
}
});
}
Aggregations