admin-api-management
This commit is contained in:
123
server.js
123
server.js
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user