class Whatsapp::Providers::Whatsapp360DialogService < Whatsapp::Providers::BaseService def send_message(phone_number, message) if message.attachments.present? send_attachment_message(phone_number, message) else send_text_message(phone_number, message) end end def send_template(phone_number, template_info) response = HTTParty.post( "#{api_base_path}/messages", headers: api_headers, body: { to: phone_number, template: template_body_parameters(template_info), type: 'template' }.to_json ) process_response(response) end def sync_templates response = HTTParty.get("#{api_base_path}/configs/templates", headers: api_headers) whatsapp_channel.update(message_templates: response['waba_templates'], message_templates_last_updated: Time.now.utc) if response.success? end def validate_provider_config? response = HTTParty.post( "#{api_base_path}/configs/webhook", headers: { 'D360-API-KEY': whatsapp_channel.provider_config['api_key'], 'Content-Type': 'application/json' }, body: { url: "#{ENV.fetch('FRONTEND_URL', nil)}/webhooks/whatsapp/#{whatsapp_channel.phone_number}" }.to_json ) response.success? end def api_headers { 'D360-API-KEY' => whatsapp_channel.provider_config['api_key'], 'Content-Type' => 'application/json' } end def media_url(media_id) "#{api_base_path}/media/#{media_id}" end private def api_base_path # provide the environment variable when testing against sandbox : 'https://waba-sandbox.360dialog.io/v1' ENV.fetch('360DIALOG_BASE_URL', 'https://waba.360dialog.io/v1') end def send_text_message(phone_number, message) response = HTTParty.post( "#{api_base_path}/messages", headers: api_headers, body: { to: phone_number, text: { body: message.content }, type: 'text' }.to_json ) process_response(response) end def send_attachment_message(phone_number, message) attachment = message.attachments.first type = %w[image audio video].include?(attachment.file_type) ? attachment.file_type : 'document' attachment_url = attachment.download_url response = HTTParty.post( "#{api_base_path}/messages", headers: api_headers, body: { 'to' => phone_number, 'type' => type, type.to_s => { 'link': attachment_url, 'caption': message.content } }.to_json ) process_response(response) end def process_response(response) if response.success? response['messages'].first['id'] else Rails.logger.error response.body nil end end def template_body_parameters(template_info) { name: template_info[:name], namespace: template_info[:namespace], language: { policy: 'deterministic', code: template_info[:lang_code] }, components: [{ type: 'body', parameters: template_info[:parameters] }] } end end