admin-api-management
This commit is contained in:
1176
api-keys.js
Normal file
1176
api-keys.js
Normal file
File diff suppressed because it is too large
Load Diff
1787
public/admin-api-management.html
Normal file
1787
public/admin-api-management.html
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
123
server.js
123
server.js
@@ -22,7 +22,8 @@ const api2Groups = require('./api2-groups');
|
|||||||
//
|
//
|
||||||
const chatAPI = require('./api-chat');
|
const chatAPI = require('./api-chat');
|
||||||
// Подключаем API для управления межсервисным взаимодействием
|
// Подключаем API для управления межсервисным взаимодействием
|
||||||
const { setupUpravlenieEndpoints } = require('./upravlenie-service');
|
//const { setupUpravlenieEndpoints } = require('./upravlenie-service');
|
||||||
|
const apiKeysModule = require('./api-keys');
|
||||||
//
|
//
|
||||||
const app = express();
|
const app = express();
|
||||||
const PORT = process.env.PORT || 3000;
|
const PORT = process.env.PORT || 3000;
|
||||||
@@ -165,6 +166,28 @@ const requireAuth = (req, res, next) => {
|
|||||||
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 для аутентификации
|
// API для аутентификации
|
||||||
app.post('/api/login', async (req, res) => {
|
app.post('/api/login', async (req, res) => {
|
||||||
const { login, password } = req.body;
|
const { login, password } = req.body;
|
||||||
@@ -303,6 +326,7 @@ app.get('/api/user', (req, res) => {
|
|||||||
res.status(401).json({ error: 'Не аутентифицирован' });
|
res.status(401).json({ error: 'Не аутентифицирован' });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Получаем актуальные группы пользователя из новой структуры
|
// Получаем актуальные группы пользователя из новой структуры
|
||||||
app.get('/api/user_v2', (req, res) => {
|
app.get('/api/user_v2', (req, res) => {
|
||||||
if (req.session.user) {
|
if (req.session.user) {
|
||||||
@@ -371,6 +395,7 @@ app.get('/api/users/group/help', requireAuth, (req, res) => {
|
|||||||
res.json(rows);
|
res.json(rows);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// API для получения пользователей группы "doc"
|
// API для получения пользователей группы "doc"
|
||||||
app.get('/api/users/group/doc', requireAuth, (req, res) => {
|
app.get('/api/users/group/doc', requireAuth, (req, res) => {
|
||||||
db.all(`
|
db.all(`
|
||||||
@@ -389,6 +414,7 @@ app.get('/api/users/group/doc', requireAuth, (req, res) => {
|
|||||||
res.json(rows);
|
res.json(rows);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Middleware для проверки наличия БД в API endpoints
|
// Middleware для проверки наличия БД в API endpoints
|
||||||
app.use((req, res, next) => {
|
app.use((req, res, next) => {
|
||||||
if (!db && req.path.startsWith('/api/') && req.path !== '/api/health' && req.path !== '/api/login') {
|
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) {
|
if (!hasAccess) {
|
||||||
return res.status(403).send('в разработке');
|
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'));
|
res.sendFile(path.join(__dirname, 'public/doc.html'));
|
||||||
});
|
});
|
||||||
|
|
||||||
// Страница поддержка
|
// Страница поддержка
|
||||||
app.get('/help', (req, res) => {
|
app.get('/help', (req, res) => {
|
||||||
if (!req.session.user) {
|
if (!req.session.user) {
|
||||||
@@ -983,6 +1007,7 @@ app.get('/api/groups', requireAuth, (req, res) => {
|
|||||||
res.json(groups);
|
res.json(groups);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// API для всех пользователей с группами
|
// API для всех пользователей с группами
|
||||||
app.get('/api/users/all', requireAuth, (req, res) => {
|
app.get('/api/users/all', requireAuth, (req, res) => {
|
||||||
if (req.session.user.role !== 'admin') {
|
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 для добавления пользователя в группу
|
// API для добавления пользователя в группу
|
||||||
app.post('/api/groups/:groupId/users/:userId', requireAuth, (req, res) => {
|
app.post('/api/groups/:groupId/users/:userId', requireAuth, (req, res) => {
|
||||||
if (req.session.user.role !== 'admin') {
|
if (req.session.user.role !== 'admin') {
|
||||||
@@ -1344,6 +1438,7 @@ app.delete('/api/tasks/:taskId/files/batch-delete', requireAuth, (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// API для получения информации о файле
|
// API для получения информации о файле
|
||||||
app.get('/api/files/:fileId', requireAuth, (req, res) => {
|
app.get('/api/files/:fileId', requireAuth, (req, res) => {
|
||||||
const { fileId } = req.params;
|
const { fileId } = req.params;
|
||||||
@@ -1370,6 +1465,7 @@ app.get('/api/files/:fileId', requireAuth, (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Инициализация сервера
|
// Инициализация сервера
|
||||||
async function initializeServer() {
|
async function initializeServer() {
|
||||||
console.log('🚀 Инициализация сервера...');
|
console.log('🚀 Инициализация сервера...');
|
||||||
@@ -1398,7 +1494,7 @@ async function initializeServer() {
|
|||||||
apiDoc(app, db, upload);
|
apiDoc(app, db, upload);
|
||||||
console.log('✅ Endpoint\'ы документов настроены');
|
console.log('✅ Endpoint\'ы документов настроены');
|
||||||
|
|
||||||
// 5. Загружаем админ роутер динамически
|
// 6. Загружаем админ роутер динамически
|
||||||
try {
|
try {
|
||||||
adminRouter = require('./admin-server');
|
adminRouter = require('./admin-server');
|
||||||
console.log('Admin router loaded:', adminRouter);
|
console.log('Admin router loaded:', adminRouter);
|
||||||
@@ -1435,14 +1531,19 @@ async function initializeServer() {
|
|||||||
console.log('⚠️ Создана заглушка для админ роутера из-за ошибки');
|
console.log('⚠️ Создана заглушка для админ роутера из-за ошибки');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Подключаем API для внешних идентификаторов
|
// 7. Подключаем API для внешних идентификаторов
|
||||||
api2Groups(app, db);
|
api2Groups(app, db);
|
||||||
console.log('✅ API для внешних идентификаторов подключено');
|
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;
|
serverReady = true;
|
||||||
|
|
||||||
console.log('✅ Сервер полностью инициализирован');
|
console.log('✅ Сервер полностью инициализирован');
|
||||||
@@ -1468,9 +1569,11 @@ initializeServer().then(() => {
|
|||||||
console.log('🔐 LDAP авторизация доступна для пользователей школы');
|
console.log('🔐 LDAP авторизация доступна для пользователей школы');
|
||||||
console.log(`👥 Разрешенные группы: ${process.env.ALLOWED_GROUPS}`);
|
console.log(`👥 Разрешенные группы: ${process.env.ALLOWED_GROUPS}`);
|
||||||
console.log('📢 Система уведомлений активна');
|
console.log('📢 Система уведомлений активна');
|
||||||
|
|
||||||
// Подключаем API для чата
|
// Подключаем API для чата
|
||||||
chatAPI(app, db, upload);
|
chatAPI(app, db, upload);
|
||||||
console.log('✅ API для чата задач подключено');
|
console.log('✅ API для чата задач подключено');
|
||||||
|
|
||||||
// Запускаем фоновые задачи
|
// Запускаем фоновые задачи
|
||||||
setInterval(checkOverdueTasks, 60000);
|
setInterval(checkOverdueTasks, 60000);
|
||||||
setInterval(checkUpcomingDeadlines, 60000);
|
setInterval(checkUpcomingDeadlines, 60000);
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user