Skip to content

Commit

Permalink
email-service-api - module, email client test, fixing NPE on EmailUtil
Browse files Browse the repository at this point in the history
  • Loading branch information
gtiwari333 committed Aug 2, 2020
1 parent bde1902 commit 9118dc3
Show file tree
Hide file tree
Showing 13 changed files with 119 additions and 40 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,6 @@ nbdist/
# Logs
######################
*.log*
.dmp
.trc
.txt
27 changes: 23 additions & 4 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<profile.withTestContainer/>
<app.version>${parent.version}</app.version>
<mapstruct.version>1.3.1.Final</mapstruct.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>

<selenide.version>5.13.0</selenide.version>
<google-guava.version>29.0-jre</google-guava.version>
Expand Down Expand Up @@ -52,7 +53,6 @@

</properties>


<dependencies>
<dependency>
<artifactId>orm</artifactId>
Expand All @@ -67,7 +67,12 @@
<dependency>
<artifactId>common</artifactId>
<groupId>gt.app</groupId>
<version>1.0</version>
<version>${app.version}</version>
</dependency>
<dependency>
<artifactId>email-service-api</artifactId>
<groupId>gt.app</groupId>
<version>${app.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand All @@ -78,6 +83,10 @@
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
Expand Down Expand Up @@ -122,7 +131,6 @@
<version>${keycloak.version}</version>
</dependency>


<!-- processors/code generators -->
<dependency>
<groupId>org.projectlombok</groupId>
Expand Down Expand Up @@ -178,7 +186,6 @@
<version>${google-guava.version}</version>
</dependency>


<!-- test dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down Expand Up @@ -238,6 +245,18 @@
<!-- test only dependencies -->
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<finalName>${build.profile}-${project.version}-app</finalName>
<defaultGoal>spring-boot:run</defaultGoal>
Expand Down
7 changes: 7 additions & 0 deletions core/src/main/java/gt/api/email/EmailClient.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package gt.api.email;

import org.springframework.cloud.openfeign.FeignClient;

@FeignClient(name = "email-service", url = "${feign-clients.email-service.url}")
public interface EmailClient extends EmailService {
}
2 changes: 2 additions & 0 deletions core/src/main/java/gt/app/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.core.env.Environment;

import java.net.InetAddress;
Expand All @@ -16,6 +17,7 @@
@SpringBootApplication
@Slf4j
@EnableConfigurationProperties(AppProperties.class)
@EnableFeignClients
public class Application {

public static void main(String[] args) throws UnknownHostException {
Expand Down
38 changes: 38 additions & 0 deletions core/src/main/java/gt/app/web/rest/TestResource.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package gt.app.web.rest;

import gt.api.email.EmailClient;
import gt.api.email.EmailDto;
import lombok.AllArgsConstructor;
import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("tests")
@AllArgsConstructor
@Profile("dev")
public class TestResource {

final EmailClient emailClient;

@GetMapping("/email")
void testEmail() {

EmailDto email = new EmailDto();
email.setTo(List.of("email@local.com"));
email.setFrom("email@local.com");

var filesBArray = new EmailDto.FileBArray[1];
for (int i = 0; i < 1; i++) {
filesBArray[i] = new EmailDto.FileBArray("uplFile.getBytes()".getBytes(), "testfile.txt");
}
email.setFiles(filesBArray);

email.setSubject("hello");
email.setContent("hello");
emailClient.sendEmailWithAttachments(email);
}
}
3 changes: 3 additions & 0 deletions core/src/main/resources/application-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,6 @@ keycloak:
principal-attribute: name
credentials.secret: dc168f0c-3c7f-47b9-b700-43d746978566

feign-clients:
email-service:
url: http://localhost:8085/ #TODO: use service discovery
1 change: 1 addition & 0 deletions core/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ logging.level:
org.springframework.web: INFO
org.springframework.security: INFO
org.springframework.security.web: INFO
org.springframework.cloud: INFO
org.hibernate: INFO
ROOT: WARN
gt: DEBUG
Expand Down
8 changes: 7 additions & 1 deletion email-service/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
</parent>

<properties>
<app.version>${parent.version}</app.version>
<!-- code quality -->
<archunit-junit5.version>0.14.1</archunit-junit5.version>
<sonar-maven-plugin.version>3.6.0.1398</sonar-maven-plugin.version>
Expand All @@ -35,7 +36,12 @@
<dependency>
<artifactId>common</artifactId>
<groupId>gt.app</groupId>
<version>1.0</version>
<version>${app.version}</version>
</dependency>
<dependency>
<artifactId>email-service-api</artifactId>
<groupId>gt.app</groupId>
<version>${app.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
29 changes: 18 additions & 11 deletions email-service/src/main/java/gt/mail/modules/email/EmailService.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
package gt.mail.modules.email;

import gt.api.email.EmailDto;
import gt.mail.config.AppProperties;
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 org.springframework.web.multipart.MultipartFile;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
Expand All @@ -33,7 +34,7 @@ public class EmailService {

@Transactional
public void queue(Collection<InternetAddress> to, Collection<InternetAddress> cc, Collection<InternetAddress> bcc, InternetAddress fromAddress,
String subject, String content, MultipartFile[] files, boolean isHtml) {
String subject, String content, EmailDto.FileBArray[] files, boolean isHtml) {

try {
QueuedEmail email = new QueuedEmail();
Expand All @@ -45,12 +46,12 @@ public void queue(Collection<InternetAddress> to, Collection<InternetAddress> cc
email.setFrom(EmailAddress.from(fromAddress.getAddress(), fromAddress.getPersonal()));


for (MultipartFile file : files) {
String newFileName = UUID.randomUUID() + "_" + file.getName();
saveEmailAttachment(file, newFileName);
for (var fileBArray : files) {
String newFileName = UUID.randomUUID() + "_" + fileBArray.getFilename();
saveEmailAttachment(fileBArray, newFileName);

var attachment = new QueuedEmailAttachment();
attachment.setFileName(file.getName());
attachment.setFileName(fileBArray.getFilename());
attachment.setSavedFileName(newFileName);
email.addAttachment(attachment);
}
Expand All @@ -67,7 +68,7 @@ public void queue(Collection<InternetAddress> to, Collection<InternetAddress> cc
public void deQueue(QueuedEmail email) throws UnsupportedEncodingException, MessagingException {

MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());
var message = new MimeMessageHelper(mimeMessage, true, StandardCharsets.UTF_8.name());

message.setTo(toInetArray(email.getRecipient().getTos()));
message.setCc(toInetArray(email.getRecipient().getCcs()));
Expand All @@ -92,18 +93,24 @@ public File getEmailAttachment(String savedFileName) {
return new File(appProperties.getFileStorage().getTempFolder() + File.separator + "emails", savedFileName);
}

public void saveEmailAttachment(MultipartFile file, String savedFileName) throws IOException {
public void saveEmailAttachment(EmailDto.FileBArray reqFileBArray, String savedFileName) throws IOException {

File copyTo = new File(appProperties.getFileStorage().getTempFolder() + File.separator + "emails", savedFileName);
File destFile = new File(appProperties.getFileStorage().getTempFolder() + File.separator + "emails", savedFileName);
try {
copyTo.getParentFile().mkdirs();
destFile.getParentFile().mkdirs();
} catch (SecurityException ex) {
log.error("Could not create directory " + ex.getMessage(), ex);
throw ex;
}

file.transferTo(copyTo);
transferTo(destFile, reqFileBArray.getData());

}

public void transferTo(File destination, byte[] bytes) throws IOException {
try (var outputStream = new FileOutputStream(destination)) {
outputStream.write(bytes);
}
}

}
9 changes: 9 additions & 0 deletions email-service/src/main/java/gt/mail/utils/EmailUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,23 @@ public static Function<String, InternetAddress> toInternetAddr() {
}

public static Set<InternetAddress> toInternetAddr(Collection<String> to) {
if (to == null) {
return Set.of();
}
return to.stream().map(EmailUtil.toInternetAddr()).collect(Collectors.toSet());
}

public static Set<EmailAddress> toPlainStr(Collection<InternetAddress> to) {
if (to == null) {
return Set.of();
}
return to.stream().map(it -> EmailAddress.from(it.getAddress(), it.getPersonal())).collect(Collectors.toSet());
}

public static InternetAddress[] toInetArray(Collection<EmailAddress> tos) {
if (tos == null) {
return new InternetAddress[0];
}
return tos.stream().map(EmailUtil.fromEmailAddress()).toArray(InternetAddress[]::new);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package gt.mail.web.rest;

import gt.api.email.EmailDto;
import gt.mail.modules.email.EmailService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
Expand All @@ -16,14 +18,14 @@
@RestController
@RequiredArgsConstructor
@Slf4j
public class EmailController {
public class EmailController implements gt.api.email.EmailService {
private final EmailService emailService;

@PostMapping("/sendEmail")
public ResponseEntity<?> sendEmailWithAttachments(@Valid @NotNull EmailDto email) {
public ResponseEntity<Void> sendEmailWithAttachments(@RequestBody @Valid @NotNull EmailDto email) {

emailService.queue(toInternetAddr(email.to), toInternetAddr(email.cc), toInternetAddr(email.bcc),
toInternetAddr().apply(email.from), email.subject, email.content, email.files, email.isHtml);
emailService.queue(toInternetAddr(email.getTo()), toInternetAddr(email.getCc()), toInternetAddr(email.getBcc()),
toInternetAddr().apply(email.getFrom()), email.getSubject(), email.getContent(), email.getFiles(), email.isHtml());

return ResponseEntity.ok().build();
}
Expand Down
20 changes: 0 additions & 20 deletions email-service/src/main/java/gt/mail/web/rest/EmailDto.java

This file was deleted.

2 changes: 2 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
<module>orm-jooq</module>
<module>core</module>
<module>email-service</module>
<module>email-service-api</module>
<module>common</module>
</modules>

Expand All @@ -30,6 +31,7 @@
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<springdoc-openapi-ui.version>1.4.3</springdoc-openapi-ui.version>
<spring-cloud.version>Hoxton.SR6</spring-cloud.version>
</properties>


Expand Down

0 comments on commit 9118dc3

Please sign in to comment.