- Guard against delayed conference-start retries rolling a progressed
call back to ringing (Conference::Manager#mark_ringing!).
- Scope conference-status webhook Call lookup to the resolved inbox
(VoiceController#find_call_for_conference!).
- Require explicit call_sid on the agent TwiML leg and on
ConferenceController#create/destroy so multi-call conversations can't
attach the wrong call (no more most-recent-active fallback).
- Scope StatusUpdateService Call lookup to the webhook's account for
defense-in-depth.
- Update UPDATE_MESSAGE_CALL_STATUS mutation to match the voice_call
message by call_sid; helper/voice.js now passes callSid. Prevents an
older call's status update from clobbering the newest bubble.
Moves call state off conversation.additional_attributes and
conversation.identifier onto first-class Call records, one per call.
- Call is the source of truth for status, direction, duration, started_at,
accepted_by_agent, and conference_sid (in meta).
- Conference names key off Call.id (conf_account_{aid}_call_{cid}), so
multiple calls on one conversation no longer collide. lock_to_single_conversation
inboxes append each call as a new voice_call bubble in the existing thread.
- Agent identity on conference join webhooks is parsed from the Twilio
ParticipantLabel (agent-{user_id}-account-{account_id}); stateless and
independent of the /conference#create API call order.
- ConversationCard.vue derives the call badge from the latest voice_call
message, not a denormalized cache on the conversation. Removes the stale
"Call ended" state that lingered after subsequent text messages.
This pull request introduces frontend role filtering to allStatusChat
getter. The key changes include the addition of a new helper function to
get the user's role, updates to the conversation filtering logic to
incorporate role and permissions, and the addition of unit tests for the
new filtering logic.
---------
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>