mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 02:57:57 +00:00 
			
		
		
		
	 80c87da8c9
			
		
	
	80c87da8c9
	
	
	
		
			
			This PR is part of the larger #10849 implementation and introduces a new Live Reports API to provide real-time conversation metrics. The /live_reports/conversation_metrics endpoint returns account-level or team-level conversation statistics, including open, pending, unattended, and unassigned conversation counts. The /live_reports/grouped_conversation_metrics endpoint accepts a group parameter, either team_id or assignee_id, and returns open and unattended conversation counts based on the specified grouping.
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class Api::V2::Accounts::LiveReportsController < Api::V1::Accounts::BaseController
 | |
|   before_action :load_conversations, only: [:conversation_metrics, :grouped_conversation_metrics]
 | |
|   before_action :set_group_scope, only: [:grouped_conversation_metrics]
 | |
| 
 | |
|   before_action :check_authorization
 | |
| 
 | |
|   def conversation_metrics
 | |
|     render json: {
 | |
|       open: @conversations.open.count,
 | |
|       unattended: @conversations.open.unattended.count,
 | |
|       unassigned: @conversations.open.unassigned.count,
 | |
|       pending: @conversations.pending.count
 | |
|     }
 | |
|   end
 | |
| 
 | |
|   def grouped_conversation_metrics
 | |
|     count_by_group = @conversations.open.group(@group_scope).count
 | |
|     unattended_by_group = @conversations.open.unattended.group(@group_scope).count
 | |
|     unassigned_by_group = @conversations.open.unassigned.group(@group_scope).count
 | |
| 
 | |
|     group_metrics = count_by_group.map do |group_id, count|
 | |
|       metric = {
 | |
|         open: count,
 | |
|         unattended: unattended_by_group[group_id] || 0,
 | |
|         unassigned: unassigned_by_group[group_id] || 0
 | |
|       }
 | |
|       metric[@group_scope] = group_id
 | |
|       metric
 | |
|     end
 | |
| 
 | |
|     render json: group_metrics
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def check_authorization
 | |
|     authorize :report, :view?
 | |
|   end
 | |
| 
 | |
|   def set_group_scope
 | |
|     render json: { error: 'invalid group_by' }, status: :unprocessable_entity and return unless %w[
 | |
|       team_id
 | |
|       assignee_id
 | |
|     ].include?(permitted_params[:group_by])
 | |
| 
 | |
|     @group_scope = permitted_params[:group_by]
 | |
|   end
 | |
| 
 | |
|   def team
 | |
|     return unless permitted_params[:team_id]
 | |
| 
 | |
|     @team ||= Current.account.teams.find(permitted_params[:team_id])
 | |
|   end
 | |
| 
 | |
|   def load_conversations
 | |
|     scope = Current.account.conversations
 | |
|     scope = scope.where(team_id: team.id) if team.present?
 | |
|     @conversations = scope
 | |
|   end
 | |
| 
 | |
|   def permitted_params
 | |
|     params.permit(:team_id, :group_by)
 | |
|   end
 | |
| end
 |