mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 09:55:03 +00:00
Initial import: vesti.nixg.ru — новостной апрув-проект (web, crawler, classifier, publisher, openspec)
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
schema: spec-driven
|
||||
created: 2026-09-13
|
||||
skip_specs: true
|
||||
@@ -0,0 +1,32 @@
|
||||
## Design
|
||||
|
||||
### services/publisher/app/main.py
|
||||
|
||||
Модель уже имеет `dry_run: bool = False`. В роуте publish (тело):
|
||||
|
||||
```python
|
||||
@app.post("/api/v1/publish")
|
||||
def publish(payload: PublishRequest):
|
||||
# dry_run — тестовый режим: НЕ уходит в Telegram, возвращает эмуляцию
|
||||
if payload.dry_run:
|
||||
results = {
|
||||
ch: {
|
||||
"message_id": 0,
|
||||
"media_message_id": 0,
|
||||
"views": 0,
|
||||
"error": None,
|
||||
}
|
||||
for ch in resolve_channels(payload.channels)
|
||||
}
|
||||
return {"ok": True, "results": results, "dry_run": True}
|
||||
... (реальный путь — как сейчас)
|
||||
```
|
||||
|
||||
При dry_run получатель — resolve_channels(payload.channels or конфиг), т.к. без него
|
||||
непонятно, для какого канала эмулировать (разумно: тот же, что и в реале).
|
||||
|
||||
### Верификация
|
||||
|
||||
- `curl -d '{"card":{...},"dry_run":true}'` → dry_run:true, message_id:0, телеграм НЕ тронут.
|
||||
- `curl -d '{"card":{...},"dry_run":false}'` → как раньше (реальный publish).
|
||||
- docker compose restart vesti-publisher (пересборка: код меняется, нужен образ).
|
||||
@@ -0,0 +1,24 @@
|
||||
## Why
|
||||
|
||||
При тесте публикации с медиа сквозь веб выяснилось: `dry_run` в POST /api/v1/publish
|
||||
(services/publisher/app/main.py:42, модель `PublishRequest.dry_run: bool = False`)
|
||||
НИГДЕ не используется в теле — публикация уходит в Telegram реально даже при
|
||||
`"dry_run": true`. Это опасно: тестовые запросы засоряют канал (сегодня ушли
|
||||
реальные сообщения 11/12, пришлось удалять вручную).
|
||||
|
||||
## What Changes
|
||||
|
||||
- services/publisher/app/main.py: при `payload.dry_run == True` НЕ вызывать telegram.publish,
|
||||
вернуть эмуляцию результата (ok, результаты с message_id=0 и флагом dry_run=true),
|
||||
при этом сделать вид, что опубликовано (для сквозного теста веб → publisher без TG).
|
||||
|
||||
## Why Not
|
||||
|
||||
- Не менять веб: веб всегда шлёт dry_run=false (реальные approve). dry_run — только для
|
||||
тестов/curl.
|
||||
|
||||
## Acceprance
|
||||
|
||||
- `curl ... -d '{"card":{...},"dry_run":true}'` → результат с dry_run:true, НЕ уходит в TG
|
||||
(можно проверить: views по message_id=0 → 404).
|
||||
- `curl ... -d '{"card":{...},"dry_run":false}'` → реальная публикация (как раньше).
|
||||
@@ -0,0 +1,9 @@
|
||||
# publisher-dry-run-fix
|
||||
|
||||
- [x] Создан OpenSpec change (proposal/design)
|
||||
- [x] main.py: if payload.dry_run → эмуляция результата (message_id=0, dry_run=true), без вызова TG
|
||||
- [x] PublishRequest: добавлено поле `dry_run` (было только в Response — AttributeError)
|
||||
- [x] Пересборка контейнера: docker compose up -d --build (дважды — после правки модели)
|
||||
- [x] Тест: dry_run=true → ok, message_id=0, dry_run=true, канал НЕ тронут
|
||||
- [x] Тест: dry_run=false → как раньше (502 на несуществующий канал, реальный publish работает)
|
||||
- [x] `openspec validate publisher-dry-run-fix` — чисто
|
||||
Reference in New Issue
Block a user