fix(voice): rescue transport errors during permission_request send

This commit is contained in:
Tanmay Deep Sharma
2026-04-30 19:11:14 +07:00
parent 1c945899c7
commit 19d91e47f1
2 changed files with 22 additions and 1 deletions
@@ -123,7 +123,7 @@ class Api::V1::Accounts::WhatsappCallsController < Api::V1::Accounts::BaseContro
next
end
sent = provider_service.send_call_permission_request(@conversation.contact.phone_number.delete('+'))
sent = send_permission_request_safely
if sent
record_permission_request_wamid(sent)
status = 'permission_requested'
@@ -142,6 +142,15 @@ class Api::V1::Accounts::WhatsappCallsController < Api::V1::Accounts::BaseContro
last_requested.present? && Time.zone.parse(last_requested) > PERMISSION_REQUEST_THROTTLE.ago
end
# Treat transport errors the same as a falsy provider return so the action renders 422
# rather than letting Faraday/HTTParty exceptions bubble up as 500s.
def send_permission_request_safely
provider_service.send_call_permission_request(@conversation.contact.phone_number.delete('+'))
rescue StandardError => e
Rails.logger.warn "[WHATSAPP CALL] permission_request failed: #{e.class} #{e.message}"
nil
end
# Record the wamid so the reply webhook can match context.id back to this conversation.
def record_permission_request_wamid(sent)
attrs = (@conversation.additional_attributes || {}).merge(
@@ -118,6 +118,18 @@ RSpec.describe 'WhatsApp Calls API', type: :request do
expect(attrs['call_permission_request_message_id']).to eq('wamid.req_xyz')
end
it 'returns permission_request_failed when send_call_permission_request raises a transport error' do
allow(provider_service).to receive(:initiate_call).and_raise(Voice::CallErrors::NoCallPermission)
allow(provider_service).to receive(:send_call_permission_request).and_raise(Faraday::TimeoutError)
post "/api/v1/accounts/#{account.id}/whatsapp_calls/initiate",
params: { conversation_id: initiate_conversation.display_id, sdp_offer: 'sdp_offer' },
headers: agent.create_new_auth_token
expect(response).to have_http_status(:unprocessable_entity)
expect(response.parsed_body['error']).to eq(I18n.t('errors.whatsapp.calls.permission_request_failed'))
end
it 'returns 422 when sdp_offer is missing' do
post "/api/v1/accounts/#{account.id}/whatsapp_calls/initiate",
params: { conversation_id: initiate_conversation.display_id },