import { MailService } from '@sendgrid/mail'; if (!process.env.SENDGRID_API_KEY) { console.warn("SENDGRID_API_KEY environment variable not set. Email functionality will be disabled."); } const mailService = new MailService(); if (process.env.SENDGRID_API_KEY) { mailService.setApiKey(process.env.SENDGRID_API_KEY); } const FROM_EMAIL = process.env.FROM_EMAIL || 'noreply@iistwin.ru'; const FRONTEND_URL = process.env.FRONTEND_URL || 'http://localhost:5000'; export class EmailService { async sendVerificationEmail( email: string, firstName: string, verificationToken: string, organizationName: string ): Promise { if (!process.env.SENDGRID_API_KEY) { console.log(`Mock verification email sent to ${email}`); return true; } try { const verificationUrl = `${FRONTEND_URL}/verify-email?token=${verificationToken}`; await mailService.send({ to: email, from: FROM_EMAIL, subject: `Подтверждение email в ${organizationName}`, html: `

Добро пожаловать в ${organizationName}!

Здравствуйте, ${firstName}!

Для завершения регистрации перейдите по ссылке:

Подтвердить email

Ссылка действительна в течение 24 часов.

Если вы не регистрировались в нашей системе, просто проигнорируйте это письмо.

` }); return true; } catch (error) { console.error('SendGrid verification email error:', error); return false; } } async sendInvitationEmail( email: string, firstName: string, inviterName: string, organizationName: string, tempPassword: string ): Promise { if (!process.env.SENDGRID_API_KEY) { console.log(`Mock invitation email sent to ${email}`); return true; } try { const loginUrl = `${FRONTEND_URL}/login`; await mailService.send({ to: email, from: FROM_EMAIL, subject: `Приглашение в ${organizationName}`, html: `

Вы приглашены в ${organizationName}

Здравствуйте, ${firstName}!

${inviterName} пригласил вас присоединиться к команде.

Ваши данные для входа:

Email: ${email}

Временный пароль: ${tempPassword}

Важно: Обязательно смените пароль после первого входа.

Войти в систему

Если вы не ожидали этого приглашения, свяжитесь с администратором ${organizationName}.

` }); return true; } catch (error) { console.error('SendGrid invitation email error:', error); return false; } } async sendInvitationLinkEmail( email: string, inviterName: string, organizationName: string, inviteLink: string ): Promise { if (!process.env.SENDGRID_API_KEY) { console.log(`Mock invitation link email sent to ${email}, link: ${inviteLink}`); return true; } try { await mailService.send({ to: email, from: FROM_EMAIL, subject: `Приглашение в ${organizationName}`, html: `

Вы приглашены в ${organizationName}

Здравствуйте!

${inviterName} пригласил вас присоединиться к команде.

Для завершения регистрации перейдите по ссылке:

Принять приглашение

Приглашение действительно в течение 7 дней.

Если вы не ожидали этого приглашения, просто проигнорируйте это письмо.

` }); return true; } catch (error) { console.error('SendGrid invitation link email error:', error); return false; } } async sendPasswordResetEmail( email: string, firstName: string, resetToken: string, organizationName: string, returnTo?: string ): Promise { if (!process.env.SENDGRID_API_KEY) { const returnToParam = returnTo ? `&returnTo=${encodeURIComponent(returnTo)}` : ''; console.log(`[DEV] Password reset link for ${email}: ${FRONTEND_URL}/reset-password?token=${resetToken}${returnToParam}`); return true; } try { const returnToParam = returnTo ? `&returnTo=${encodeURIComponent(returnTo)}` : ''; const resetUrl = `${FRONTEND_URL}/reset-password?token=${resetToken}${returnToParam}`; await mailService.send({ to: email, from: FROM_EMAIL, subject: `Восстановление пароля - ${organizationName}`, html: `

Восстановление пароля

Здравствуйте, ${firstName}!

Вы запросили восстановление пароля для вашей учетной записи в ${organizationName}.

Ссылка действительна в течение 1 часа.

Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо.

` }); return true; } catch (error) { console.error('SendGrid password reset email error:', error); return false; } } async sendSuperAdminPasswordResetEmail( email: string, name: string, resetToken: string ): Promise { if (!process.env.SENDGRID_API_KEY) { console.log(`[DEV] Superadmin password reset link for ${email}: ${FRONTEND_URL}/superadmin/reset-password?token=${resetToken}`); return true; } try { const resetUrl = `${FRONTEND_URL}/superadmin/reset-password?token=${resetToken}`; await mailService.send({ to: email, from: FROM_EMAIL, subject: 'Восстановление пароля суперадмина', html: `

Восстановление пароля суперадмина

Здравствуйте, ${name}!

Вы запросили сброс пароля для панели суперадмина.

Ссылка действительна в течение 1 часа.

Если вы не запрашивали восстановление пароля, просто проигнорируйте это письмо.

` }); return true; } catch (error) { console.error('SendGrid superadmin password reset email error:', error); return false; } } } export const emailService = new EmailService();