diff --git a/application/model/pom.xml b/application/model/pom.xml index aa4f9b9351f270657a187486488e3bb080640c10..1add6d565270fc20bbe48bfd87a72617b7697a74 100644 --- a/application/model/pom.xml +++ b/application/model/pom.xml @@ -17,5 +17,16 @@ <properties> <spring-boot.repackage.skip>true</spring-boot.repackage.skip> </properties> + <dependencies> + <dependency> + <groupId>org.ifinalframework.annotation</groupId> + <artifactId>final-annotation-web</artifactId> + <version>1.4.0</version> + </dependency> + <dependency> + <groupId>jakarta.validation</groupId> + <artifactId>jakarta.validation-api</artifactId> + </dependency> + </dependencies> </project> \ No newline at end of file diff --git a/application/model/src/main/java/org/fuseri/model/dto/mail/MailDto.java b/application/model/src/main/java/org/fuseri/model/dto/mail/MailDto.java new file mode 100644 index 0000000000000000000000000000000000000000..413e15b2276990f965f6c8b8df50822531750e65 --- /dev/null +++ b/application/model/src/main/java/org/fuseri/model/dto/mail/MailDto.java @@ -0,0 +1,22 @@ +package org.fuseri.model.dto.mail; + +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class MailDto { + + @NotBlank + public + String receiver; + @NotBlank + public + String content; + + public MailDto(String receiver, String content) { + this.receiver = receiver; + this.content = content; + } +} diff --git a/application/module-mail/pom.xml b/application/module-mail/pom.xml index 4e729ff38d3890445b327bb0af9a73c66bd8d893..451076a8ca1b206274c2fd3c92dca0342b48f086 100644 --- a/application/module-mail/pom.xml +++ b/application/module-mail/pom.xml @@ -22,11 +22,37 @@ <artifactId>spring-boot-starter</artifactId> </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-validation</artifactId> + </dependency> + <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> + <version>3.0.4</version> + </dependency> + <dependency> + <groupId>org.fuseri</groupId> + <artifactId>models</artifactId> + <version>0.0.1-SNAPSHOT</version> + <scope>compile</scope> + </dependency> + + <!-- <dependency>--> +<!-- <groupId>javax.mail</groupId>--> +<!-- <artifactId>mail</artifactId>--> +<!-- <version>1.4.7</version>--> +<!-- </dependency>--> </dependencies> <build> diff --git a/application/module-mail/src/main/java/org/fuseri/modulemail/service/MailController.java b/application/module-mail/src/main/java/org/fuseri/modulemail/service/MailController.java new file mode 100644 index 0000000000000000000000000000000000000000..58f76ef0df363a1c3f94178239c690454f001f5b --- /dev/null +++ b/application/module-mail/src/main/java/org/fuseri/modulemail/service/MailController.java @@ -0,0 +1,42 @@ +package org.fuseri.modulemail.service; + + +import jakarta.validation.Valid; +import jakarta.validation.constraints.PositiveOrZero; +import org.fuseri.model.dto.mail.MailDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/mail") +public class MailController { + + private final MailService service; + + @Autowired + public MailController(MailService service) { + this.service = service; + } + + + @GetMapping("/{id}") + public String getEmail(@PositiveOrZero @PathVariable("id") Long id) { + return "No mail with that id yet"; + } + + @DeleteMapping("/delete/{id}") + public String deleteMail(@PositiveOrZero @PathVariable("id") Long id) { + return "Nothing to delete Yet"; +} + + @PostMapping() + public String sendMail(@Valid @RequestBody MailDto emailDto) { + return service.send(emailDto); + } +} diff --git a/application/module-mail/src/main/java/org/fuseri/modulemail/service/MailService.java b/application/module-mail/src/main/java/org/fuseri/modulemail/service/MailService.java new file mode 100644 index 0000000000000000000000000000000000000000..06f5fb822a6b2b8757d8829456c38bdeb6bb0a8d --- /dev/null +++ b/application/module-mail/src/main/java/org/fuseri/modulemail/service/MailService.java @@ -0,0 +1,39 @@ +package org.fuseri.modulemail.service; + +import org.fuseri.model.dto.mail.MailDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +@Service +public class MailService { + + private final JavaMailSender emailSender; + + @Autowired + public MailService(JavaMailSender emailSender) { + this.emailSender = emailSender; + } + + public String send(MailDto dto) { + var message = new SimpleMailMessage(); + message.setFrom("sprachul@gmail.com"); + message.setTo(dto.receiver); + message.setSubject("Sprachschul"); + message.setText(dto.content); + + emailSender.send(message); + // store to database once there is one + + return "Success, you have sent: " + dto.content; + } + + public MailDto getMail(long id) { + return new MailDto("empty","empty"); // return from database once there is one + } + + public String deleteMail(long id) { + return "No mail with that Id"; + } + +} diff --git a/application/module-mail/src/main/resources/application.properties b/application/module-mail/src/main/resources/application.properties index 8b137891791fe96927ad78e64b0aad7bded08bdc..59c05327cf5d2cc3ea272498cab107cf4dbc37d8 100644 --- a/application/module-mail/src/main/resources/application.properties +++ b/application/module-mail/src/main/resources/application.properties @@ -1 +1,6 @@ - +spring.mail.host=smtp.gmail.com +spring.mail.port=587 +spring.mail.username=sprachschul@gmail.com +spring.mail.password=xnyxsknctypmubbb +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true diff --git a/application/module-mail/src/test/java/org/fuseri/modulemail/service/MailControllerTest.java b/application/module-mail/src/test/java/org/fuseri/modulemail/service/MailControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8ec50ec90575fbb9d97be2f7fc781e13022588b6 --- /dev/null +++ b/application/module-mail/src/test/java/org/fuseri/modulemail/service/MailControllerTest.java @@ -0,0 +1,53 @@ +package org.fuseri.modulemail.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.fuseri.model.dto.mail.MailDto; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +class MailControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Test + void getEmail() throws Exception { + mockMvc.perform(get("/mail/{id}", 1)) + .andExpect(status().isOk()); + } + + @Test + void deleteMail() throws Exception { + mockMvc.perform(delete("/mail/delete/{id}", 1)) + .andExpect(status().isOk()); + } + + @Test + void sendMail() throws Exception { + var mailDto = new MailDto("user@example.com", "Hello"); + MailController mailController = mock(MailController.class); + when(mailController.sendMail(mailDto)).thenReturn("Success, you have sent: " + mailDto.getContent()); + + mockMvc.perform(post("/mail") + .content(asJsonString(mailDto)) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + private static String asJsonString(final Object obj) throws JsonProcessingException { + return new ObjectMapper().writeValueAsString(obj); + } + +} \ No newline at end of file