mirror of
https://github.com/dartdavros/chatballs.git
synced 2026-10-05 09:14:58 +03:00
TenantContextMiddleware заворачивает весь вызов view в транзакцию: RLS-контекст ставится через SET LOCAL и живёт ровно столько же. Удобно и даёт запросу атомарность, но пока идёт обращение наружу, запрос держит соединение из пула, а пул на процесс небольшой. Расшифровка голосового ждёт провайдера до 90 секунд (30 с таймаут на три попытки) — несколько операторов, нажавших «расшифровать», вставали поперёк всех остальных запросов процесса. Появился отказ от общей транзакции: вьюха выставляет `tenant_manages_own_transaction` и открывает tenant_atomic сама. Забытый блок не опасен — без транзакции RLS-настройка пуста и строки просто не видны, то есть ошибка проявится сразу, а не утечкой в чужую организацию. `transcribe_voice_message` разложена на prepare → run → store, и вьюха держит транзакцию только вокруг чтения и вокруг записи. Прежний вызов целиком остался для ingest, где входящее сообщение обрабатывается одной транзакцией. Тест на TransactionTestCase (обычный TestCase сам держит транзакцию на весь тест) проверяет напрямую: во время вызова провайдера in_atomic_block — False, RLS-контекст снят, результат сохранён. Остальные держатели транзакции не тронуты намеренно. В ingest_inbound обращения наружу чередуются с записью по всей длине, и общая транзакция даёт там атомарность приёма — разносить её по фазам значит менять семантику, а не рефакторить. Отправка файла и голосового оператором опирается на синхронный 502 от канала. Проверка интеграции для WEB-провайдера сама пишет в БД. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>