From 33baa063a6c647f7fd367d0405f4a2af19599245 Mon Sep 17 00:00:00 2001 From: Nikita Kuritsyn Date: Tue, 29 Apr 2025 14:30:56 +0300 Subject: [PATCH 1/3] RANDOMWALK-201 Add email sending event listener --- build.gradle | 3 +- .../controller/TestController.java | 9 +++++ .../listener/SendEmailEventListener.java | 30 ++++++++++++++ .../twitterservice/service/EmailService.java | 5 +++ .../service/impl/EmailServiceImpl.java | 39 +++++++++++++++++++ src/main/resources/application.yml | 14 +++++++ 6 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/main/java/ru/randomwalk/twitterservice/listener/SendEmailEventListener.java create mode 100644 src/main/java/ru/randomwalk/twitterservice/service/EmailService.java create mode 100644 src/main/java/ru/randomwalk/twitterservice/service/impl/EmailServiceImpl.java 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/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..60c5392 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:local@email.com} + username: ${MAIL_USERNAME:somepassword} + properties: + mail: + smtp: + auth: true + starttls: + enable: true + connectiontimeout: 15000 + timeout: 10000 + writetimeout: 15000 security: oauth2: resourceserver: From a17cb364f347c7d730a380f8f17e8a79246c4b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D1=80=D0=B8=D1=86=D1=8B=D0=BD=20=D0=9D=D0=B8?= =?UTF-8?q?=D0=BA=D0=B8=D1=82=D0=B0=20=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D0=B4=D1=80=D0=BE=D0=B2=D0=B8=D1=87?= <96997917+kryakobess@users.noreply.github.com> Date: Tue, 29 Apr 2025 17:00:46 +0300 Subject: [PATCH 2/3] Update application.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 60c5392..5950ee9 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,8 +2,8 @@ spring: mail: host: smtp.gmail.com port: 587 - password: ${MAIL_APP_PASSWORD:local@email.com} - username: ${MAIL_USERNAME:somepassword} + password: ${MAIL_APP_PASSWORD:changeme} + username: ${MAIL_USERNAME:user@example.com} properties: mail: smtp: From 1a2c84696f9aeb2f1959255bae74d3ce05c51ab5 Mon Sep 17 00:00:00 2001 From: Nikita Kuritsyn Date: Tue, 29 Apr 2025 18:11:21 +0300 Subject: [PATCH 3/3] RANDOMWALK-201 Added secrets to deploy --- deploy/twitter-service/values.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) 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