diff --git a/build.gradle b/build.gradle index c3e2dedc..e71dd8a6 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,7 @@ dependencies { compile('org.springframework.boot:spring-boot-starter-thymeleaf') compile('com.auth0:java-jwt:3.4.0') compile group: 'com.google.guava', name: 'guava', version: '23.5-jre' + compile group: 'com.mashape.unirest', name: 'unirest-java', version: '1.3.1' runtime 'org.springframework.boot:spring-boot-starter-tomcat:1.5.6.RELEASE' runtime 'org.springframework.security:spring-security-taglibs:4.2.3.RELEASE' runtime 'org.apache.tomcat.embed:tomcat-embed-jasper:8.5.20' diff --git a/src/main/java/org/seattlevoluntech/SeattlevoluntechAppConfig.java b/src/main/java/org/seattlevoluntech/SeattlevoluntechAppConfig.java new file mode 100644 index 00000000..9a6c502c --- /dev/null +++ b/src/main/java/org/seattlevoluntech/SeattlevoluntechAppConfig.java @@ -0,0 +1,29 @@ +package org.seattlevoluntech; + +import org.seattlevoluntech.Utilities.EmailUtility; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SeattlevoluntechAppConfig { + + // Bean configuration for Mail Sender + + /** + * Domain for mailgun mail sender api + */ + @Value(value = "${mailgun.domain}") + private String mailgunDomain; + + /** + * API key required to send emails through mailgun + */ + @Value(value = "${mailgun.api.key}") + private String mailgunApiKey; + + @Bean + public EmailUtility emailUtility() { + return new EmailUtility(mailgunDomain, mailgunApiKey); + } +} diff --git a/src/main/java/org/seattlevoluntech/Utilities/EmailUtility.java b/src/main/java/org/seattlevoluntech/Utilities/EmailUtility.java new file mode 100644 index 00000000..42ce5df6 --- /dev/null +++ b/src/main/java/org/seattlevoluntech/Utilities/EmailUtility.java @@ -0,0 +1,25 @@ +package org.seattlevoluntech.Utilities; + +import com.mashape.unirest.http.HttpResponse; +import com.mashape.unirest.http.JsonNode; +import com.mashape.unirest.http.Unirest; +import com.mashape.unirest.http.exceptions.UnirestException; +import lombok.RequiredArgsConstructor; +import org.seattlevoluntech.models.Email; + +@RequiredArgsConstructor +public class EmailUtility { + private final String DOMAIN; + private final String API_KEY; + + public JsonNode SendSimpleMessage(Email email) throws UnirestException { + HttpResponse request = Unirest.post("https://api.mailgun.net/v3/" + DOMAIN + "/messages") + .basicAuth("api", API_KEY) + .field("from", email.getFrom()) + .field("to", email.getTo()) + .field("subject", email.getSubject()) + .field("text", email.getMessage()) + .asJson(); + return request.getBody(); + } +} diff --git a/src/main/java/org/seattlevoluntech/controllers/ProjectController.java b/src/main/java/org/seattlevoluntech/controllers/ProjectController.java index 0fc8e849..78c1c60f 100644 --- a/src/main/java/org/seattlevoluntech/controllers/ProjectController.java +++ b/src/main/java/org/seattlevoluntech/controllers/ProjectController.java @@ -1,6 +1,9 @@ package org.seattlevoluntech.controllers; import com.google.common.collect.Lists; +import com.mashape.unirest.http.exceptions.UnirestException; +import org.seattlevoluntech.Utilities.EmailUtility; +import org.seattlevoluntech.models.Email; import org.seattlevoluntech.storage.Project; import org.seattlevoluntech.storage.*; import org.slf4j.Logger; @@ -21,6 +24,8 @@ public class ProjectController { private ProjectsRepository projectsRepository; @Autowired private UsersRepository usersRepository; + @Autowired + private EmailUtility emailUtility; // Create project @PostMapping(path="/projects") @@ -112,8 +117,12 @@ public Optional linkUserWithProject( } - optionalUser.get().addProject(optionalProject.get()); + Optional newProjectList = Optional.ofNullable(optionalUser.get().addProject(optionalProject.get())); + usersRepository.save(optionalUser.get()); + if (newProjectList.isPresent()) { + sendEmail(optionalUser.get(), optionalProject.get()); + } return projectsRepository.findById(projectId); } @@ -128,4 +137,25 @@ public List deleteProject(@PathVariable("id") Long id) { projectsRepository.deleteById(id); return Lists.newArrayList(projectsRepository.findAll()); } + + + private void sendEmail(User user, Project project) { + try { + Email email = new Email(); + email.setFrom("no-reply@seattlevoluntech.com"); + // TODO: Set this email up dynamically based on the owner of the project + email.setTo("jennyyuan88+voluntechTest@gmail.com"); + email.setSubject("You got a volunteer for: " + project.getProjectName()); + email.setMessage( + "Hello, a volunteer joined your project named " + + project.getProjectName() + + ". Their name is " + + user.getFirstName() + " " + user.getLastName() + "." + + " You can reach them at: " + user.getEmail() + ); + emailUtility.SendSimpleMessage(email); + } catch (UnirestException e) { + logger.error(e.toString()); + } + } } diff --git a/src/main/java/org/seattlevoluntech/models/Email.java b/src/main/java/org/seattlevoluntech/models/Email.java new file mode 100644 index 00000000..92dd7fb1 --- /dev/null +++ b/src/main/java/org/seattlevoluntech/models/Email.java @@ -0,0 +1,11 @@ +package org.seattlevoluntech.models; + +import lombok.Data; + +@Data +public class Email { + private String from; + private String to; + private String subject; + private String message; +} diff --git a/src/main/java/org/seattlevoluntech/storage/User.java b/src/main/java/org/seattlevoluntech/storage/User.java index 7b9cde33..60168f50 100644 --- a/src/main/java/org/seattlevoluntech/storage/User.java +++ b/src/main/java/org/seattlevoluntech/storage/User.java @@ -117,11 +117,13 @@ public void setLastName(String lastName) { public void setEmail(String email) { this.email = email; } - public void addProject(Project project) { + public List addProject(Project project) { if (!this.projects.contains(project)) { projects.add(project); + return projects; } + return null; } @JsonIgnoreProperties("users") diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index eb78edd5..c2ef429b 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,3 +10,7 @@ spring.datasource.password=${DB_PASS} #Do nothing spring.jpa.hibernate.ddl-auto=none + +#Mailgun email sender properties: +mailgun.domain: sandbox08786ed216874ad697286dcf97357a43.mailgun.org +mailgun.api.key: 41a98182603ad234d941c01860d8e426-c8c889c9-270b8e5a \ No newline at end of file