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:
parent
23cefa6c7f
commit
9f5c62c724
@ -7,6 +7,7 @@ class SuperAdmin::InstanceStatusesController < SuperAdmin::ApplicationController
|
|||||||
redis_metrics
|
redis_metrics
|
||||||
chatwoot_edition
|
chatwoot_edition
|
||||||
instance_meta
|
instance_meta
|
||||||
|
baileys_api_version
|
||||||
end
|
end
|
||||||
|
|
||||||
def chatwoot_edition
|
def chatwoot_edition
|
||||||
@ -56,4 +57,10 @@ class SuperAdmin::InstanceStatusesController < SuperAdmin::ApplicationController
|
|||||||
rescue Redis::CannotConnectError
|
rescue Redis::CannotConnectError
|
||||||
@metrics['Redis alive'] = false
|
@metrics['Redis alive'] = false
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
@ -8,6 +8,24 @@ class Whatsapp::Providers::WhatsappBaileysService < Whatsapp::Providers::BaseSer
|
|||||||
DEFAULT_URL = ENV.fetch('BAILEYS_PROVIDER_DEFAULT_URL', nil)
|
DEFAULT_URL = ENV.fetch('BAILEYS_PROVIDER_DEFAULT_URL', nil)
|
||||||
DEFAULT_API_KEY = ENV.fetch('BAILEYS_PROVIDER_DEFAULT_API_KEY', 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
|
def setup_channel_provider
|
||||||
response = HTTParty.post(
|
response = HTTParty.post(
|
||||||
"#{provider_url}/connections/#{whatsapp_channel.phone_number}",
|
"#{provider_url}/connections/#{whatsapp_channel.phone_number}",
|
||||||
|
|||||||
@ -13,6 +13,83 @@ describe Whatsapp::Providers::WhatsappBaileysService do
|
|||||||
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_CLIENT_NAME', 'chatwoot-test')
|
stub_const('Whatsapp::Providers::WhatsappBaileysService::DEFAULT_CLIENT_NAME', 'chatwoot-test')
|
||||||
end
|
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
|
describe '#setup_channel_provider' do
|
||||||
context 'when response is successful' do
|
context 'when response is successful' do
|
||||||
it 'calls the connection endpoint' do
|
it 'calls the connection endpoint' do
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user