chatwoot/chatwoot

View on GitHub
lib/integrations/facebook/delivery_status.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

class Integrations::Facebook::DeliveryStatus
  pattr_initialize [:params!]

  def perform
    return if facebook_channel.blank?
    return unless conversation

    process_delivery_status if params.delivery_watermark
    process_read_status if params.read_watermark
  end

  private

  def process_delivery_status
    timestamp = Time.zone.at(params.delivery_watermark.to_i).to_datetime.utc
    ::Conversations::UpdateMessageStatusJob.perform_later(conversation.id, timestamp, :delivered)
  end

  def process_read_status
    timestamp = Time.zone.at(params.read_watermark.to_i).to_datetime.utc
    ::Conversations::UpdateMessageStatusJob.perform_later(conversation.id, timestamp, :read)
  end

  def contact
    ::ContactInbox.find_by(source_id: params.sender_id)&.contact
  end

  def conversation
    @conversation ||= ::Conversation.find_by(contact_id: contact.id) if contact.present?
  end

  def facebook_channel
    @facebook_channel ||= Channel::FacebookPage.find_by(page_id: params.recipient_id)
  end
end