- Миграция на монорепозиторий (apps/frontend, apps/chat-service, etc.) - Discover: проверка SearxNG, понятное empty state при ненастроенном поиске - searxng.ts: валидация URL, проверка JSON-ответа, авто-добавление http:// - docker/searxng-config: настройки для JSON API SearxNG Co-authored-by: Cursor <cursoragent@cursor.com>
2.8 KiB
2.8 KiB
Publications Service — всё для публикаций
Сервис публикаций в папке posts-microservice: CRUD, планирование, rich-контент (изображения, видео, аудио, таблицы и т.д.), календарь выпусков и API для SearXNG.
Запуск
cd posts-microservice
npm install
npm run dev
Сервис: http://localhost:4001
API
Публикации
| Метод | URL | Описание |
|---|---|---|
| POST | /api/publications |
Создать |
| GET | /api/publications |
Список (?status=, ?q=, ?limit=, ?offset=) |
| GET | /api/publications/calendar |
Календарь (?year=, ?month=) |
| GET | /api/publications/:id |
По ID |
| GET | /api/publications/slug/:slug |
По slug |
| PATCH | /api/publications/:id |
Обновить |
| DELETE | /api/publications/:id |
Удалить |
Поля публикации
title— заголовокslug— URL-slug (генерируется из title)excerpt— краткое описаниеcontentBlocks— массив блоков (текст, изображения, видео, аудио, таблицы, embed)previewImage— URL превьюurl— ссылка на страницуauthor— авторstatus—draft|scheduled|publishedscheduledAt— время публикации (ISO)publishedAt— время фактической публикации
Блоки контента (contentBlocks)
[
{ "type": "text", "data": { "html": "<p>Текст</p>" } },
{ "type": "image", "data": { "src": "https://...", "alt": "...", "caption": "..." } },
{ "type": "video", "data": { "src": "https://...", "poster": "...", "caption": "..." } },
{ "type": "audio", "data": { "src": "https://...", "caption": "..." } },
{ "type": "table", "data": { "html": "<table>...</table>", "caption": "..." } },
{ "type": "embed", "data": { "url": "https://...", "caption": "..." } },
{ "type": "heading", "data": { "level": 1, "text": "Заголовок" } },
{ "type": "divider" }
]
Планирование
- Публикация со
status: "scheduled"иscheduledAtавтоматически переходит вpublishedпри наступлении времени. - Планировщик запускается каждую минуту.
SearXNG
Эндпоинт /search?q={query}&page={pageno} отдаёт только опубликованные публикации в формате JSON engine SearXNG.
Конфиг в searxng-engine-example.yml.
Алиасы
/api/posts→ тот же API (для обратной совместимости)