1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- # Copyright (C) 2012-2024 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
|