feat: post drafts system — batch generation + daily auto-drafts

DB: post_drafts(channel_id, topic, text, image_url, status), channels.auto_draft_*
Engine:
  services/draftService.js: generateOneDraft, generateBatch, generateDailyDrafts,
    approveDraft(→scheduled_post), rejectDraft, updateDraft, listDrafts
  routes/drafts.js: GET/PATCH/DELETE /api/drafts/:id, /approve, /reject
    POST /api/channels/:channelId/drafts/generate?count=N (async, returns immediately)
  index.js: cron каждые 30 мин → generateDailyDrafts() для каналов с auto_draft_enabled
  channels.js: updateChannel сохраняет auto_draft_enabled/count/time
This commit is contained in:
Ник (Claude)
2026-06-12 23:47:27 +03:00
parent 5a765d27e1
commit a8ff295faa
4 changed files with 340 additions and 2 deletions
+13 -1
View File
@@ -106,7 +106,8 @@ app.use('/api/metrics', metricsRoutes);
app.use('/api/usage', usageRoutes);
app.use('/api/billing', require('./src/routes/billing'));
app.use('/api/channels', require('./src/routes/polls'));
app.use('/api', inboxRoutes); // /inbox/:id, /inbox/:id/reply, /tg-webhook/:channelId
app.use('/api', inboxRoutes);
app.use('/api', require('./src/routes/drafts'));
app.get('/health', (req, res) => {
res.json({ ok: true, service: 'zeropost-engine', time: new Date() });
@@ -120,6 +121,17 @@ const start = async () => {
// Автоматический ретрай SVG-заглушек
require('./src/services/coverRetry').start();
// Ежедневные авто-черновики (каждые 30 мин проверяем каналы с auto_draft_enabled)
const draftSvc = require('./src/services/draftService');
setInterval(async () => {
try {
const n = await draftSvc.generateDailyDrafts();
if (n > 0) console.log(`[Drafts] Daily auto-drafts: generated for ${n} channels`);
} catch (err) { console.error('[Drafts] daily error:', err.message); }
}, 30 * 60 * 1000);
// Первый запуск через 5 мин после старта
setTimeout(() => draftSvc.generateDailyDrafts().catch(() => {}), 5 * 60 * 1000);
app.listen(config.port, () => {
console.log(`[Engine] Running on port ${config.port}`);
});