Files
transcriber/tasks/items/response-code-in-journal.md
T
av 79ff12548f tasks: спроектирован контракт приложения и переставлена голова очереди
- json-api-for-spa: адреса приложения уехали в своё пространство /app/,
  приём стал POST /app/audiorecords, опрос /api/status/:id убран, заведены
  список, карточка, текст, /app/me и /app/config; имя файла отправителя
  легло своей колонкой рядом с заголовком
- три действия над записью — правка заголовка, возврат в работу и журнал
  событий — собраны задачей audiorecord-actions
- голова очереди: контракт, каркас, экран загрузки, список, действия
- в прежних задачах поправлены адреса, рубежи конвейера и остатки Telegram
2026-08-15 09:06:11 +03:00

56 lines
3.8 KiB
Markdown

# 🐞 Писать в журнал код ответа отвергнутого запроса
- **Тип:** fix
- **Категория:** Очередь — Заведена урожаем ревью и встала в конец машинально: место в плане стройки назначает человек.
- **Зачем:** У всякого запроса, отвергнутого роутером, в журнале стоит нулевой код: всплеск отказов доступа неотличим от обычного трафика.
- **Теги:** review-2026-08-15
Код ответа в журнале называет исход запроса, а не ноль.
Обработчик, завершившийся отказом роутера — `401` без сессии, `403` без учётной
записи, `404` на чужой записи, `500` на сбое, — пишет статус в ответ **после**
возврата из слоя журнала. Слой читает его раньше и получает ноль. Верное значение
попадает в журнал только у обработчиков, отвечающих самостоятельно.
Разграничение записей по владельцу устроено так, что чужая запись отвечает тем
же, чем несуществующая. Единственное место, где виден перебор идентификаторов, —
журнал; а именно эти строки и приезжают с нулём.
## Воспроизведение
Поднять сервис и послать четыре запроса подряд:
```
/auth/login → 302 ... http.route=/auth/login http.status_code=302
/app/audiorecords → 404 ... http.route=/app/audiorecords http.status_code=0
/nope → 404 ... http.route=/nope http.status_code=0
POST /app/audiorecords без сессии → 401 ... http.status_code=0
```
Первый обработчик отвечает сам и код пишет верно; три остальных отвергнуты
роутером и дают ноль.
Прогон снят до того, как приложение переехало из `/api/` в `/app/` решением
владельца 2026-08-15: тогда те же строки стояли с адресом `/api/audio`. Предмет
находки от переезда не зависит — ноль пишет роутер, а не обработчик, — и
воспроизводится она с любым адресом, который роутер отверг.
## Затрагивает
- слой журнала запроса в `main.go`: место, где снимается код ответа;
- `docs/conventions/logging.md` — словарь полей запроса.
## Критерии приёмки
- Отвергнутый запрос пишет в журнал свой код. Оракул: те же четыре запроса —
`401`, `403`, `404` и `500` приезжают в поле кода, ноля в нём нет ни у одного.
- Обработчик, отвечающий самостоятельно, продолжает писать свой код. Оракул:
запрос входа по-прежнему даёт `302`.
## Рамки
Найдено прогоном ревью задачи `remove-telegram-intake` 2026-08-15, враждебный
проход, оракул — живой прогон. Дефект существовал до той правки: изменение этот
слой не трогало. Метрики кодов ответа у сервиса нет вовсе, и заводить её этой задачей не
надо — она про журнал.