zammad/zammad

View on GitHub
lib/whatsapp/webhook/message/status.rb

Summary

Maintainability
A
0 mins
Test Coverage
# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

class Whatsapp::Webhook::Message::Status
  include Mixin::RequiredSubPaths

  attr_reader :data, :channel, :ticket, :related_article

  def initialize(data:, channel:)
    @data = data
    @channel = channel
  end

  def process
    @related_article = find_related_article
    raise Whatsapp::Webhook::Payload::ProcessableError, __('No related article found to process the status message on.') if @related_article.nil?

    @ticket = @related_article.ticket

    create_article
    update_related_article
    update_ticket
  end

  private

  def body
    raise NotImplementedError
  end

  def status
    @status ||= @data[:entry]
      .first[:changes]
      .first[:value][:statuses]
      .first
  end

  def find_related_article
    Ticket::Article.where(message_id: status[:id])&.first
  end

  def update_related_article?
    true
  end

  def article_timestamp_key
    raise NotImplementedError
  end

  def update_related_article_attributes
    preferences = @related_article.preferences
    preferences[:whatsapp][article_timestamp_key] = status[:timestamp]

    { preferences: }
  end

  def update_related_article
    return if !update_related_article? || update_related_article_attributes.blank?

    @related_article.update!(update_related_article_attributes)
  end

  def create_article?
    false
  end

  def create_article
    return if !create_article?

    Ticket::Article.create!(
      ticket_id:     @ticket.id,
      type_id:       Ticket::Article::Type.lookup(name: 'note').id,
      sender_id:     Ticket::Article::Sender.lookup(name: 'System').id,
      from:          "#{@channel.options[:name]} (#{@channel.options[:phone_number]})",
      internal:      true,
      body:          "Unable to handle WhatsApp message: #{body}",
      content_type:  'text/plain',
      preferences:   {
        delivery_article_id_related: @related_article.id,
        delivery_message:            true,
      },
      updated_by_id: 1,
      created_by_id: 1,
    )
  end

  def update_ticket?
    false
  end

  def update_ticket_attributes
    raise NotImplementedError
  end

  def update_ticket
    return if !update_ticket? || update_ticket_attributes.blank?

    @ticket.update!(update_ticket_attributes)
  end
end