zammad/lib/validations/ticket_article_validator/whatsapp_message.rb
2026-01-02 15:41:09 +02:00

95 lines
3 KiB
Ruby

# Copyright (C) 2012-2026 Zammad Foundation, https://zammad-foundation.org/
class Validations::TicketArticleValidator
class WhatsappMessage < Backend
MATCHING_TYPES = ['whatsapp message'].freeze
CONTENT_TYPE_OPTIONS = [
{ size: 16 * 1024 * 1024, identifier: :audio, label: __('Audio file'), no_caption: true },
{ size: 5 * 1024 * 1024, identifier: :image, label: __('Image file') },
{ size: 16 * 1024 * 1024, identifier: :video, label: __('Video file') },
{ size: 500 * 1024, identifier: :sticker, label: __('Sticker file'), no_caption: true },
{ size: 100 * 1024 * 1024, identifier: :document, label: __('Document file') },
].freeze
def validate_attachments_limit
return if !all_attachments.many?
@record.errors.add :base, format(__('Only %s attachment allowed'), 1)
end
def validate_attachment_content_type
return if !attachment
return if attachment_options
message = format(__('File format is not allowed: %s'), attachment.preferences['Content-Type'] || attachment.preferences['Mime-Type'])
@record.errors.add :base, message
end
def validate_attachments_size
return if !attachment_options
attachment_size = attachment.size.to_i
return if attachment_size <= attachment_options[:size]
size = ActiveSupport::NumberHelper.number_to_human_size attachment_options[:size]
message = format(__('File is too big. %s has to be %s or smaller.'), attachment_options[:label], size)
@record.errors.add :base, message
end
def validate_body
return if attachment
return if @record.body.present?
@record.errors.add :base, __('Text or attachment is required')
end
def validate_body_no_caption
return if !attachment_options&.dig(:no_caption)
return if @record.body.blank?
message = "#{attachment_options[:label]} is sent without text caption"
@record.errors.add :base, message
end
def validate_ticket_state
return if Ticket::State.where(name: %w[closed merged removed]).pluck(:id).exclude?(@record.ticket.state_id)
@record.errors.add :base, __('Reply allowed only for open tickets')
end
private
def attachment
return @attachment if defined?(@attachment)
@attachment = all_attachments.first
end
def attachment_options
return @attachment_options if defined?(@attachment_options)
return if !attachment
attachment_type = attachment.preferences['Content-Type'] || attachment.preferences['Mime-Type']
@attachment_options = CONTENT_TYPE_OPTIONS.find do |elem|
Whatsapp::Outgoing::Message::Media::SUPPORTED_MEDIA_TYPES[elem[:identifier]]
.include? attachment_type
end
end
def all_attachments
@all_attachments ||= @record.attachments + (@record.instance_variable_get(:@attachments_buffer) || [])
end
def validator_applies?
sender = Ticket::Article::Sender.lookup id: @record.sender_id
sender.name == 'Agent'
end
end
end