diff --git a/build.gradle b/build.gradle index 6d4e68a..4f98796 100644 --- a/build.gradle +++ b/build.gradle @@ -40,6 +40,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-webflux' @@ -47,7 +48,7 @@ dependencies { implementation 'org.flywaydb:flyway-core' implementation 'org.flywaydb:flyway-database-postgresql' implementation 'org.springframework.kafka:spring-kafka' - implementation 'ru.random.walk:event-exchange-contract:1.2.3' + implementation 'ru.random.walk:event-exchange-contract:1.2.5' implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' compileOnly 'org.projectlombok:lombok' diff --git a/deploy/twitter-service/values.yaml b/deploy/twitter-service/values.yaml index 321d117..a8cdc14 100644 --- a/deploy/twitter-service/values.yaml +++ b/deploy/twitter-service/values.yaml @@ -37,6 +37,14 @@ secrets: secret_key: FIREBASE_CREDENTIALS secret_name: twitter-secret + - name: MAIL_APP_PASSWORD + secret_key: MAIL_APP_PASSWORD + secret_name: twitter-secret + + - name: MAIL_USERNAME + secret_key: MAIL_USERNAME + secret_name: twitter-secret + serviceAccount: # Specifies whether a service account should be created create: true diff --git a/src/main/java/ru/randomwalk/twitterservice/controller/TestController.java b/src/main/java/ru/randomwalk/twitterservice/controller/TestController.java index 920290e..b647ee8 100644 --- a/src/main/java/ru/randomwalk/twitterservice/controller/TestController.java +++ b/src/main/java/ru/randomwalk/twitterservice/controller/TestController.java @@ -9,7 +9,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import ru.random.walk.dto.SendEmailEvent; import ru.random.walk.dto.SendNotificationEvent; +import ru.randomwalk.twitterservice.service.EmailService; import ru.randomwalk.twitterservice.service.NotificationSendingService; @RestController @@ -21,6 +23,7 @@ public class TestController { private final NotificationSendingService notificationSendingService; + private final EmailService emailService; @PostMapping("/send-notification") @Operation(description = "Test endpoint for notification sending") @@ -32,4 +35,10 @@ public void sendNotification(@RequestBody SendNotificationEvent event) { throw new RuntimeException(e); } } + + @PostMapping("/send-email") + @Operation(description = "Test endpoint for email sending") + public void sendEmail(@RequestBody SendEmailEvent event) { + emailService.sendEmail(event.recipient(), event.subject(), event.body(), event.isHtml()); + } } diff --git a/src/main/java/ru/randomwalk/twitterservice/listener/SendEmailEventListener.java b/src/main/java/ru/randomwalk/twitterservice/listener/SendEmailEventListener.java new file mode 100644 index 0000000..9c43cd9 --- /dev/null +++ b/src/main/java/ru/randomwalk/twitterservice/listener/SendEmailEventListener.java @@ -0,0 +1,30 @@ +package ru.randomwalk.twitterservice.listener; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Service; +import ru.random.walk.dto.SendEmailEvent; +import ru.random.walk.topic.EventTopic; +import ru.randomwalk.twitterservice.service.EmailService; + +@Slf4j +@Service +@RequiredArgsConstructor +public class SendEmailEventListener { + + private final ObjectMapper objectMapper; + private final EmailService emailService; + + @KafkaListener(topics = EventTopic.SEND_EMAIL) + public void handleSendEmailEvent(String message) { + try { + log.info("Processing send email event"); + var event = objectMapper.readValue(message, SendEmailEvent.class); + emailService.sendEmail(event.recipient(), event.subject(), event.body(), event.isHtml()); + } catch (Exception e) { + log.error("Error processing send email event {}", message, e); + } + } +} diff --git a/src/main/java/ru/randomwalk/twitterservice/service/EmailService.java b/src/main/java/ru/randomwalk/twitterservice/service/EmailService.java new file mode 100644 index 0000000..79334ce --- /dev/null +++ b/src/main/java/ru/randomwalk/twitterservice/service/EmailService.java @@ -0,0 +1,5 @@ +package ru.randomwalk.twitterservice.service; + +public interface EmailService { + void sendEmail(String email, String subject, String body, boolean isHtml); +} diff --git a/src/main/java/ru/randomwalk/twitterservice/service/impl/EmailServiceImpl.java b/src/main/java/ru/randomwalk/twitterservice/service/impl/EmailServiceImpl.java new file mode 100644 index 0000000..e3fa20e --- /dev/null +++ b/src/main/java/ru/randomwalk/twitterservice/service/impl/EmailServiceImpl.java @@ -0,0 +1,39 @@ +package ru.randomwalk.twitterservice.service.impl; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; +import ru.randomwalk.twitterservice.service.EmailService; + +@Service +@Slf4j +@RequiredArgsConstructor +public class EmailServiceImpl implements EmailService { + + private final JavaMailSender mailSender; + + @Value("${spring.mail.username}") + private String senderEmail; + + @Override + public void sendEmail(String email, String subject, String body, boolean isHtml) { + try { + var message = mailSender.createMimeMessage(); + var helper = new MimeMessageHelper(message, true, "UTF-8"); + helper.setFrom(senderEmail); + helper.setTo(email); + helper.setSubject(subject); + helper.setText(body, isHtml); + + log.info("Sending message with subject {} to {}", subject, email); + mailSender.send(message); + log.info("Message is sent"); + } catch (Exception e) { + log.error("Error sending message with subject {}", subject, e); + throw new RuntimeException(e); + } + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 83aabca..5950ee9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,4 +1,18 @@ spring: + mail: + host: smtp.gmail.com + port: 587 + password: ${MAIL_APP_PASSWORD:changeme} + username: ${MAIL_USERNAME:user@example.com} + properties: + mail: + smtp: + auth: true + starttls: + enable: true + connectiontimeout: 15000 + timeout: 10000 + writetimeout: 15000 security: oauth2: resourceserver: