'use strict'; const express = require('express'); const ldapClient = require('./ldapClient'); const sessions = require('./sessions'); const audit = require('./auditLog'); const router = express.Router(); function getToken(req) { const header = req.headers.authorization || ''; if (header.startsWith('Bearer ')) return header.slice(7); return null; } function requireAuth(req, res, next) { const session = sessions.getSession(getToken(req)); if (!session) { return res.status(401).json({ success: false, error: 'Требуется авторизация' }); } req.session = session; next(); } function errorResponse(res, err) { const status = err.status || 500; res.status(status).json({ success: false, error: err.message || 'Внутренняя ошибка сервера' }); } // Список пользователей LDAP (список №2) для сравнения router.get('/users', requireAuth, async (req, res) => { try { const users = await ldapClient.listUsers(); res.json({ success: true, users: users.map((u) => ({ login: u.login, fio: u.full_name || '', email: u.email || '' })) }); } catch (err) { errorResponse(res, err); } }); // Синхронизация: обновление ФИО и почты у выбранных пользователей AD router.post('/sync', requireAuth, async (req, res) => { const body = req.body || {}; const pairs = Array.isArray(body.pairs) ? body.pairs : []; if (pairs.length === 0) { return res.status(400).json({ success: false, error: 'Не указаны пары для синхронизации' }); } const clean = pairs .map((p) => p || {}) .filter((p) => typeof p.login === 'string' && String(p.login).trim()) .map((p) => ({ login: String(p.login).trim(), fio: typeof p.fio === 'string' ? String(p.fio).trim() : '', email: typeof p.email === 'string' ? String(p.email).trim() : '' })); if (clean.length === 0) { return res.status(400).json({ success: false, error: 'Нет корректных пар (нужен логин пользователя AD)' }); } const results = []; for (const pair of clean) { const item = { login: pair.login, before: { fio: '', email: '' }, after: { fio: pair.fio, email: pair.email }, ok: false, error: null }; try { const current = await ldapClient.getUser(pair.login); item.before.fio = current.full_name || ''; item.before.email = current.email || ''; await ldapClient.updateUser(pair.login, { fio: pair.fio, email: pair.email }); item.ok = true; } catch (err) { item.error = err.message || 'Ошибка обновления'; } results.push(item); } const okCount = results.filter((r) => r.ok).length; audit.logAdminEntry({ ip: req.ip, username: (req.session.user && req.session.user.username) || '', success: true, reason: `gosuslugi sync: ${okCount}/${results.length}` }); res.json({ success: true, ok: okCount, failed: results.length - okCount, results }); }); module.exports = router;