Files
portal/docs
Дмитрий ba97f952cc phase1(webhook): failed() callback + FailedWebhookJob модель — упавшие jobs после 3 ретраев
После исчерпания всех 3 ретраев Laravel вызывает failed(\Throwable $e) —
упавший job сохраняется в failed_webhook_jobs для ручного разбора и
повторного запуска через админку.

Реализация:
  - app/app/Models/FailedWebhookJob.php — Eloquent для failed_webhook_jobs
  - ProcessWebhookJob::failed() через DB::table->insert (не Eloquent::create)
    чтобы обойти RLS: failed-callback запускается вне транзакции воркера,
    SET LOCAL app.current_tenant_id не выставлен, политика бы отвергла INSERT.
    Запись должна попасть в БД даже в катастрофическом сценарии.
  - payload через json_encode(JSON_UNESCAPED_UNICODE) — UTF-8 кириллица
    сохраняется

Sentry::captureException оставлен как TODO для production (на dev-стеке
нет DSN).

3 новых Pest-теста:
  - failed() пишет упавший job с webhookLogId (через DB::table('webhook_log')
    для FK satisfaction)
  - failed() работает БЕЗ webhookLogId (NULL ok — soft FK)
  - failed() записывает payload с UTF-8 кириллицей корректно

Pest 48/48 зелёные за 4.7 сек. Pint + Larastan чисто.

Webhook-flow покрыт полностью на dev-стеке (за исключением Sentry и
SendNewLeadNotificationJob — Биз-20 Telegram, ждёт настоящего бота).

CLAUDE.md v1.15 → v1.16. Реестр Открытые_вопросы v1.24 → v1.25.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 15:52:47 +03:00
..