admin-profiles.html

This commit is contained in:
2026-01-26 22:26:03 +05:00
parent bb88a1183f
commit e547c89ce0
3 changed files with 1672 additions and 0 deletions

View File

@@ -853,4 +853,427 @@ router.get('/admin/export', requireAdmin, async (req, res) => {
}
});
// Получение профилей пользователей с настройками уведомлений
router.get('/admin/user-profiles', requireAdmin, async (req, res) => {
try {
const { getDb } = require('./database');
const db = getDb();
const query = `
SELECT
u.id,
u.login,
u.name,
u.email as user_email,
u.role,
u.auth_type,
u.groups,
u.created_at,
u.last_login,
us.email_notifications,
us.notification_email,
us.telegram_notifications,
us.telegram_chat_id,
us.vk_notifications,
us.vk_user_id,
us.updated_at as settings_updated_at
FROM users u
LEFT JOIN user_settings us ON u.id = us.user_id
ORDER BY u.name
`;
db.all(query, [], (err, profiles) => {
if (err) {
console.error('Ошибка получения профилей пользователей:', err);
return res.status(500).json({ error: 'Ошибка сервера' });
}
res.json(profiles);
});
} catch (error) {
console.error('Ошибка:', error);
res.status(500).json({ error: 'Ошибка сервера' });
}
});
// Получение конкретного профиля пользователя
router.get('/admin/user-profiles/:id', requireAdmin, async (req, res) => {
try {
const { getDb } = require('./database');
const db = getDb();
const userId = req.params.id;
const query = `
SELECT
u.id,
u.login,
u.name,
u.email as user_email,
u.role,
u.auth_type,
u.groups,
u.created_at,
u.last_login,
us.email_notifications,
us.notification_email,
us.telegram_notifications,
us.telegram_chat_id,
us.vk_notifications,
us.vk_user_id,
us.created_at as settings_created_at,
us.updated_at as settings_updated_at
FROM users u
LEFT JOIN user_settings us ON u.id = us.user_id
WHERE u.id = ?
`;
db.get(query, [userId], (err, profile) => {
if (err) {
console.error('Ошибка получения профиля пользователя:', err);
return res.status(500).json({ error: 'Ошибка сервера' });
}
if (!profile) {
return res.status(404).json({ error: 'Пользователь не найден' });
}
res.json(profile);
});
} catch (error) {
console.error('Ошибка:', error);
res.status(500).json({ error: 'Ошибка сервера' });
}
});
// Обновление настроек уведомлений пользователя (для админа)
router.put('/admin/user-profiles/:id/notification-settings', requireAdmin, async (req, res) => {
try {
const { getDb } = require('./database');
const db = getDb();
const userId = req.params.id;
const {
email_notifications,
notification_email,
telegram_notifications,
telegram_chat_id,
vk_notifications,
vk_user_id
} = req.body;
// Валидация email
if (email_notifications && notification_email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(notification_email)) {
return res.status(400).json({ error: 'Неверный формат email' });
}
}
// Проверяем существование записи
db.get("SELECT id FROM user_settings WHERE user_id = ?", [userId], (err, existing) => {
if (err) {
console.error('Ошибка проверки настроек:', err);
return res.status(500).json({ error: 'Ошибка сервера' });
}
if (existing) {
// Обновляем существующие настройки
db.run(
`UPDATE user_settings SET
email_notifications = ?,
notification_email = ?,
telegram_notifications = ?,
telegram_chat_id = ?,
vk_notifications = ?,
vk_user_id = ?,
updated_at = CURRENT_TIMESTAMP
WHERE user_id = ?`,
[
email_notifications ? 1 : 0,
notification_email || '',
telegram_notifications ? 1 : 0,
telegram_chat_id || '',
vk_notifications ? 1 : 0,
vk_user_id || '',
userId
],
function(updateErr) {
if (updateErr) {
console.error('Ошибка обновления настроек:', updateErr);
return res.status(500).json({ error: 'Ошибка сервера' });
}
// Логируем действие
const { logActivity } = require('./database');
if (logActivity) {
logActivity(0, req.session.user.id, 'USER_SETTINGS_UPDATED', `Админ обновил настройки уведомлений пользователя ${userId}`);
}
console.log(`✅ Админ обновил настройки пользователя ${userId}`);
res.json({ success: true, message: 'Настройки уведомлений обновлены' });
}
);
} else {
// Создаем новые настройки
db.run(
`INSERT INTO user_settings
(user_id, email_notifications, notification_email,
telegram_notifications, telegram_chat_id,
vk_notifications, vk_user_id)
VALUES (?, ?, ?, ?, ?, ?, ?)`,
[
userId,
email_notifications ? 1 : 0,
notification_email || '',
telegram_notifications ? 1 : 0,
telegram_chat_id || '',
vk_notifications ? 1 : 0,
vk_user_id || ''
],
function(insertErr) {
if (insertErr) {
console.error('Ошибка создания настроек:', insertErr);
return res.status(500).json({ error: 'Ошибка сервера' });
}
// Логируем действие
const { logActivity } = require('./database');
if (logActivity) {
logActivity(null, req.session.user.id, 'USER_SETTINGS_CREATED', `Админ создал настройки уведомлений пользователя ${userId}`);
}
console.log(`✅ Админ создал настройки пользователя ${userId}`);
res.json({ success: true, message: 'Настройки уведомлений созданы' });
}
);
}
});
} catch (error) {
console.error('Ошибка:', error);
res.status(500).json({ error: 'Ошибка сервера' });
}
});
// Массовое обновление email уведомлений для нескольких пользователей
router.post('/admin/bulk-email-settings', requireAdmin, async (req, res) => {
try {
const { getDb } = require('./database');
const db = getDb();
const { users, email_notifications, notification_email } = req.body;
if (!Array.isArray(users) || users.length === 0) {
return res.status(400).json({ error: 'Выберите пользователей' });
}
if (email_notifications && !notification_email) {
return res.status(400).json({ error: 'Укажите email для уведомлений' });
}
// Валидация email
if (email_notifications && notification_email) {
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(notification_email)) {
return res.status(400).json({ error: 'Неверный формат email' });
}
}
const results = {
success: 0,
failed: 0,
errors: []
};
// Обновляем каждого пользователя в транзакции
db.serialize(() => {
db.run("BEGIN TRANSACTION");
users.forEach(userId => {
// Проверяем существование записи
db.get("SELECT id FROM user_settings WHERE user_id = ?", [userId], (err, existing) => {
if (err) {
results.failed++;
results.errors.push({ userId, error: err.message });
return;
}
if (existing) {
// Обновляем существующие настройки
db.run(
`UPDATE user_settings SET
email_notifications = ?,
notification_email = ?,
updated_at = CURRENT_TIMESTAMP
WHERE user_id = ?`,
[
email_notifications ? 1 : 0,
email_notifications ? notification_email : '',
userId
],
function(updateErr) {
if (updateErr) {
results.failed++;
results.errors.push({ userId, error: updateErr.message });
} else {
results.success++;
}
}
);
} else {
// Создаем новые настройки с значениями по умолчанию
db.run(
`INSERT INTO user_settings
(user_id, email_notifications, notification_email,
telegram_notifications, telegram_chat_id,
vk_notifications, vk_user_id)
VALUES (?, ?, ?, 0, '', 0, '')`,
[
userId,
email_notifications ? 1 : 0,
email_notifications ? notification_email : ''
],
function(insertErr) {
if (insertErr) {
results.failed++;
results.errors.push({ userId, error: insertErr.message });
} else {
results.success++;
}
}
);
}
});
});
setTimeout(() => {
db.run("COMMIT", (commitErr) => {
if (commitErr) {
console.error('Ошибка коммита транзакции:', commitErr);
return res.status(500).json({ error: 'Ошибка транзакции' });
}
// Логируем действие
const { logActivity } = require('./database');
if (logActivity) {
logActivity(null, req.session.user.id, 'BULK_SETTINGS_UPDATED',
`Админ массово обновил настройки для ${users.length} пользователей`);
}
console.log(`✅ Массовое обновление: успешно ${results.success}, ошибок ${results.failed}`);
res.json({
success: true,
message: 'Настройки обновлены',
results
});
});
}, 1000);
});
} catch (error) {
console.error('Ошибка:', error);
res.status(500).json({ error: 'Ошибка сервера' });
}
});
// Отправка тестового уведомления пользователю
router.post('/admin/user-profiles/:id/test-notification', requireAdmin, async (req, res) => {
try {
const { getDb } = require('./database');
const db = getDb();
const userId = req.params.id;
const notificationType = req.body.notification_type || 'test';
// Получаем информацию о пользователе
db.get(`
SELECT u.id, u.name, u.email, us.email_notifications, us.notification_email
FROM users u
LEFT JOIN user_settings us ON u.id = us.user_id
WHERE u.id = ?
`, [userId], async (err, user) => {
if (err) {
console.error('Ошибка получения пользователя:', err);
return res.status(500).json({ error: 'Ошибка сервера' });
}
if (!user) {
return res.status(404).json({ error: 'Пользователь не найден' });
}
// Проверяем, включены ли email уведомления
if (!user.email_notifications) {
return res.status(400).json({ error: 'Email уведомления отключены у пользователя' });
}
const emailTo = user.notification_email || user.email;
if (!emailTo) {
return res.status(400).json({ error: 'У пользователя не указан email' });
}
// Отправляем тестовое уведомление
const emailNotifications = require('./email-notifications');
const emailSent = await emailNotifications.sendEmailNotification(
emailTo,
'Тестовое уведомление от School CRM',
`
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; }
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
.header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 20px; border-radius: 10px 10px 0 0; }
.content { padding: 20px; border: 1px solid #ddd; border-top: none; }
.button { display: inline-block; background: #667eea; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; }
.footer { margin-top: 20px; font-size: 12px; color: #666; }
</style>
</head>
<body>
<div class="container">
<div class="header">
<h2>✅ Тестовое уведомление</h2>
</div>
<div class="content">
<p>Здравствуйте, ${user.name}!</p>
<p>Это тестовое уведомление от системы School CRM.</p>
<p>Если вы получили это письмо, значит настройки уведомлений работают корректно.</p>
<br>
<p><strong>Информация о тесте:</strong></p>
<ul>
<li>Получатель: ${emailTo}</li>
<li>Отправитель: Администратор</li>
<li>Время: ${new Date().toLocaleString('ru-RU')}</li>
</ul>
</div>
<div class="footer">
<p>Это тестовое сообщение от School CRM системы.</p>
<p>Вы можете изменить настройки уведомлений в личном кабинете.</p>
</div>
</div>
</body>
</html>
`
);
if (emailSent) {
// Логируем действие
const { logActivity } = require('./database');
if (logActivity) {
logActivity(null, req.session.user.id, 'TEST_NOTIFICATION_SENT',
`Админ отправил тестовое уведомление пользователю ${user.name} (${emailTo})`);
}
res.json({
success: true,
message: 'Тестовое уведомление отправлено',
email: emailTo
});
} else {
res.status(500).json({ error: 'Не удалось отправить уведомление' });
}
});
} catch (error) {
console.error('Ошибка:', error);
res.status(500).json({ error: 'Ошибка сервера' });
}
});
module.exports = router;

1242
public/admin-profiles.html Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -550,6 +550,13 @@ app.get('/admin', (req, res) => {
}
res.sendFile(path.join(__dirname, 'public/admin.html'));
});
// Страница профилей пользователей (только для админов)
app.get('/admin/profiles', (req, res) => {
if (!req.session.user || req.session.user.role !== 'admin') {
return res.status(403).send('Доступ запрещен');
}
res.sendFile(path.join(__dirname, 'public/admin-profiles.html'));
});
// API для получения настроек уведомлений пользователя
app.get('/api/user/settings', requireAuth, async (req, res) => {