Files
transcriber/tasks/items/ntfy-delivery.md
T
av d2c85af80a tasks: целевая картина пересобрана — три цели, тринадцать задач, сдвинутые границы
- паспорт: сервис объявлен архивом с бессрочным хранением записей и текстов,
  машинная вычитка расшифровки внутри границ, приложение — основной вход;
  добавлены две границы: не файловое хранилище общего назначения и не биллинг;
- заведены цели upload-reliability, user-settings, usage-stats и тринадцать
  задач; очередь пересобрана — сперва починки, затем разведки о хранилище,
  затем доступ и владелец, и только потом экраны;
- архитектура: четыре новых открытых вопроса — приём большого файла, учёт
  расхода, срок хранения, потолок шести часов.
2026-08-11 10:05:22 +03:00

49 lines
3.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ✨ Отправлять готовый текст через apprise и ntfy
- **Тип:** feature
- **Категория:** Очередь
- **Зачем:** Пользователь веба узнаёт о готовности только опросом с открытого экрана.
- **Теги:** goal:ready-notification
Двигает пункты 1, 2, 4 и 5 «Завершения» цели: готовый текст и отказ доходят до
пользователя веба без открытого приложения, отказ канала задачу не роняет, а
пользователь Telegram получает ответ по-прежнему ботом. Выбор канала самим
пользователем (пункт 3) заводит `settings-screen`.
Сегодня `completeJob` и `failJob` отвечают только источнику `telegram`;
источник `api` не получает ничего. Здесь появляется второй способ доставки, и
выбор между ними обязан остаться в одной точке — той же, что сейчас.
## Затрагивает
- `internal/contract` — интерфейс отправителя уведомления;
- `internal/service`, `completeJob` и `failJob` — выбор канала по источнику
задачи;
- новый адаптер поверх apprise либо прямого HTTP к ntfy;
- адрес канала у учётной записи: колонка и её миграция (экран настройки заводит
`settings-screen`);
- секция конфигурации: адрес сервера ntfy, способ вызова apprise;
- `docs/architecture.md` — новая внешняя зависимость и чем она отказывает;
- `docs/security.md` — текст расшифровки уходит на внешний сервис;
- `docs/database.md` — настройки числами.
## Критерии приёмки
- Задача из веба, дошедшая до `done`, отправляет текст в канал владельца.
Оракул — тест с подставным отправителем: вызов ровно один, с текстом задачи и
адресом владельца.
- Задача из Telegram по-прежнему отвечает ботом и вторым каналом не дублируется.
Оракул — тот же тест на источнике `telegram`: подставной отправитель ntfy не
вызван.
- Недоступный канал уведомлений не мешает задаче завершиться: состояние `done` и
текст в приложении остаются. Оракул — тест с отправителем, возвращающим
ошибку: задача в `done`, текст на месте, в логе одна запись уровня `WARN`.
- Отказ задачи доходит тем же каналом и тем же человекочитаемым текстом, что
видит пользователь Telegram. Оракул — тест на ветке `failJob`.
## Рамки
Web Push с VAPID и своим хранением подписок не делаем. Своего сервера ntfy не
поднимаем — адрес приходит конфигом. Текст расшифровки уходит на внешний сервис,
и это сдвиг периметра: строка в `docs/security.md` обязательна.