fix(voice): record permission_request wamid for context-based reply matching

This commit is contained in:
Tanmay Deep Sharma
2026-04-30 17:11:55 +07:00
parent fd22017292
commit 41e3ea0d87
2 changed files with 11 additions and 4 deletions
@@ -94,7 +94,12 @@ class Api::V1::Accounts::WhatsappCallsController < Api::V1::Accounts::BaseContro
sent = conversation.inbox.channel.provider_service.send_call_permission_request(contact_phone)
return render_could_not_create_error(I18n.t('errors.whatsapp.calls.permission_request_failed')) unless sent
attrs = (conversation.additional_attributes || {}).merge('call_permission_requested_at' => Time.current.iso8601)
# Record the wamid so the reply webhook can match context.id back to this
# exact conversation rather than guessing by recency.
attrs = (conversation.additional_attributes || {}).merge(
'call_permission_requested_at' => Time.current.iso8601,
'call_permission_request_message_id' => sent.dig('messages', 0, 'id')
)
conversation.update!(additional_attributes: attrs)
render json: { status: 'permission_requested' }
end
@@ -103,9 +103,9 @@ RSpec.describe 'WhatsApp Calls API', type: :request do
expect(Call.find_by(provider_call_id: 'wacid_outbound')).to have_attributes(direction: 'outgoing', status: 'ringing')
end
it 'sends a permission request when Meta returns NoCallPermission' do
it 'sends a permission request and records the wamid when Meta returns NoCallPermission' do
allow(provider_service).to receive(:initiate_call).and_raise(Voice::CallErrors::NoCallPermission)
allow(provider_service).to receive(:send_call_permission_request).and_return({ 'messages' => [{ 'id' => 'wamid' }] })
allow(provider_service).to receive(:send_call_permission_request).and_return({ 'messages' => [{ 'id' => 'wamid.req_xyz' }] })
post "/api/v1/accounts/#{account.id}/whatsapp_calls/initiate",
params: { conversation_id: initiate_conversation.display_id, sdp_offer: 'sdp_offer' },
@@ -113,7 +113,9 @@ RSpec.describe 'WhatsApp Calls API', type: :request do
expect(response).to have_http_status(:ok)
expect(response.parsed_body['status']).to eq('permission_requested')
expect(initiate_conversation.reload.additional_attributes['call_permission_requested_at']).to be_present
attrs = initiate_conversation.reload.additional_attributes
expect(attrs['call_permission_requested_at']).to be_present
expect(attrs['call_permission_request_message_id']).to eq('wamid.req_xyz')
end
it 'returns 422 when sdp_offer is missing' do