fix(alerts): защитить ручной повтор очереди проверкой версии

This commit is contained in:
Denozordec committed 2026-10-03 19:14:27 +07:00
1 parent 89c31289bd
commit 7d0608bbce
16 files changed
+86 -17

No files matched your search

+9 -1
View File
@@ -28,7 +28,7 @@
| 9 | VPN, Firewall и Filters | Завершён в границах локальной приёмки 2026-09-30; блоки 9.1–9.64, ограничения в 9.64 |
| 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 |
| 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 |
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | В работе: 11Б.1–11Б.4.4.3.3; scheduler и GeoIP приняты локально; NetFlow принят локально; Evolution принят локально; далее общие Settings |
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | В работе: 11Б.1–11Б.4.4.3.4; scheduler и GeoIP приняты локально; NetFlow принят локально; Evolution принят локально; далее общие Settings |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Не начат |
@@ -36,6 +36,14 @@
## Блок 11Б.4.4.3.4 — атомарный ручной повтор unknown (2026-10-03)
- POST /api/alerts/outbox/:id/retry под mm:alerts:write/admin требует literal acknowledgedDuplicateRisk:true и expectedVersion. Conditional UPDATE только telegram+unknown+resolution_version переводит запись в pending и увеличивает version. Processing/sent/failed/pending, устаревший снимок и повторный запрос получают 409; endpoint не отправляет Telegram и не пишет ложный успешный history.
- Receipt pending/id/version+1 проверяется внутри transaction и на HTTP границе. Ошибка returning отклоняет callback; сохранённый retryCount/maxRetries остаётся неизменным. 0009 migration добавляет resolution_version и nonnegative CHECK; GET выдаёт version для held items. Версия растёт при каждом ручном повторе, поэтому новый unknown не совпадает с предыдущей генерацией даже при одинаковом timestamp.
- 2 DI проверки concurrent retry/stale/processing/validation/receipt rollback, полный Alerts backend профиль, HTTP 400/409/500/no-store и реальные JWT gates прошли; backend build, nonincremental frontend typecheck, профильный lint и queue browser 2/2 прошли.
- Реальный PG CAS/rollback/0009 migration не проверен локально. При выпуске migrations 0008/0009 и backend/contracts/frontend обновить вместе; held GET требует resolutionVersion. UI операции ещё не подключён, processing не имеет ручного повтора до доказуемой остановки отправителя.
- Следующий точный шаг 11Б.4.4.3.5: подключить UI ручного повтора unknown с подтверждением риска дубликата, общим checkpoint при неизвестном POST и сохранением формы/источника; затем общий dashboard permission reader, адаптивность/pickers, Releases/probe scheduling и приёмка 11Б/12.
## Блок 11Б.4.4.3.3 — подтверждённый снимок очереди Telegram (2026-10-03)
- Отдельный GET /api/alerts/outbox под mm:alerts:read, no-store и строгим DTO. Counts и последние 20 processing/unknown читаются в одной repeatable read/read only transaction; сумма, безопасные числа, количество/статусы/уникальность элементов проверяются. Неизвестные legacy статусы учитываются отдельно. Ответ не содержит payload, token или lastError.