mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-01 19:48:08 +00:00
- Added an api endpoint for update message status ( available only for api inboxes ) - Moved message status management to a service. - Handles case where read status arrive before delivered fixes: #10314 , #9962
81 lines
2.4 KiB
Ruby
81 lines
2.4 KiB
Ruby
class Api::V1::Accounts::Conversations::MessagesController < Api::V1::Accounts::Conversations::BaseController
|
|
before_action :ensure_api_inbox, only: :update
|
|
|
|
def index
|
|
@messages = message_finder.perform
|
|
end
|
|
|
|
def create
|
|
user = Current.user || @resource
|
|
mb = Messages::MessageBuilder.new(user, @conversation, params)
|
|
@message = mb.perform
|
|
rescue StandardError => e
|
|
render_could_not_create_error(e.message)
|
|
end
|
|
|
|
def update
|
|
Messages::StatusUpdateService.new(message, permitted_params[:status], permitted_params[:external_error]).perform
|
|
@message = message
|
|
end
|
|
|
|
def destroy
|
|
ActiveRecord::Base.transaction do
|
|
message.update!(content: I18n.t('conversations.messages.deleted'), content_type: :text, content_attributes: { deleted: true })
|
|
message.attachments.destroy_all
|
|
end
|
|
end
|
|
|
|
def retry
|
|
return if message.blank?
|
|
|
|
service = Messages::StatusUpdateService.new(message, 'sent')
|
|
service.perform
|
|
message.update!(content_attributes: {})
|
|
::SendReplyJob.perform_later(message.id)
|
|
rescue StandardError => e
|
|
render_could_not_create_error(e.message)
|
|
end
|
|
|
|
def translate
|
|
return head :ok if already_translated_content_available?
|
|
|
|
translated_content = Integrations::GoogleTranslate::ProcessorService.new(
|
|
message: message,
|
|
target_language: permitted_params[:target_language]
|
|
).perform
|
|
|
|
if translated_content.present?
|
|
translations = {}
|
|
translations[permitted_params[:target_language]] = translated_content
|
|
translations = message.translations.merge!(translations) if message.translations.present?
|
|
message.update!(translations: translations)
|
|
end
|
|
|
|
render json: { content: translated_content }
|
|
end
|
|
|
|
private
|
|
|
|
def message
|
|
@message ||= @conversation.messages.find(permitted_params[:id])
|
|
end
|
|
|
|
def message_finder
|
|
@message_finder ||= MessageFinder.new(@conversation, params)
|
|
end
|
|
|
|
def permitted_params
|
|
params.permit(:id, :target_language, :status, :external_error)
|
|
end
|
|
|
|
def already_translated_content_available?
|
|
message.translations.present? && message.translations[permitted_params[:target_language]].present?
|
|
end
|
|
|
|
# API inbox check
|
|
def ensure_api_inbox
|
|
# Only API inboxes can update messages
|
|
render json: { error: 'Message status update is only allowed for API inboxes' }, status: :forbidden unless @conversation.inbox.api?
|
|
end
|
|
end
|