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

1176
api-keys.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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);

File diff suppressed because it is too large Load Diff