feat(postcast): система категорий + банк тем + гибкая ротация

Новая архитектура автогенерации (перенос и доработка из ZeroPost):

БД (3 новые таблицы + поля в posts):
  channel_categories — категории принадлежат каналу пользователя.
    CRUD по slug (уникален в рамках канала), цвет, иконка, sort_order.
  category_topics — банк тем с жанровыми маркерами:
    [ТУТОРИАЛ][СРАВНЕНИЕ][МНЕНИЕ][ДАЙДЖЕСТ][КЕЙС][НОВОСТЬ]
    genre: detected auto или задан явно.
    Атомарный захват через UPDATE...FOR UPDATE SKIP LOCKED (нет дублей).
  channel_autogen_settings — настройки per-канал:
    posts_per_day: 1-20 (пользователь выбирает сам, 3 по умолчанию)
    run_hour/run_minute, rotation_mode, last_run_at
  best_time_stats — заготовка под аналитику лучшего времени.
  posts: +source_topic, +source_category_id, +genre

Ротация (src/services/autogenNew.js):
  getTodayCategoryIds: скользящее окно размером posts_per_day.
  Если категорий <= posts_per_day — берём все.
  Если больше — сдвиг на 1 каждый день (dayOfYear % total).
  Пример: 8 категорий, 3 поста/день → каждый день другие 3 категории.
  Предпросмотр: GET /api/channels/:id/autogen/rotation?days=7

Фиксы из ZeroPost (не будет тех же ошибок):
  pg_advisory_lock по (channel_id, category_id) — нет параллельных дублей
  Двойная проверка после lock: уже генерировали сегодня?
  Промпт учитывает жанр ([ТУТОРИАЛ] → пошаговый гайд и т.д.)
  generateTopicsForCategory: AI генерит N тем с равномерным распределением жанров

API routes:
  GET/POST/PATCH/DELETE /api/channels/:id/categories
  GET/POST/PATCH/DELETE /api/channels/:id/categories/:catId/topics
  POST /api/channels/:id/categories/:catId/topics/generate (AI, async)
  GET/POST/PATCH        /api/channels/:id/autogen
  POST                  /api/channels/:id/autogen/run
  GET                   /api/channels/:id/autogen/today (черновики за сегодня)
  GET                   /api/channels/:id/autogen/rotation (preview на N дней)
This commit is contained in:
Aleksei Pavlov
2026-06-24 19:22:36 +03:00
parent 5e075ac81d
commit 4ec3239dc3
7 changed files with 1345 additions and 0 deletions
+2
View File
@@ -18,6 +18,8 @@ const photoSearchRoutes = require('./src/routes/photo-search');
const scheduledPostsRoutes = require('./src/routes/scheduledPosts');
const channelStatsRoutes = require('./src/routes/channelStats');
const calendarRoutes = require('./src/routes/calendar');
const channelCategoriesRoutes = require('./src/routes/channelCategories');
const channelAutogenRoutes = require('./src/routes/channelAutogen');
const metricsRoutes = require('./src/routes/metrics');
const usageRoutes = require('./src/routes/usage');