diff --git a/app/services/whatsapp/providers/whatsapp_cloud_service.rb b/app/services/whatsapp/providers/whatsapp_cloud_service.rb index aac2eab6c..9b6c793aa 100644 --- a/app/services/whatsapp/providers/whatsapp_cloud_service.rb +++ b/app/services/whatsapp/providers/whatsapp_cloud_service.rb @@ -23,13 +23,24 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi end def sync_templates - response = HTTParty.get("#{business_account_path}/message_templates?access_token=#{whatsapp_channel.provider_config['api_key']}") + templates = fetch_whatsapp_templates("#{business_account_path}/message_templates?access_token=#{whatsapp_channel.provider_config['api_key']}") - return unless response.success? + whatsapp_channel.update(message_templates: templates, message_templates_last_updated: Time.now.utc) if templates.present? + end - @templates = response['data'] - fetch_next_templates(response) - save_templates + def fetch_whatsapp_templates(url) + response = HTTParty.get(url) + return [] unless response.success? + + next_url = next_url(response) + + return response['data'] + fetch_whatsapp_templates(next_url) if next_url.present? + + response['data'] + end + + def next_url(response) + response['paging'] ? response['paging']['next'] : '' end def validate_provider_config? @@ -45,25 +56,6 @@ class Whatsapp::Providers::WhatsappCloudService < Whatsapp::Providers::BaseServi "#{api_base_path}/v13.0/#{media_id}" end - def fetch_next_templates(response) - loop do - break unless response['paging'] && response['paging']['next'] - - response = HTTParty.get(response['paging']['next']) - push_templates(response) - end - end - - private - - def push_templates(response) - @templates << response['data'] if response.success? && response['data'].any? - end - - def save_templates - whatsapp_channel.update(message_templates: @templates, message_templates_last_updated: Time.now.utc) - end - def api_base_path ENV.fetch('WHATSAPP_CLOUD_BASE_URL', 'https://graph.facebook.com') end diff --git a/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb b/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb index 69527487e..8946dfc9f 100644 --- a/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb +++ b/spec/services/whatsapp/providers/whatsapp_cloud_service_spec.rb @@ -120,12 +120,17 @@ describe Whatsapp::Providers::WhatsappCloudService do { status: 200, headers: response_headers, body: { data: [ { id: '123456789', name: 'next_template' } + ], paging: { next: 'https://graph.facebook.com/v14.0/123456789/message_templates?access_token=test_key' } }.to_json }, + { status: 200, headers: response_headers, + body: { data: [ + { id: '123456789', name: 'last_template' } ], paging: { prev: 'https://graph.facebook.com/v14.0/123456789/message_templates?access_token=test_key' } }.to_json } ) expect(subject.sync_templates).to be(true) expect(whatsapp_channel.reload.message_templates.first).to eq({ id: '123456789', name: 'test_template' }.stringify_keys) - expect(whatsapp_channel.reload.message_templates.last).to eq([{ id: '123456789', name: 'next_template' }.stringify_keys]) + expect(whatsapp_channel.reload.message_templates.second).to eq({ id: '123456789', name: 'next_template' }.stringify_keys) + expect(whatsapp_channel.reload.message_templates.last).to eq({ id: '123456789', name: 'last_template' }.stringify_keys) end end end