Newer
Older
teacher-diary / src / main / java / ru / mcs / diary / common / service / MailService.java
package ru.mcs.diary.common.service;

import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
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.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.util.Map;

@Slf4j
@Service
@RequiredArgsConstructor
public class MailService {

    private final JavaMailSender mailSender;
    private final TemplateEngine templateEngine;

    @Value("${app.mail.from}")
    private String fromEmail;

    @Value("${app.mail.base-url}")
    private String baseUrl;

    @Async
    public void sendPasswordResetEmail(String to, String token, String userName) {
        String resetLink = baseUrl + "/auth/reset-password?token=" + token;

        Map<String, Object> variables = Map.of(
                "userName", userName,
                "resetLink", resetLink,
                "expiryHours", 24
        );

        sendHtmlEmail(to, "Восстановление пароля — Teacher Diary", "email/password-reset", variables);
    }

    @Async
    public void sendParentInviteEmail(String to, String token, String parentName, String teacherName) {
        String inviteLink = baseUrl + "/auth/parent/invite?token=" + token;

        Map<String, Object> variables = Map.of(
                "parentName", parentName,
                "teacherName", teacherName,
                "inviteLink", inviteLink
        );

        sendHtmlEmail(to, "Приглашение в Teacher Diary", "email/parent-invite", variables);
    }

    @Async
    public void sendLessonReportEmail(String to, String parentName, String childName,
                                      String lessonDate, String topic, String grade) {
        Map<String, Object> variables = Map.of(
                "parentName", parentName,
                "childName", childName,
                "lessonDate", lessonDate,
                "topic", topic != null ? topic : "Не указана",
                "grade", grade != null ? grade : "Не выставлена",
                "dashboardLink", baseUrl + "/parent/dashboard"
        );

        sendHtmlEmail(to, "Отчёт о занятии — " + childName, "email/lesson-report", variables);
    }

    private void sendHtmlEmail(String to, String subject, String templateName, Map<String, Object> variables) {
        try {
            Context context = new Context();
            context.setVariables(variables);
            String htmlContent = templateEngine.process(templateName, context);

            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

            helper.setFrom(fromEmail);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(htmlContent, true);

            mailSender.send(message);
            log.info("Email sent successfully to: {}", to);

        } catch (MessagingException e) {
            log.error("Failed to send email to: {}", to, e);
        }
    }
}