# frozen_string_literal: true # == Schema Information # # Table name: inboxes # # id :integer not null, primary key # channel_type :string # name :string not null # created_at :datetime not null # updated_at :datetime not null # account_id :integer not null # channel_id :integer not null # # Indexes # # index_inboxes_on_account_id (account_id) # class Inbox < ApplicationRecord validates :account_id, presence: true belongs_to :account # TODO: should add associations for the channel types belongs_to :channel, polymorphic: true, dependent: :destroy has_many :contact_inboxes, dependent: :destroy has_many :contacts, through: :contact_inboxes has_many :inbox_members, dependent: :destroy has_many :members, through: :inbox_members, source: :user has_many :conversations, dependent: :destroy has_many :messages, through: :conversations after_create :subscribe_webhook, if: :facebook? after_destroy :delete_round_robin_agents def add_member(user_id) member = inbox_members.new(user_id: user_id) member.save! end def remove_member(user_id) member = inbox_members.find_by(user_id: user_id) member.try(:destroy) end def facebook? channel.class.name.to_s == 'Channel::FacebookPage' end def web_widget? channel.class.name.to_s == 'Channel::WebWidget' end def next_available_agent user_id = Redis::Alfred.rpoplpush(round_robin_key, round_robin_key) account.users.find_by(id: user_id) end private def delete_round_robin_agents Redis::Alfred.delete(round_robin_key) end def round_robin_key format(Constants::RedisKeys::ROUND_ROBIN_AGENTS, inbox_id: id) end def subscribe_webhook Facebook::Messenger::Subscriptions.subscribe( access_token: channel.page_access_token, subscribed_fields: %w[ messages messaging_postbacks messaging_optins message_deliveries message_reads messaging_payments messaging_pre_checkouts messaging_checkout_updates messaging_account_linking messaging_referrals message_echoes messaging_game_plays standby messaging_handovers messaging_policy_enforcement message_reactions ] ) end end