Chatwoot/app/builders/messages/message_builder.rb

60 lines
1.6 KiB
Ruby
Raw Normal View History

class Messages::MessageBuilder
2020-07-21 06:45:24 +00:00
include ::FileTypeHelper
attr_reader :message
2020-07-21 06:45:24 +00:00
def initialize(user, conversation, params)
@content = params[:content]
@private = params[:private] || false
@conversation = conversation
@user = user
@message_type = params[:message_type] || 'outgoing'
@content_type = params[:content_type]
@items = params.to_unsafe_h&.dig(:content_attributes, :items)
@attachments = params[:attachments]
@in_reply_to = params.to_unsafe_h&.dig(:content_attributes, :in_reply_to)
end
def perform
2020-07-21 06:45:24 +00:00
@message = @conversation.messages.build(message_params)
if @attachments.present?
@attachments.each do |uploaded_attachment|
attachment = @message.attachments.new(
account_id: @message.account_id,
file_type: file_type(uploaded_attachment&.content_type)
)
attachment.file.attach(uploaded_attachment)
end
end
2020-07-21 06:45:24 +00:00
@message.save
@message
end
private
2020-07-21 06:45:24 +00:00
def message_type
if @conversation.inbox.channel_type != 'Channel::Api' && @message_type == 'incoming'
2020-07-21 06:45:24 +00:00
raise StandardError, 'Incoming messages are only allowed in Api inboxes'
end
2020-07-21 06:45:24 +00:00
@message_type
end
2020-07-21 06:45:24 +00:00
def sender
message_type == 'outgoing' ? @user : @conversation.contact
end
def message_params
{
2020-07-21 06:45:24 +00:00
account_id: @conversation.account_id,
inbox_id: @conversation.inbox_id,
message_type: message_type,
content: @content,
private: @private,
sender: sender,
content_type: @content_type,
items: @items,
in_reply_to: @in_reply_to
}
end
end