чистка

This commit is contained in:
2026-04-06 22:24:23 +05:00
parent 8a29851940
commit 19993c79e8
2 changed files with 0 additions and 466 deletions

View File

@@ -1,383 +0,0 @@
// group-management.js
const express = require('express');
const router = express.Router();
function setupGroupManagement(app, db) {
// Middleware для проверки администратора
function requireAdmin(req, res, next) {
if (!req.session.user || req.session.user.role !== 'admin') {
return res.status(403).json({ error: 'Недостаточно прав' });
}
next();
}
// API для получения всех групп
router.get('/api/groups', requireAdmin, (req, res) => {
db.all(`
SELECT g.*,
COUNT(DISTINCT ugm.user_id) as member_count
FROM user_groups g
LEFT JOIN user_group_memberships ugm ON g.id = ugm.group_id
GROUP BY g.id
ORDER BY g.name
`, [], (err, groups) => {
if (err) {
console.error('❌ Ошибка получения групп:', err);
return res.status(500).json({ error: 'Ошибка получения групп' });
}
res.json(groups || []);
});
});
// API для получения одной группы с участниками
router.get('/api/groups/:groupId', requireAdmin, (req, res) => {
const { groupId } = req.params;
db.get(`
SELECT g.*,
COUNT(DISTINCT ugm.user_id) as member_count
FROM user_groups g
LEFT JOIN user_group_memberships ugm ON g.id = ugm.group_id
WHERE g.id = ?
GROUP BY g.id
`, [groupId], (err, group) => {
if (err || !group) {
return res.status(404).json({ error: 'Группа не найдена' });
}
// Получаем участников группы
db.all(`
SELECT u.id, u.login, u.name, u.email, u.role
FROM users u
JOIN user_group_memberships ugm ON u.id = ugm.user_id
WHERE ugm.group_id = ?
ORDER BY u.name
`, [groupId], (err, members) => {
if (err) {
console.error('❌ Ошибка получения участников:', err);
return res.status(500).json({ error: 'Ошибка получения участников' });
}
res.json({
...group,
members: members || []
});
});
});
});
// API для создания новой группы
router.post('/api/groups', requireAdmin, (req, res) => {
const { name, description, color, can_approve_documents } = req.body;
if (!name) {
return res.status(400).json({ error: 'Название группы обязательно' });
}
db.run(`
INSERT INTO user_groups (name, description, color, can_approve_documents)
VALUES (?, ?, ?, ?)
`, [
name.trim(),
description || '',
color || '#3498db',
can_approve_documents ? 1 : 0
], function(err) {
if (err) {
console.error('❌ Ошибка создания группы:', err);
return res.status(500).json({
error: 'Ошибка создания группы',
details: err.message.includes('UNIQUE') ? 'Группа с таким названием уже существует' : err.message
});
}
res.json({
success: true,
groupId: this.lastID,
message: 'Группа создана успешно'
});
});
});
// API для обновления группы
router.put('/api/groups/:groupId', requireAdmin, (req, res) => {
const { groupId } = req.params;
const { name, description, color, can_approve_documents } = req.body;
if (!name) {
return res.status(400).json({ error: 'Название группы обязательно' });
}
db.run(`
UPDATE user_groups
SET name = ?, description = ?, color = ?, can_approve_documents = ?, updated_at = CURRENT_TIMESTAMP
WHERE id = ?
`, [
name.trim(),
description || '',
color || '#3498db',
can_approve_documents ? 1 : 0,
groupId
], function(err) {
if (err) {
console.error('❌ Ошибка обновления группы:', err);
return res.status(500).json({
error: 'Ошибка обновления группы',
details: err.message.includes('UNIQUE') ? 'Группа с таким названием уже существует' : err.message
});
}
if (this.changes === 0) {
return res.status(404).json({ error: 'Группа не найдена' });
}
res.json({
success: true,
message: 'Группа обновлена успешно'
});
});
});
// API для удаления группы
router.delete('/api/groups/:groupId', requireAdmin, (req, res) => {
const { groupId } = req.params;
db.run(`DELETE FROM user_groups WHERE id = ?`, [groupId], function(err) {
if (err) {
console.error('❌ Ошибка удаления группы:', err);
return res.status(500).json({ error: 'Ошибка удаления группы' });
}
if (this.changes === 0) {
return res.status(404).json({ error: 'Группа не найдена' });
}
res.json({
success: true,
message: 'Группа удалена успешно'
});
});
});
// API для добавления пользователя в группу
router.post('/api/groups/:groupId/members', requireAdmin, (req, res) => {
const { groupId } = req.params;
const { userId } = req.body;
if (!userId) {
return res.status(400).json({ error: 'ID пользователя обязательно' });
}
// Проверяем существование группы и пользователя
db.get(`SELECT id FROM user_groups WHERE id = ?`, [groupId], (err, group) => {
if (err || !group) {
return res.status(404).json({ error: 'Группа не найдена' });
}
db.get(`SELECT id FROM users WHERE id = ?`, [userId], (err, user) => {
if (err || !user) {
return res.status(404).json({ error: 'Пользователь не найден' });
}
db.run(`
INSERT OR IGNORE INTO user_group_memberships (user_id, group_id)
VALUES (?, ?)
`, [userId, groupId], function(err) {
if (err) {
console.error('❌ Ошибка добавления пользователя в группу:', err);
return res.status(500).json({ error: 'Ошибка добавления пользователя в группу' });
}
res.json({
success: true,
message: 'Пользователь добавлен в группу'
});
});
});
});
});
// API для удаления пользователя из группы
router.delete('/api/groups/:groupId/members/:userId', requireAdmin, (req, res) => {
const { groupId, userId } = req.params;
db.run(`
DELETE FROM user_group_memberships
WHERE user_id = ? AND group_id = ?
`, [userId, groupId], function(err) {
if (err) {
console.error('❌ Ошибка удаления пользователя из группы:', err);
return res.status(500).json({ error: 'Ошибка удаления пользователя из группы' });
}
if (this.changes === 0) {
return res.status(404).json({ error: 'Пользователь не найден в группе' });
}
res.json({
success: true,
message: 'Пользователь удален из группы'
});
});
});
// API для получения всех пользователей с их группами
router.get('/api/users-with-groups', requireAdmin, (req, res) => {
db.all(`
SELECT u.id, u.login, u.name, u.email, u.role,
GROUP_CONCAT(DISTINCT g.name) as group_names,
GROUP_CONCAT(DISTINCT g.id) as group_ids
FROM users u
LEFT JOIN user_group_memberships ugm ON u.id = ugm.user_id
LEFT JOIN user_groups g ON ugm.group_id = g.id
WHERE u.role IN ('admin', 'teacher')
GROUP BY u.id
ORDER BY u.name
`, [], (err, users) => {
if (err) {
console.error('❌ Ошибка получения пользователей с группами:', err);
return res.status(500).json({ error: 'Ошибка получения данных' });
}
// Преобразуем строки в массивы
const formattedUsers = users.map(user => ({
...user,
group_names: user.group_names ? user.group_names.split(',') : [],
group_ids: user.group_ids ? user.group_ids.split(',').map(id => parseInt(id)) : []
}));
res.json(formattedUsers);
});
});
// API для получения доступных групп для пользователя
router.get('/api/users/:userId/available-groups', requireAdmin, (req, res) => {
const { userId } = req.params;
db.all(`
SELECT g.*,
CASE WHEN ugm.user_id IS NOT NULL THEN 1 ELSE 0 END as is_member
FROM user_groups g
LEFT JOIN user_group_memberships ugm ON g.id = ugm.group_id AND ugm.user_id = ?
ORDER BY g.name
`, [userId], (err, groups) => {
if (err) {
console.error('❌ Ошибка получения групп:', err);
return res.status(500).json({ error: 'Ошибка получения данных' });
}
res.json(groups || []);
});
});
// API для массового обновления групп пользователя
router.put('/api/users/:userId/groups', requireAdmin, (req, res) => {
const { userId } = req.params;
const { groupIds } = req.body; // массив ID групп
if (!Array.isArray(groupIds)) {
return res.status(400).json({ error: 'groupIds должен быть массивом' });
}
// Проверяем существование пользователя
db.get(`SELECT id FROM users WHERE id = ?`, [userId], (err, user) => {
if (err || !user) {
return res.status(404).json({ error: 'Пользователь не найден' });
}
db.serialize(() => {
// Удаляем все текущие группы пользователя
db.run(`DELETE FROM user_group_memberships WHERE user_id = ?`, [userId], (err) => {
if (err) {
console.error('❌ Ошибка удаления старых групп:', err);
return res.status(500).json({ error: 'Ошибка обновления групп' });
}
// Добавляем новые группы
if (groupIds.length > 0) {
const placeholders = groupIds.map(() => '(?, ?)').join(',');
const values = groupIds.reduce((acc, groupId) => {
acc.push(userId, groupId);
return acc;
}, []);
db.run(`
INSERT INTO user_group_memberships (user_id, group_id)
VALUES ${placeholders}
`, values, (err) => {
if (err) {
console.error('❌ Ошибка добавления новых групп:', err);
return res.status(500).json({ error: 'Ошибка обновления групп' });
}
res.json({
success: true,
message: 'Группы пользователя обновлены'
});
});
} else {
res.json({
success: true,
message: 'Группы пользователя обновлены'
});
}
});
});
});
});
// API для получения пользователей, которые могут согласовывать документы
router.get('/api/approvers', requireAdmin, (req, res) => {
db.all(`
SELECT DISTINCT u.id, u.login, u.name, u.email, u.role,
g.name as group_name, g.color as group_color
FROM users u
JOIN user_group_memberships ugm ON u.id = ugm.user_id
JOIN user_groups g ON ugm.group_id = g.id
WHERE g.can_approve_documents = 1
ORDER BY u.name
`, [], (err, approvers) => {
if (err) {
console.error('❌ Ошибка получения согласующих:', err);
return res.status(500).json({ error: 'Ошибка получения данных' });
}
res.json(approvers || []);
});
});
// API для получения групп, которые могут согласовывать документы
router.get('/api/approver-groups', (req, res) => {
const isAdmin = req.session.user && req.session.user.role === 'admin';
db.all(`
SELECT g.*,
COUNT(DISTINCT ugm.user_id) as member_count
FROM user_groups g
LEFT JOIN user_group_memberships ugm ON g.id = ugm.group_id
WHERE g.can_approve_documents = 1
GROUP BY g.id
ORDER BY g.name
`, [], (err, groups) => {
if (err) {
console.error('❌ Ошибка получения групп согласующих:', err);
return res.status(500).json({ error: 'Ошибка получения данных' });
}
// Для обычных пользователей скрываем ID пользователей в группах
if (!isAdmin) {
groups = groups.map(group => ({
...group,
members: undefined
}));
}
res.json(groups || []);
});
});
return router;
}
module.exports = { setupGroupManagement };

