mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-03 20:48:07 +00:00 
			
		
		
		
	Adds the ability to lock conversation to a single thread for Whatsapp and Sms Inboxes when using outbound messages. demo: https://www.loom.com/share/c9e1e563c8914837a4139dfdd2503fef fixes: #4975 Co-authored-by: Nithin David <1277421+nithindavid@users.noreply.github.com>
		
			
				
	
	
		
			149 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController
 | 
						|
  include Api::V1::InboxesHelper
 | 
						|
  before_action :fetch_inbox, except: [:index, :create]
 | 
						|
  before_action :fetch_agent_bot, only: [:set_agent_bot]
 | 
						|
  before_action :validate_limit, only: [:create]
 | 
						|
  # we are already handling the authorization in fetch inbox
 | 
						|
  before_action :check_authorization, except: [:show]
 | 
						|
 | 
						|
  def index
 | 
						|
    @inboxes = policy_scope(Current.account.inboxes.order_by_name.includes(:channel, { avatar_attachment: [:blob] }))
 | 
						|
  end
 | 
						|
 | 
						|
  def show; end
 | 
						|
 | 
						|
  # Deprecated: This API will be removed in 2.7.0
 | 
						|
  def assignable_agents
 | 
						|
    @assignable_agents = (Current.account.users.where(id: @inbox.members.select(:user_id)) + Current.account.administrators).uniq
 | 
						|
  end
 | 
						|
 | 
						|
  def campaigns
 | 
						|
    @campaigns = @inbox.campaigns
 | 
						|
  end
 | 
						|
 | 
						|
  def avatar
 | 
						|
    @inbox.avatar.attachment.destroy! if @inbox.avatar.attached?
 | 
						|
    head :ok
 | 
						|
  end
 | 
						|
 | 
						|
  def create
 | 
						|
    ActiveRecord::Base.transaction do
 | 
						|
      channel = create_channel
 | 
						|
      @inbox = Current.account.inboxes.build(
 | 
						|
        {
 | 
						|
          name: inbox_name(channel),
 | 
						|
          channel: channel
 | 
						|
        }.merge(
 | 
						|
          permitted_params.except(:channel)
 | 
						|
        )
 | 
						|
      )
 | 
						|
      @inbox.save!
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def update
 | 
						|
    @inbox.update!(permitted_params.except(:channel))
 | 
						|
    update_inbox_working_hours
 | 
						|
    channel_attributes = get_channel_attributes(@inbox.channel_type)
 | 
						|
 | 
						|
    # Inbox update doesn't necessarily need channel attributes
 | 
						|
    return if permitted_params(channel_attributes)[:channel].blank?
 | 
						|
 | 
						|
    if @inbox.inbox_type == 'Email'
 | 
						|
      begin
 | 
						|
        validate_email_channel(channel_attributes)
 | 
						|
      rescue StandardError => e
 | 
						|
        render json: { message: e }, status: :unprocessable_entity and return
 | 
						|
      end
 | 
						|
      @inbox.channel.reauthorized!
 | 
						|
    end
 | 
						|
 | 
						|
    @inbox.channel.update!(permitted_params(channel_attributes)[:channel])
 | 
						|
    update_channel_feature_flags
 | 
						|
  end
 | 
						|
 | 
						|
  def update_inbox_working_hours
 | 
						|
    @inbox.update_working_hours(params.permit(working_hours: Inbox::OFFISABLE_ATTRS)[:working_hours]) if params[:working_hours]
 | 
						|
  end
 | 
						|
 | 
						|
  def agent_bot
 | 
						|
    @agent_bot = @inbox.agent_bot
 | 
						|
  end
 | 
						|
 | 
						|
  def set_agent_bot
 | 
						|
    if @agent_bot
 | 
						|
      agent_bot_inbox = @inbox.agent_bot_inbox || AgentBotInbox.new(inbox: @inbox)
 | 
						|
      agent_bot_inbox.agent_bot = @agent_bot
 | 
						|
      agent_bot_inbox.save!
 | 
						|
    elsif @inbox.agent_bot_inbox.present?
 | 
						|
      @inbox.agent_bot_inbox.destroy!
 | 
						|
    end
 | 
						|
    head :ok
 | 
						|
  end
 | 
						|
 | 
						|
  def destroy
 | 
						|
    @inbox.destroy!
 | 
						|
    head :ok
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  def fetch_inbox
 | 
						|
    @inbox = Current.account.inboxes.find(params[:id])
 | 
						|
    authorize @inbox, :show?
 | 
						|
  end
 | 
						|
 | 
						|
  def fetch_agent_bot
 | 
						|
    @agent_bot = AgentBot.find(params[:agent_bot]) if params[:agent_bot]
 | 
						|
  end
 | 
						|
 | 
						|
  def create_channel
 | 
						|
    return unless %w[web_widget api email line telegram whatsapp sms].include?(permitted_params[:channel][:type])
 | 
						|
 | 
						|
    account_channels_method.create!(permitted_params(channel_type_from_params::EDITABLE_ATTRS)[:channel].except(:type))
 | 
						|
  end
 | 
						|
 | 
						|
  def update_channel_feature_flags
 | 
						|
    return unless @inbox.web_widget?
 | 
						|
    return unless permitted_params(Channel::WebWidget::EDITABLE_ATTRS)[:channel].key? :selected_feature_flags
 | 
						|
 | 
						|
    @inbox.channel.selected_feature_flags = permitted_params(Channel::WebWidget::EDITABLE_ATTRS)[:channel][:selected_feature_flags]
 | 
						|
    @inbox.channel.save!
 | 
						|
  end
 | 
						|
 | 
						|
  def inbox_attributes
 | 
						|
    [:name, :avatar, :greeting_enabled, :greeting_message, :enable_email_collect, :csat_survey_enabled,
 | 
						|
     :enable_auto_assignment, :working_hours_enabled, :out_of_office_message, :timezone, :allow_messages_after_resolved,
 | 
						|
     :lock_to_single_conversation]
 | 
						|
  end
 | 
						|
 | 
						|
  def permitted_params(channel_attributes = [])
 | 
						|
    params.permit(
 | 
						|
      *inbox_attributes,
 | 
						|
      channel: [:type, *channel_attributes]
 | 
						|
    )
 | 
						|
  end
 | 
						|
 | 
						|
  def channel_type_from_params
 | 
						|
    {
 | 
						|
      'web_widget' => Channel::WebWidget,
 | 
						|
      'api' => Channel::Api,
 | 
						|
      'email' => Channel::Email,
 | 
						|
      'line' => Channel::Line,
 | 
						|
      'telegram' => Channel::Telegram,
 | 
						|
      'whatsapp' => Channel::Whatsapp,
 | 
						|
      'sms' => Channel::Sms
 | 
						|
    }[permitted_params[:channel][:type]]
 | 
						|
  end
 | 
						|
 | 
						|
  def get_channel_attributes(channel_type)
 | 
						|
    if channel_type.constantize.const_defined?(:EDITABLE_ATTRS)
 | 
						|
      channel_type.constantize::EDITABLE_ATTRS.presence
 | 
						|
    else
 | 
						|
      []
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
Api::V1::Accounts::InboxesController.prepend_mod_with('Api::V1::Accounts::InboxesController')
 |