bc2d311e59
- БД: таблица editor_notes (title/content/author/tags/is_pinned/is_published) - routes/notes.js: CRUD заметок редактора - /api/stats/live: latest article, processing job, активность за 7 дней - getArticleBySlug: JOIN с generation_jobs для tokens_in/out
59 lines
1.8 KiB
JavaScript
59 lines
1.8 KiB
JavaScript
const express = require('express');
|
|
const config = require('./src/config');
|
|
const { migrate } = require('./src/config/db');
|
|
|
|
// Routes
|
|
const generateRoutes = require('./src/routes/generate');
|
|
const channelsRoutes = require('./src/routes/channels');
|
|
const postsRoutes = require('./src/routes/posts');
|
|
const articlesRoutes = require('./src/routes/articles');
|
|
const statsRoutes = require('./src/routes/stats');
|
|
const notesRoutes = require('./src/routes/notes');
|
|
|
|
// Start queue worker
|
|
require('./src/workers/generation');
|
|
|
|
const app = express();
|
|
app.use(express.json());
|
|
|
|
// Раздача загруженных файлов (обложки статей и т.п.)
|
|
const path = require('path');
|
|
const UPLOADS_DIR = process.env.UPLOADS_DIR || '/var/www/zeropost-uploads';
|
|
require('fs').mkdirSync(UPLOADS_DIR, { recursive: true });
|
|
|
|
// Public uploads — ДО auth-middleware, без секрета
|
|
app.use('/uploads', express.static(UPLOADS_DIR, { maxAge: '7d', immutable: true }));
|
|
|
|
|
|
// Simple internal auth middleware
|
|
app.use((req, res, next) => {
|
|
const secret = req.headers['x-internal-secret'];
|
|
if (secret !== config.internalSecret) {
|
|
return res.status(401).json({ error: 'Unauthorized' });
|
|
}
|
|
next();
|
|
});
|
|
|
|
app.use('/api/generate', generateRoutes);
|
|
app.use('/api/channels', channelsRoutes);
|
|
app.use('/api/posts', postsRoutes);
|
|
app.use('/api/articles', articlesRoutes);
|
|
app.use('/api/stats', statsRoutes);
|
|
app.use('/api/notes', notesRoutes);
|
|
|
|
app.get('/health', (req, res) => {
|
|
res.json({ ok: true, service: 'zeropost-engine', time: new Date() });
|
|
});
|
|
|
|
const start = async () => {
|
|
await migrate();
|
|
app.listen(config.port, () => {
|
|
console.log(`[Engine] Running on port ${config.port}`);
|
|
});
|
|
};
|
|
|
|
start().catch(err => {
|
|
console.error('[Engine] Failed to start:', err);
|
|
process.exit(1);
|
|
});
|