const fs = require('fs').promises; const cors = require('cors'); const helmet = require('helmet'); const express = require('express'); const morgan = require('morgan'); const path = require('path'); const session = require('express-session'); require('dotenv').config({ path: path.join(__dirname, './config.env') }); require('dotenv').config({ path: __dirname + '/moders/config.env' }); const logger = require('./logger'); const moderAuthRouter = require('./moders/routes/moderAuth'); const moderContentRouter = require('./moders/routes/content'); const authRouter = require('./routes/auth'); const cardRouter = require('./routes/card'); const logsRouter = require('./routes/logs'); const settingsRouter = require('./routes/settings'); const modersRouter = require('./routes/moders'); const healthRouter = require('./routes/health'); const monitoringRouter = require('./routes/monitoring'); const setupWebSocket = require('./services/websocket'); const cardController = require('./controllers/cardController'); const app = express(); const server = require('http').createServer(app); // Конфигурации const corsConfig = require('./config/cors'); const sessionConfig = require('./config/session'); // Middleware app.use(helmet()); // Добавление helmet для защиты app.use(cors(corsConfig)); app.use(morgan('dev')); app.use(express.json()); app.use(session(sessionConfig(session))); // Роуты app.use('/api/auth', authRouter); // Статические файлы app.use(express.static(path.join(__dirname, '..','admin-frontend', 'build'))); app.use('/uploads', express.static(__dirname + '/uploads')); // Роуты app.use('/api/card', cardRouter); app.use('/api/logs', logsRouter); app.use('/api/settings', settingsRouter); app.use('/api/moders', modersRouter); app.use('/api/health', healthRouter); app.use('/api/monitoring', monitoringRouter); app.use('/moders', moderAuthRouter); app.use('/moders/content', moderContentRouter); app.use((req, res, next) => { console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`); next(); }); // Initialize card logs (async () => { try { await cardController.initCardLogs(); logger.info('Card logs initialized successfully'); } catch (err) { logger.error('Failed to initialize card logs:', err); } })(); // WebSocket setupWebSocket(server); // Catch-all route to serve React's index.html app.get(/.*/, (req, res, next) => { if (req.path.startsWith('/api/') || req.path.startsWith('/moders')) { return next(); } res.sendFile(path.join(__dirname, '..','admin-frontend', 'build', 'index.html')); }); // Обработчик ошибок (должен быть последним!) app.use(require('./middleware/errorHandler')); app.get('/api/status', async (req, res) => { try { res.json({ status: 'online' }); // или другая логика проверки } catch (err) { res.status(500).json({ status: 'error', message: err.message }); } }); app.get('/api/config', async (req, res) => { try { const backendConfigPath = path.join(__dirname, '../backend/config.json'); const content = await fs.readFile(backendConfigPath, 'utf8'); const backendConfig = JSON.parse(content); const config = { payslipsPath: backendConfig.payslipsPath }; res.json(config); } catch (err) { logger.error('Ошибка чтения backend/config.json:', err); res.status(500).json({ error: 'Ошибка загрузки конфигурации' }); } }); // Добавьте рядом с существующим GET обработчиком app.post('/api/config', async (req, res) => { try { const backendConfigPath = path.join(__dirname, '../backend/config.json'); const content = await fs.readFile(backendConfigPath, 'utf8'); const currentConfig = JSON.parse(content); // Обновляем только разрешенные поля if (req.body.payslipsPath) { currentConfig.payslipsPath = req.body.payslipsPath; } // Сохраняем обновленный конфиг await fs.writeFile(backendConfigPath, JSON.stringify(currentConfig, null, 4)); res.json({ success: true, message: 'Конфигурация успешно обновлена' }); } catch (err) { logger.error('Ошибка сохранения конфигурации:', err); res.status(500).json({ error: 'Ошибка сохранения конфигурации', details: err.message }); } }); server.listen(process.env.PORT || 3005, () => { logger.info(`Server running on ${process.env.ADMIN_URL}`); });