View File

@@ -1,83 +0,0 @@
// server-init.js
const path = require('path');
const fs = require('fs');
const { setupUploadMiddleware } = require('./upload-middleware');
const { setupTaskEndpoints } = require('./task-endpoints');
async function initializeServer(app) {
console.log('🚀 Инициализация сервера...');
try {
const { initializeDatabase, getDb, isInitialized } = require('./database');
const authService = require('./auth');
const postgresLogger = require('./postgres');
// 1. Инициализируем базу данных
console.log('🔧 Инициализация базы данных...');
await initializeDatabase();
// 2. Получаем объект БД
const db = getDb();
console.log('✅ База данных готова');
// 3. Настраиваем authService с БД
authService.setDatabase(db);
console.log('✅ Сервис аутентификации готов');
// 4. Настраиваем загрузку файлов
const upload = setupUploadMiddleware();
console.log('✅ Middleware загрузки файлов настроен');
// 5. Настраиваем endpoint'ы для задач
setupTaskEndpoints(app, db, upload);
console.log('✅ Endpoint\'ы задач настроены');
// 6. Загружаем админ роутер
try {
const adminRouter = require('./admin-server');
console.log('Admin router loaded:', adminRouter);
console.log('Type:', typeof adminRouter);
if (adminRouter && typeof adminRouter === 'function') {
app.use(adminRouter);
console.log('✅ Админ роутер подключен');
} else {
console.error('❌ Admin router is not a valid middleware function');
// Создаем заглушку, чтобы сервер работал
const express = require('express');
const stubRouter = express.Router();
stubRouter.get('*', (req, res) => {
res.status(501).json({ error: 'Admin router not available' });
});
app.use(stubRouter);
console.log('⚠️ Используется заглушка для админ роутера');
}
} catch (error) {
console.error('❌ Ошибка загрузки админ роутера:', error.message);
console.error('Stack:', error.stack);
// Создаем заглушку, чтобы сервер не падал
const express = require('express');
const stubRouter = express.Router();
stubRouter.get('*', (req, res) => {
res.status(503).json({
error: 'Admin panel temporarily unavailable',
message: error.message
});
});
app.use(stubRouter);
console.log('⚠️ Создана заглушка для админ роутера из-за ошибки');
}
console.log('✅ Сервер полностью инициализирован');
return { db, upload };
} catch (error) {
console.error('❌ Ошибка инициализации сервера:', error.message);
console.error(error.stack);
throw error;
}
}
module.exports = { initializeServer };