feat: APIs to filter reports (#2889)

Fixes #2823
This commit is contained in:
Tejaswini Chile
2021-08-27 22:46:32 +05:30
committed by GitHub
parent f94abaef5f
commit 65f3e83afd
19 changed files with 542 additions and 61 deletions

View File

@@ -32,9 +32,16 @@ class V2::ReportBuilder
private
def scope
return account if params[:type].match?('account')
return inbox if params[:type].match?('inbox')
return user if params[:type].match?('agent')
case params[:type]
when :account
account
when :inbox
inbox
when :agent
user
when :label
label
end
end
def inbox
@@ -45,6 +52,10 @@ class V2::ReportBuilder
@user ||= account.users.where(id: params[:id]).first
end
def label
@label ||= account.labels.where(id: params[:id]).first
end
def conversations_count
scope.conversations
.group_by_day(:created_at, range: range, default_value: 0)

View File

@@ -1,14 +1,14 @@
class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController
before_action :check_authorization
def account
builder = V2::ReportBuilder.new(Current.account, account_report_params)
def index
builder = V2::ReportBuilder.new(Current.account, report_params)
data = builder.build
render json: data
end
def account_summary
render json: account_summary_metrics
def summary
render json: summary_metrics
end
def agents
@@ -23,31 +23,39 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController
render layout: false, template: 'api/v2/accounts/reports/inboxes.csv.erb', format: 'csv'
end
def labels
response.headers['Content-Type'] = 'text/csv'
response.headers['Content-Disposition'] = 'attachment; filename=labels_report.csv'
render layout: false, template: 'api/v2/accounts/reports/labels.csv.erb', format: 'csv'
end
private
def check_authorization
raise Pundit::NotAuthorizedError unless Current.account_user.administrator?
end
def account_summary_params
def summary_params
{
type: :account,
type: params[:type].to_sym,
since: params[:since],
until: params[:until]
until: params[:until],
id: params[:id]
}
end
def account_report_params
def report_params
{
metric: params[:metric],
type: :account,
type: params[:type].to_sym,
since: params[:since],
until: params[:until]
until: params[:until],
id: params[:id]
}
end
def account_summary_metrics
builder = V2::ReportBuilder.new(Current.account, account_summary_params)
def summary_metrics
builder = V2::ReportBuilder.new(Current.account, summary_params)
builder.summary
end
end

View File

@@ -7,14 +7,14 @@ class ReportsAPI extends ApiClient {
}
getAccountReports(metric, since, until) {
return axios.get(`${this.url}/account`, {
params: { metric, since, until },
return axios.get(`${this.url}`, {
params: { metric, since, until, type: 'account' },
});
}
getAccountSummary(since, until) {
return axios.get(`${this.url}/account_summary`, {
params: { since, until },
return axios.get(`${this.url}/summary`, {
params: { since, until, type: 'account' },
});
}

View File

@@ -23,12 +23,13 @@ describe('#Reports API', () => {
1621621800
);
expect(context.axiosMock.get).toHaveBeenCalledWith(
'/api/v2/reports/account',
'/api/v2/reports',
{
params: {
metric: 'conversations_count',
since: 1621103400,
until: 1621621800,
type: 'account'
},
}
);
@@ -37,11 +38,12 @@ describe('#Reports API', () => {
it('#getAccountSummary', () => {
reportsAPI.getAccountSummary(1621103400, 1621621800);
expect(context.axiosMock.get).toHaveBeenCalledWith(
'/api/v2/reports/account_summary',
'/api/v2/reports/summary',
{
params: {
since: 1621103400,
until: 1621621800,
type: 'account'
},
}
);

View File

@@ -28,4 +28,16 @@ class Label < ApplicationRecord
before_validation do
self.title = title.downcase if attribute_present?('title')
end
def conversations
account.conversations.tagged_with(title)
end
def messages
account.messages.where(conversation_id: conversations.pluck(:id))
end
def events
account.events.where(conversation_id: conversations.pluck(:id))
end
end

View File

@@ -0,0 +1,12 @@
<% headers = ['Label Title', 'Conversations count', 'Avg first response time (Minutes)', 'Avg resolution time (Minutes)'] %>
<%= CSV.generate_line headers %>
<% Current.account.labels.each do |label| %>
<% label_report = V2::ReportBuilder.new(Current.account, {
type: :label,
id: label.id,
since: params[:since],
until: params[:until]
}).summary %>
<% row = [ label.title, label_report[:conversations_count], (label_report[:avg_first_response_time]/60).to_i, (label_report[:avg_resolution_time]/60).to_i ] %>
<%= CSV.generate_line row %>
<% end %>