forked from admin/zeropost-tool
cdd507f1c5
Новая вкладка «Автогенерация» в ChannelView:
Настройки:
- Включить/выключить автогенерацию
- posts_per_day: 1-20 (каждый пользователь настраивает сам)
- Час и минута запуска генерации
Планируется сегодня:
- Черновики сегодняшней генерации с кнопкой «Открыть»
- Пустое состояние с временем следующей генерации
Категории контента:
- Список с бейджами «сегодня» / «не сегодня» (ротация)
- Форма создания: иконка, название, slug, описание, цвет
- Каждая категория раскрывается с панелью тем:
· Список тем с жанровыми бейджами [ТУТОРИАЛ][СРАВНЕНИЕ][МНЕНИЕ][ДАЙДЖЕСТ][КЕЙС]
· Toggle is_used (✓ / ○)
· Добавить тему вручную (Enter или кнопка)
· AI-генерация N тем (5/10/15/20/30/50)
· Удалить тему
Ротация на 7 дней:
- Preview скользящего окна — видно что выйдет в каждый день
- Подпись «X из Y категорий» с объяснением алгоритма
API proxy:
/api/engine/channels/:channelId/[[...path]] — catch-all к engine :3035
53 lines
2.0 KiB
JavaScript
53 lines
2.0 KiB
JavaScript
/**
|
|
* Catch-all proxy: /api/engine/channels/:channelId/* → engine :3035/api/channels/:channelId/*
|
|
*
|
|
* Используется AutogenTab и CategoryTab для:
|
|
* - GET/POST/PATCH/DELETE /api/engine/channels/:id/categories
|
|
* - GET/POST/PATCH/DELETE /api/engine/channels/:id/categories/:catId/topics
|
|
* - GET/POST/PATCH /api/engine/channels/:id/autogen
|
|
* - POST /api/engine/channels/:id/autogen/run
|
|
* - GET /api/engine/channels/:id/autogen/today
|
|
* - GET /api/engine/channels/:id/autogen/rotation
|
|
*/
|
|
import { NextResponse } from 'next/server';
|
|
import { requireUser } from '@/lib/session';
|
|
|
|
const ENGINE = process.env.ENGINE_URL || 'http://127.0.0.1:3030';
|
|
const SECRET = process.env.ENGINE_SECRET || 'zeropost_internal_2026';
|
|
|
|
async function proxy(req, { params }) {
|
|
const user = await requireUser();
|
|
if (!user) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
|
|
const { channelId, path: pathArr } = await params;
|
|
const tail = pathArr?.length ? '/' + pathArr.join('/') : '';
|
|
const qs = req.url.split('?')[1];
|
|
const url = `${ENGINE}/api/channels/${channelId}${tail}${qs ? '?' + qs : ''}`;
|
|
|
|
const headers = {
|
|
'Content-Type': 'application/json',
|
|
'x-internal-secret': SECRET,
|
|
'x-user-id': String(user.id),
|
|
};
|
|
|
|
let body;
|
|
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
body = await req.text();
|
|
}
|
|
|
|
try {
|
|
const res = await fetch(url, { method: req.method, headers, body, cache: 'no-store' });
|
|
const data = await res.json().catch(() => ({ error: 'invalid engine response' }));
|
|
return NextResponse.json(data, { status: res.status });
|
|
} catch (err) {
|
|
console.error('[engine proxy] error:', err.message);
|
|
return NextResponse.json({ error: err.message }, { status: 502 });
|
|
}
|
|
}
|
|
|
|
export const GET = proxy;
|
|
export const POST = proxy;
|
|
export const PATCH = proxy;
|
|
export const PUT = proxy;
|
|
export const DELETE = proxy;
|