diff --git a/enterprise/app/controllers/api/v1/accounts/whatsapp_calls_controller.rb b/enterprise/app/controllers/api/v1/accounts/whatsapp_calls_controller.rb index 7ab777be5..96c98db7a 100644 --- a/enterprise/app/controllers/api/v1/accounts/whatsapp_calls_controller.rb +++ b/enterprise/app/controllers/api/v1/accounts/whatsapp_calls_controller.rb @@ -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 diff --git a/spec/enterprise/controllers/api/v1/accounts/whatsapp_calls_controller_spec.rb b/spec/enterprise/controllers/api/v1/accounts/whatsapp_calls_controller_spec.rb index 40ce454dc..4408e15f3 100644 --- a/spec/enterprise/controllers/api/v1/accounts/whatsapp_calls_controller_spec.rb +++ b/spec/enterprise/controllers/api/v1/accounts/whatsapp_calls_controller_spec.rb @@ -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