fix(voice): record permission_request wamid for context-based reply matching
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user