feat: монорепо миграция, Discover/SearxNG улучшения
- Миграция на монорепозиторий (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>
This commit is contained in:
70
apps/posts-mcs/README.md
Normal file
70
apps/posts-mcs/README.md
Normal file
@@ -0,0 +1,70 @@
|
||||
# Publications Service — всё для публикаций
|
||||
|
||||
Сервис публикаций в папке `posts-microservice`: CRUD, планирование, rich-контент (изображения, видео, аудио, таблицы и т.д.), календарь выпусков и API для SearXNG.
|
||||
|
||||
## Запуск
|
||||
|
||||
```bash
|
||||
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` | `published`
|
||||
- `scheduledAt` — время публикации (ISO)
|
||||
- `publishedAt` — время фактической публикации
|
||||
|
||||
### Блоки контента (`contentBlocks`)
|
||||
|
||||
```json
|
||||
[
|
||||
{ "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 (для обратной совместимости)
|
||||
Reference in New Issue
Block a user