admin-api-management

This commit is contained in:
2026-02-25 22:08:57 +05:00
parent 0ece532121
commit 507868108f
5 changed files with 3076 additions and 2430 deletions

123
server.js
View File

@@ -22,7 +22,8 @@ const api2Groups = require('./api2-groups');
//
const chatAPI = require('./api-chat');
// Подключаем API для управления межсервисным взаимодействием
const { setupUpravlenieEndpoints } = require('./upravlenie-service');
//const { setupUpravlenieEndpoints } = require('./upravlenie-service');
const apiKeysModule = require('./api-keys');
//
const app = express();
const PORT = process.env.PORT || 3000;
@@ -165,6 +166,28 @@ const requireAuth = (req, res, next) => {
next();
};
// Middleware для проверки прав администратора
const requireAdmin = (req, res, next) => {
if (!req.session || !req.session.user) {
return res.status(401).json({ error: 'Требуется аутентификация' });
}
if (req.session.user.role !== 'admin') {
return res.status(403).json({ error: 'Недостаточно прав. Требуется роль администратора' });
}
next();
};
// Middleware для проверки прав на управление задачами (admin или tasks)
const requireTasksAccess = (req, res, next) => {
if (!req.session || !req.session.user) {
return res.status(401).json({ error: 'Требуется аутентификация' });
}
if (req.session.user.role !== 'admin' && req.session.user.role !== 'tasks') {
return res.status(403).json({ error: 'Недостаточно прав. Требуется роль admin или tasks' });
}
next();
};
// API для аутентификации
app.post('/api/login', async (req, res) => {
const { login, password } = req.body;
@@ -303,6 +326,7 @@ app.get('/api/user', (req, res) => {
res.status(401).json({ error: 'Не аутентифицирован' });
}
});
// Получаем актуальные группы пользователя из новой структуры
app.get('/api/user_v2', (req, res) => {
if (req.session.user) {
@@ -371,6 +395,7 @@ app.get('/api/users/group/help', requireAuth, (req, res) => {
res.json(rows);
});
});
// API для получения пользователей группы "doc"
app.get('/api/users/group/doc', requireAuth, (req, res) => {
db.all(`
@@ -389,6 +414,7 @@ app.get('/api/users/group/doc', requireAuth, (req, res) => {
res.json(rows);
});
});
// Middleware для проверки наличия БД в API endpoints
app.use((req, res, next) => {
if (!db && req.path.startsWith('/api/') && req.path !== '/api/health' && req.path !== '/api/login') {
@@ -739,11 +765,9 @@ app.get('/doc', (req, res) => {
if (!hasAccess) {
return res.status(403).send('в разработке');
}
//if (!req.session.user || req.session.user.role !== 'admin') {
// return res.status(403).send('в разработке');
//}
res.sendFile(path.join(__dirname, 'public/doc.html'));
});
// Страница поддержка
app.get('/help', (req, res) => {
if (!req.session.user) {
@@ -983,6 +1007,7 @@ app.get('/api/groups', requireAuth, (req, res) => {
res.json(groups);
});
});
// API для всех пользователей с группами
app.get('/api/users/all', requireAuth, (req, res) => {
if (req.session.user.role !== 'admin') {
@@ -1032,6 +1057,75 @@ app.get('/api/users/all', requireAuth, (req, res) => {
});
});
// API для обновления пользователя (только для админов)
app.put('/api/users/:userId', requireAuth, requireAdmin, (req, res) => {
const { userId } = req.params;
const { name, email, role, auth_type, is_active } = req.body;
// Проверяем существование пользователя
db.get('SELECT id FROM users WHERE id = ?', [userId], (err, user) => {
if (err) {
console.error('❌ Ошибка проверки пользователя:', err);
return res.status(500).json({ error: err.message });
}
if (!user) {
return res.status(404).json({ error: 'Пользователь не найден' });
}
// Формируем запрос на обновление
const updates = [];
const params = [];
if (name !== undefined) {
updates.push('name = ?');
params.push(name);
}
if (email !== undefined) {
updates.push('email = ?');
params.push(email);
}
if (role !== undefined) {
updates.push('role = ?');
params.push(role);
}
if (auth_type !== undefined) {
updates.push('auth_type = ?');
params.push(auth_type);
}
if (is_active !== undefined) {
updates.push('is_active = ?');
params.push(is_active ? 1 : 0);
}
if (updates.length === 0) {
return res.status(400).json({ error: 'Нет данных для обновления' });
}
updates.push('updated_at = CURRENT_TIMESTAMP');
params.push(userId);
const query = `UPDATE users SET ${updates.join(', ')} WHERE id = ?`;
db.run(query, params, function(err) {
if (err) {
console.error('❌ Ошибка обновления пользователя:', err);
return res.status(500).json({ error: err.message });
}
res.json({
success: true,
message: 'Пользователь успешно обновлен',
changes: this.changes
});
});
});
});
// API для добавления пользователя в группу
app.post('/api/groups/:groupId/users/:userId', requireAuth, (req, res) => {
if (req.session.user.role !== 'admin') {
@@ -1344,6 +1438,7 @@ app.delete('/api/tasks/:taskId/files/batch-delete', requireAuth, (req, res) => {
});
});
});
// API для получения информации о файле
app.get('/api/files/:fileId', requireAuth, (req, res) => {
const { fileId } = req.params;
@@ -1370,6 +1465,7 @@ app.get('/api/files/:fileId', requireAuth, (req, res) => {
});
});
});
// Инициализация сервера
async function initializeServer() {
console.log('🚀 Инициализация сервера...');
@@ -1398,7 +1494,7 @@ async function initializeServer() {
apiDoc(app, db, upload);
console.log('✅ Endpoint\'ы документов настроены');
// 5. Загружаем админ роутер динамически
// 6. Загружаем админ роутер динамически
try {
adminRouter = require('./admin-server');
console.log('Admin router loaded:', adminRouter);
@@ -1435,14 +1531,19 @@ async function initializeServer() {
console.log('⚠️ Создана заглушка для админ роутера из-за ошибки');
}
// Подключаем API для внешних идентификаторов
// 7. Подключаем API для внешних идентификаторов
api2Groups(app, db);
console.log('✅ API для внешних идентификаторов подключено');
// Подключаем API для управления межсервисным взаимодействием
const upravlenieService = setupUpravlenieEndpoints(app, db);
console.log('✅ API для управления межсервисным взаимодействием подключено');
// 6. Помечаем сервер как готовый
// 8. Подключаем API для управления межсервисным взаимодействием
//const upravlenieService = setupUpravlenieEndpoints(app, db);
//console.log('✅ API для управления межсервисным взаимодействием подключено');
// 9. Подключаем модуль API ключей
apiKeysModule(app, db, upload);
console.log('✅ Модуль API ключей подключен');
// 10. Помечаем сервер как готовый
serverReady = true;
console.log('✅ Сервер полностью инициализирован');
@@ -1468,9 +1569,11 @@ initializeServer().then(() => {
console.log('🔐 LDAP авторизация доступна для пользователей школы');
console.log(`👥 Разрешенные группы: ${process.env.ALLOWED_GROUPS}`);
console.log('📢 Система уведомлений активна');
// Подключаем API для чата
chatAPI(app, db, upload);
console.log('✅ API для чата задач подключено');
// Запускаем фоновые задачи
setInterval(checkOverdueTasks, 60000);
setInterval(checkUpcomingDeadlines, 60000);