Files
chatwoot/app/presenters/inbox/event_data_presenter.rb
d0ecdc14d8 feat(webhooks): Emit inbox_updated when an inbox is disconnected (#14504)
Chatwoot now lets external apps know when an inbox loses its connection
and needs re-authentication. When a channel's authorization expires (for
example, an email inbox disconnects), Chatwoot fires an `inbox_updated`
webhook reflecting the new `reauthorization_required` status, and fires
it again once the inbox is re-authenticated. Integrators can keep their
own view of which inboxes are healthy without polling the API.

This is gated behind the `ENABLE_INBOX_EVENTS` installation flag — the
**Inbox updated** webhook subscription only appears in the dashboard
when that flag is enabled, so no event is offered that the backend
wouldn't dispatch.

Fixes
https://linear.app/chatwoot/issue/CW-7148/emit-inbox-webhook-when-an-inbox-is-disconnected

## How to test

1. Set `ENABLE_INBOX_EVENTS=true` and restart the app.
2. In **Settings → Integrations → Webhooks**, add a webhook and
subscribe to **Inbox updated**.
3. Disconnect an inbox — let an email/Instagram channel hit its
auth-error threshold, or run `inbox.channel.prompt_reauthorization!` in
a console.
4. The endpoint receives an `inbox_updated` event whose
`changed_attributes` shows `reauthorization_required` flipping to
`true`.
5. Re-authenticate the inbox (or run `inbox.channel.reauthorized!`) —
the endpoint receives the `true → false` transition.
6. Confirm the **Inbox updated** option is hidden when
`ENABLE_INBOX_EVENTS` is unset.

---------

Co-authored-by: Muhsin <12408980+muhsin-k@users.noreply.github.com>
2026-05-22 09:00:18 +04:00

36 lines
1.0 KiB
Ruby

class Inbox::EventDataPresenter < SimpleDelegator
def push_data
{
# Conversation thread config
allow_messages_after_resolved: allow_messages_after_resolved,
lock_to_single_conversation: lock_to_single_conversation,
# Auto Assignment config
auto_assignment_config: auto_assignment_config,
enable_auto_assignment: enable_auto_assignment,
# Feature flag for message events
enable_email_collect: enable_email_collect,
greeting_enabled: greeting_enabled,
greeting_message: greeting_message,
csat_survey_enabled: csat_survey_enabled,
# Outbound email sender config
business_name: business_name,
sender_name_type: sender_name_type,
# Business hour config
timezone: timezone,
out_of_office_message: out_of_office_message,
working_hours_enabled: working_hours_enabled,
working_hours: working_hours.as_json,
created_at: created_at,
updated_at: updated_at,
# Associated channel attributes
channel: channel
}
end
end