Restructure omni services and add Chatwoot research snapshot
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
class Api::V1::Accounts::Conversations::AssignmentsController < Api::V1::Accounts::Conversations::BaseController
|
||||
# assigns agent/team to a conversation
|
||||
def create
|
||||
if params.key?(:assignee_id) || agent_bot_assignment?
|
||||
set_agent
|
||||
elsif params.key?(:team_id)
|
||||
set_team
|
||||
else
|
||||
render json: nil
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_agent
|
||||
resource = Conversations::AssignmentService.new(
|
||||
conversation: @conversation,
|
||||
assignee_id: params[:assignee_id],
|
||||
assignee_type: params[:assignee_type]
|
||||
).perform
|
||||
|
||||
render_agent(resource)
|
||||
end
|
||||
|
||||
def render_agent(resource)
|
||||
case resource
|
||||
when User
|
||||
render partial: 'api/v1/models/agent', formats: [:json], locals: { resource: resource }
|
||||
when AgentBot
|
||||
render partial: 'api/v1/models/agent_bot_slim', formats: [:json], locals: { resource: resource }
|
||||
else
|
||||
render json: nil
|
||||
end
|
||||
end
|
||||
|
||||
def set_team
|
||||
@team = Current.account.teams.find_by(id: params[:team_id])
|
||||
@conversation.update!(team: @team)
|
||||
render json: @team
|
||||
end
|
||||
|
||||
def agent_bot_assignment?
|
||||
params[:assignee_type].to_s == 'AgentBot'
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,10 @@
|
||||
class Api::V1::Accounts::Conversations::BaseController < Api::V1::Accounts::BaseController
|
||||
before_action :conversation
|
||||
|
||||
private
|
||||
|
||||
def conversation
|
||||
@conversation ||= Current.account.conversations.find_by!(display_id: params[:conversation_id])
|
||||
authorize @conversation, :show?
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,17 @@
|
||||
class Api::V1::Accounts::Conversations::DirectUploadsController < ActiveStorage::DirectUploadsController
|
||||
include EnsureCurrentAccountHelper
|
||||
before_action :current_account
|
||||
before_action :conversation
|
||||
|
||||
def create
|
||||
return if @conversation.nil? || @current_account.nil?
|
||||
|
||||
super
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def conversation
|
||||
@conversation ||= Current.account.conversations.find_by(display_id: params[:conversation_id])
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,28 @@
|
||||
class Api::V1::Accounts::Conversations::DraftMessagesController < Api::V1::Accounts::Conversations::BaseController
|
||||
def show
|
||||
render json: { has_draft: false } and return unless Redis::Alfred.exists?(draft_redis_key)
|
||||
|
||||
draft_message = Redis::Alfred.get(draft_redis_key)
|
||||
render json: { has_draft: true, message: draft_message }
|
||||
end
|
||||
|
||||
def update
|
||||
Redis::Alfred.set(draft_redis_key, draft_message_params)
|
||||
head :ok
|
||||
end
|
||||
|
||||
def destroy
|
||||
Redis::Alfred.delete(draft_redis_key)
|
||||
head :ok
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def draft_redis_key
|
||||
format(Redis::Alfred::CONVERSATION_DRAFT_MESSAGE, id: @conversation.id)
|
||||
end
|
||||
|
||||
def draft_message_params
|
||||
params.dig(:draft_message, :message) || ''
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
class Api::V1::Accounts::Conversations::LabelsController < Api::V1::Accounts::Conversations::BaseController
|
||||
include LabelConcern
|
||||
|
||||
private
|
||||
|
||||
def model
|
||||
@model ||= @conversation
|
||||
end
|
||||
|
||||
def permitted_params
|
||||
params.permit(:conversation_id, labels: [])
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,80 @@
|
||||
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
|
||||
@@ -0,0 +1,41 @@
|
||||
class Api::V1::Accounts::Conversations::ParticipantsController < Api::V1::Accounts::Conversations::BaseController
|
||||
def show
|
||||
@participants = @conversation.conversation_participants
|
||||
end
|
||||
|
||||
def create
|
||||
ActiveRecord::Base.transaction do
|
||||
@participants = participants_to_be_added_ids.map { |user_id| @conversation.conversation_participants.find_or_create_by(user_id: user_id) }
|
||||
end
|
||||
end
|
||||
|
||||
def update
|
||||
ActiveRecord::Base.transaction do
|
||||
participants_to_be_added_ids.each { |user_id| @conversation.conversation_participants.find_or_create_by(user_id: user_id) }
|
||||
participants_to_be_removed_ids.each { |user_id| @conversation.conversation_participants.find_by(user_id: user_id)&.destroy }
|
||||
end
|
||||
@participants = @conversation.conversation_participants
|
||||
render action: 'show'
|
||||
end
|
||||
|
||||
def destroy
|
||||
ActiveRecord::Base.transaction do
|
||||
params[:user_ids].map { |user_id| @conversation.conversation_participants.find_by(user_id: user_id)&.destroy }
|
||||
end
|
||||
head :ok
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def participants_to_be_added_ids
|
||||
params[:user_ids] - current_participant_ids
|
||||
end
|
||||
|
||||
def participants_to_be_removed_ids
|
||||
current_participant_ids - params[:user_ids]
|
||||
end
|
||||
|
||||
def current_participant_ids
|
||||
@current_participant_ids ||= @conversation.conversation_participants.pluck(:user_id)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user