admin-profiles.html
This commit is contained in:
423
admin-server.js
423
admin-server.js
@@ -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
1242
public/admin-profiles.html
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user