feat: baileys connection period check (#87)

* feat: periodic check for baileys connection

* chore: add index on provider connection
This commit is contained in:
Gabriel Jablonski 2025-07-26 11:38:16 -03:00 committed by GitHub
parent 6f6e798700
commit 2cf1795a3b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 97 additions and 2 deletions

View File

@ -0,0 +1,7 @@
class Channels::Whatsapp::BaileysConnectionCheckJob < ApplicationJob
queue_as :low
def perform(whatsapp_channel)
whatsapp_channel.setup_channel_provider
end
end

View File

@ -0,0 +1,11 @@
class Channels::Whatsapp::BaileysConnectionCheckSchedulerJob < ApplicationJob
queue_as :low
def perform
Channel::Whatsapp.where(provider: 'baileys')
.where("provider_connection->>'connection' = ?", 'open')
.find_each do |channel|
Channels::Whatsapp::BaileysConnectionCheckJob.perform_later(channel)
end
end
end

View File

@ -20,6 +20,9 @@ class TriggerScheduledItemsJob < ApplicationJob
# Job to sync whatsapp templates
Channels::Whatsapp::TemplatesSyncSchedulerJob.perform_later
# Job to check WhatsApp connection status
Channels::Whatsapp::BaileysConnectionCheckSchedulerJob.perform_later
# Job to clear notifications which are older than 1 month
Notification::RemoveOldNotificationJob.perform_later
end

View File

@ -15,7 +15,8 @@
#
# Indexes
#
# index_channel_whatsapp_on_phone_number (phone_number) UNIQUE
# index_channel_whatsapp_baileys_connection (provider_connection) WHERE ((provider)::text = 'baileys'::text) USING gin
# index_channel_whatsapp_on_phone_number (phone_number) UNIQUE
#
class Channel::Whatsapp < ApplicationRecord

View File

@ -0,0 +1,10 @@
class AddWhatsappChannelProviderIndex < ActiveRecord::Migration[7.1]
disable_ddl_transaction!
def change
add_index :channel_whatsapp, :provider_connection,
using: :gin,
where: "provider = 'baileys'",
name: 'index_channel_whatsapp_baileys_connection'
end
end

View File

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.1].define(version: 2025_07_14_104358) do
ActiveRecord::Schema[7.1].define(version: 2025_07_26_142410) do
# These extensions should be enabled to support this database
enable_extension "pg_stat_statements"
enable_extension "pg_trgm"
@ -505,6 +505,7 @@ ActiveRecord::Schema[7.1].define(version: 2025_07_14_104358) do
t.datetime "message_templates_last_updated", precision: nil
t.jsonb "provider_connection", default: {}
t.index ["phone_number"], name: "index_channel_whatsapp_on_phone_number", unique: true
t.index ["provider_connection"], name: "index_channel_whatsapp_baileys_connection", where: "((provider)::text = 'baileys'::text)", using: :gin
end
create_table "contact_inboxes", force: :cascade do |t|

View File

@ -0,0 +1,20 @@
require 'rails_helper'
RSpec.describe Channels::Whatsapp::BaileysConnectionCheckJob do
let(:channel_whatsapp) { create(:channel_whatsapp, sync_templates: false, validate_provider_config: false) }
it 'enqueues the job' do
expect { described_class.perform_later(channel_whatsapp) }.to have_enqueued_job(described_class)
.on_queue('low')
end
context 'when called' do
it 'calls setup_channel_provider' do
allow(channel_whatsapp).to receive(:setup_channel_provider).and_return(true)
described_class.perform_now(channel_whatsapp)
expect(channel_whatsapp).to have_received(:setup_channel_provider)
end
end
end

View File

@ -0,0 +1,37 @@
require 'rails_helper'
RSpec.describe Channels::Whatsapp::BaileysConnectionCheckSchedulerJob do
it 'enqueues the job' do
expect { described_class.perform_later }.to have_enqueued_job(described_class)
.on_queue('low')
end
context 'when called' do
it 'schedules BaileysConnectionCheckJob for each WhatsApp channel with baileys provider connection open' do
channel = create(:channel_whatsapp, provider: 'baileys', provider_connection: { 'connection' => 'open' }, sync_templates: false,
validate_provider_config: false)
described_class.perform_now
expect(Channels::Whatsapp::BaileysConnectionCheckJob).to have_been_enqueued.with(channel).on_queue('low')
end
it 'does not schedule BaileysConnectionCheckJob for channels with different provider' do
create(:channel_whatsapp, provider: 'whatsapp_cloud', provider_connection: { 'connection' => 'open' }, sync_templates: false,
validate_provider_config: false)
expect do
described_class.perform_now
end.not_to have_enqueued_job(Channels::Whatsapp::BaileysConnectionCheckJob)
end
it 'does not schedule BaileysConnectionCheckJob for channels with closed connection' do
create(:channel_whatsapp, provider: 'baileys', provider_connection: { 'connection' => 'closed' }, sync_templates: false,
validate_provider_config: false)
expect do
described_class.perform_now
end.not_to have_enqueued_job(Channels::Whatsapp::BaileysConnectionCheckJob)
end
end
end

View File

@ -30,6 +30,11 @@ RSpec.describe TriggerScheduledItemsJob do
described_class.perform_now
end
it 'triggers Channels::Whatsapp::BaileysConnectionCheckSchedulerJob' do
expect(Channels::Whatsapp::BaileysConnectionCheckSchedulerJob).to receive(:perform_later).once
described_class.perform_now
end
it 'triggers Notification::RemoveOldNotificationJob' do
expect(Notification::RemoveOldNotificationJob).to receive(:perform_later).once
described_class.perform_now