lib/whatsapp/webhook/message/status.rb
# 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