12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- class Whatsapp::Webhook::Message::Reaction < Whatsapp::Webhook::Message
- attr_reader :related_article
- def type
- :reaction
- end
- def process
- @related_article = find_related_article
- raise Whatsapp::Webhook::Payload::ProcessableError, __('No related article found to process the reaction message on.') if @related_article.nil?
- @ticket = @related_article.ticket
- return if ticket_done?
- @user = create_or_update_user
- UserInfo.current_user_id = @user.id
- history_type = determine_history_type
- update_related_article
- update_ticket(ticket: @ticket)
- update_ticket_history_entry(history_type)
- notify_agents
- schedule_reminder_job
- end
- private
- def ticket_done?
- state_ids = Ticket::State.where(name: %w[closed merged removed]).pluck(:id)
- state_ids.include?(@ticket.state_id)
- end
- def emoji
- message.fetch(:emoji, nil)
- end
- def find_related_article
- Ticket::Article.where(message_id: message[:message_id])&.first
- end
- def update_related_article
- @related_article.update!(update_related_article_attributes)
- end
- def update_related_article_attributes
- preferences = @related_article.preferences
- preferences[:whatsapp] ||= {}
- preferences[:whatsapp][:reaction] = {
- emoji: emoji,
- author: user.fullname
- }
- { preferences: }
- end
- def determine_history_type
- return 'created' if @related_article.preferences[:whatsapp]&.fetch(:reaction, nil).nil?
- emoji.nil? ? 'removed' : 'updated'
- end
- def update_ticket_history_entry(history_type)
- History.add(
- history_type: history_type,
- history_object: 'Ticket::Article',
- history_attribute: 'reaction',
- o_id: @related_article.id,
- related_history_object: 'Ticket',
- related_o_id: @ticket.id,
- value_from: @related_article.created_by.fullname,
- value_to: emoji || '',
- created_by_id: @user.id,
- )
- end
- def notify_agents
- return if emoji.nil?
- TransactionJob.perform_now(
- object: 'Ticket::Article',
- type: 'update.reaction',
- object_id: @related_article.ticket.id,
- article_id: @related_article.id,
- user_id: @user.id,
- )
- end
- end
|