const nodemailer = require('nodemailer');
let db;
let settingsModule;
function init(database, settings) {
db = database;
settingsModule = settings;
}
function getSettings(callback) {
settingsModule.getAll((err, all) => {
if (err) return callback(err);
callback(null, all);
});
}
function createTransport(settings, callback) {
if (!settings.smtp_host) return callback(new Error('SMTP host not configured'));
const transport = nodemailer.createTransport({
host: settings.smtp_host,
port: parseInt(settings.smtp_port) || 587,
secure: settings.smtp_secure === 'true',
auth: {
user: settings.smtp_user || '',
pass: settings.smtp_pass || ''
}
});
callback(null, transport);
}
function sendTestEmail(settings, to, callback) {
createTransport(settings, (err, transport) => {
if (err) return callback(err);
transport.sendMail({
from: settings.smtp_from || settings.smtp_user,
to: to,
subject: 'Hotel 777 — Тестовое письмо',
html: `
Hotel 777
Это тестовое письмо. Настройки SMTP работают корректно.
Отправлено: ${new Date().toLocaleString('ru-RU')}
`
}, (err, info) => {
callback(err, info);
});
});
}
function sendBookingConfirmation(booking) {
if (!booking.phone) return;
getSettings((err, settings) => {
if (err || settings.email_notifications_enabled !== 'true') return;
createTransport(settings, (err, transport) => {
if (err) { console.error('Email transport error:', err.message); return; }
transport.sendMail({
from: settings.smtp_from || settings.smtp_user,
to: settings.admin_email || settings.smtp_user,
subject: `Новая бронь: ${booking.name} — ${booking.room_type || 'Номер'} — с ${booking.checkin_date}`,
html: `
Hotel 777 — Новая бронь
| Имя: | ${booking.name} |
| Телефон: | ${booking.phone} |
| Номер: | ${booking.room_type || '—'} |
| Гостей: | ${booking.adults} взр.${booking.children ? ', ' + booking.children + ' дет.' : ''} |
| Заезд: | ${booking.checkin_date} |
| Выезд: | ${booking.checkout_date} |
| Сумма: | ${booking.total_price || booking.base_price || 0} ₽ |
${booking.wishes ? `| Пожелания: | ${booking.wishes} |
` : ''}
Зайдите в админ-панель для управления бронью.
`
}, (err) => {
if (err) console.error('Booking confirmation email error:', err.message);
});
});
});
}
function sendStatusChange(booking, oldStatus, newStatus) {
getSettings((err, settings) => {
if (err || settings.email_notifications_enabled !== 'true') return;
if (oldStatus === newStatus) return;
createTransport(settings, (err, transport) => {
if (err) { console.error('Email transport error:', err.message); return; }
transport.sendMail({
from: settings.smtp_from || settings.smtp_user,
to: settings.admin_email || settings.smtp_user,
subject: `Статус брони #${booking.id} изменён: ${oldStatus} → ${newStatus}`,
html: `
Hotel 777 — Изменение статуса
Бронь #${booking.id} — ${booking.name}
Статус изменён: ${oldStatus} → ${newStatus}
${new Date().toLocaleString('ru-RU')}
`
}, (err) => {
if (err) console.error('Status change email error:', err.message);
});
});
});
}
function setupRoutes(app, authenticateToken, requireAdmin) {
}
module.exports = { init, setupRoutes, sendTestEmail, sendBookingConfirmation, sendStatusChange, getSettings };