feat(baileys): add status method to fetch Baileys API version and availability (#104)

* feat(baileys): add status method to fetch Baileys API version and availability

* test: specs

* chore: raise error instead of returning error in version
This commit is contained in:
Gabriel Jablonski 2025-08-27 13:56:06 -03:00 committed by GitHub
parent 23cefa6c7f
commit 9f5c62c724
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 102 additions and 0 deletions

View File

@ -7,6 +7,7 @@ class SuperAdmin::InstanceStatusesController < SuperAdmin::ApplicationController
redis_metrics
chatwoot_edition
instance_meta
baileys_api_version
end
def chatwoot_edition
@ -56,4 +57,10 @@ class SuperAdmin::InstanceStatusesController < SuperAdmin::ApplicationController
rescue Redis::CannotConnectError
@metrics['Redis alive'] = false
end
def baileys_api_version
@metrics['Baileys API version'] = Whatsapp::Providers::WhatsappBaileysService.status[:packageInfo][:version]
rescue Whatsapp::Providers::WhatsappBaileysService::ProviderUnavailableError => e
@metrics['Baileys API version'] = e.message
end
end

View File

@ -8,6 +8,24 @@ class Whatsapp::Providers::WhatsappBaileysService < Whatsapp::Providers::BaseSer
DEFAULT_URL = ENV.fetch('BAILEYS_PROVIDER_DEFAULT_URL', nil)
DEFAULT_API_KEY = ENV.fetch('BAILEYS_PROVIDER_DEFAULT_API_KEY', nil)
def self.status
if DEFAULT_URL.blank? || DEFAULT_API_KEY.blank?
raise ProviderUnavailableError, 'Missing BAILEYS_PROVIDER_DEFAULT_URL or BAILEYS_PROVIDER_DEFAULT_API_KEY setup'
end
response = HTTParty.get(
"#{DEFAULT_URL}/status",
headers: { 'x-api-key' => DEFAULT_API_KEY }
)
unless response.success?
Rails.logger.error response.body
raise ProviderUnavailableError, 'Baileys API is unavailable'
end
response.parsed_response.deep_symbolize_keys
end
def setup_channel_provider
response = HTTParty.post(
"#{provider_url}/connections/#{whatsapp_channel.phone_number}",

View File

@ -13,6 +13,83 @@ describe Whatsapp::Providers::WhatsappBaileysService do
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_CLIENT_NAME', 'chatwoot-test')
end
describe '.status' do
context 'when DEFAULT_URL or DEFAULT_API_KEY are missing' do
it 'raises ProviderUnavailableError when DEFAULT_URL is blank' do
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_URL', '')
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_API_KEY', 'test_key')
expect do
described_class.status
end.to raise_error(Whatsapp::Providers::WhatsappBaileysService::ProviderUnavailableError,
'Missing BAILEYS_PROVIDER_DEFAULT_URL or BAILEYS_PROVIDER_DEFAULT_API_KEY setup')
end
it 'raises ProviderUnavailableError when DEFAULT_API_KEY is blank' do
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_URL', 'http://test.com')
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_API_KEY', '')
expect do
described_class.status
end.to raise_error(Whatsapp::Providers::WhatsappBaileysService::ProviderUnavailableError,
'Missing BAILEYS_PROVIDER_DEFAULT_URL or BAILEYS_PROVIDER_DEFAULT_API_KEY setup')
end
it 'raises ProviderUnavailableError when both are blank' do
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_URL', nil)
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_API_KEY', nil)
expect do
described_class.status
end.to raise_error(Whatsapp::Providers::WhatsappBaileysService::ProviderUnavailableError,
'Missing BAILEYS_PROVIDER_DEFAULT_URL or BAILEYS_PROVIDER_DEFAULT_API_KEY setup')
end
end
context 'when DEFAULT_URL and DEFAULT_API_KEY are present' do
before do
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_URL', 'http://test.com')
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_API_KEY', 'test_key')
end
context 'when response is successful' do
it 'returns the status response with symbolized keys' do
stub_request(:get, 'http://test.com/status')
.with(headers: { 'x-api-key' => 'test_key' })
.to_return(
status: 200,
headers: { 'Content-Type' => 'application/json' },
body: { packageInfo: { version: '1.0.0' } }.to_json
)
result = described_class.status
expect(result).to eq({ packageInfo: { version: '1.0.0' } })
end
end
context 'when response is unsuccessful' do
it 'logs the error and raises ProviderUnavailableError' do
stub_request(:get, 'http://test.com/status')
.with(headers: { 'x-api-key' => 'test_key' })
.to_return(
status: 500,
body: 'Internal Server Error',
headers: {}
)
allow(Rails.logger).to receive(:error)
expect do
described_class.status
end.to raise_error(Whatsapp::Providers::WhatsappBaileysService::ProviderUnavailableError, 'Baileys API is unavailable')
expect(Rails.logger).to have_received(:error).with('Internal Server Error')
end
end
end
end
describe '#setup_channel_provider' do
context 'when response is successful' do
it 'calls the connection endpoint' do