From c5668d78a504296b146f0ea6b18bf6b68a7fb272 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Thu, 21 Mar 2024 10:38:23 +0530 Subject: [PATCH] feat: Add index route --- config/routes.rb | 2 +- .../v1/accounts/applied_slas_controller.rb | 18 +++- .../accounts/applied_slas/index.json.jbuilder | 14 ++++ .../api/v1/models/_sla_event.json.jbuilder | 5 ++ .../accounts/applied_slas_controller_spec.rb | 82 +++++++++++++++++++ 5 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 enterprise/app/views/api/v1/accounts/applied_slas/index.json.jbuilder create mode 100644 enterprise/app/views/api/v1/models/_sla_event.json.jbuilder diff --git a/config/routes.rb b/config/routes.rb index 0ecd27181..6be458e07 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -144,7 +144,7 @@ Rails.application.routes.draw do get :download end end - resources :applied_slas do + resources :applied_slas, only: [:index] do collection do get :metrics end diff --git a/enterprise/app/controllers/api/v1/accounts/applied_slas_controller.rb b/enterprise/app/controllers/api/v1/accounts/applied_slas_controller.rb index ff33a6458..1fb763492 100644 --- a/enterprise/app/controllers/api/v1/accounts/applied_slas_controller.rb +++ b/enterprise/app/controllers/api/v1/accounts/applied_slas_controller.rb @@ -2,9 +2,17 @@ class Api::V1::Accounts::AppliedSlasController < Api::V1::Accounts::EnterpriseAc include Sift include DateRangeHelper - before_action :set_appplied_slas, only: [:metrics] + RESULTS_PER_PAGE = 25 + + before_action :set_appplied_slas, only: [:index, :metrics] + before_action :set_current_page, only: [:index] + before_action :set_current_page_appiled_slas, only: [:index] before_action :check_admin_authorization? + sort_on :created_at, type: :datetime + + def index; end + def metrics @total_applied_slas = @applied_slas.count @number_of_sla_breaches = @applied_slas.missed.count @@ -25,4 +33,12 @@ class Api::V1::Accounts::AppliedSlasController < Api::V1::Accounts::EnterpriseAc def initial_query Current.account.applied_slas.includes(:conversation) end + + def set_current_page_appiled_slas + @applied_slas = @applied_slas.page(@current_page).per(RESULTS_PER_PAGE) + end + + def set_current_page + @current_page = params[:page] || 1 + end end diff --git a/enterprise/app/views/api/v1/accounts/applied_slas/index.json.jbuilder b/enterprise/app/views/api/v1/accounts/applied_slas/index.json.jbuilder new file mode 100644 index 000000000..e9a905d56 --- /dev/null +++ b/enterprise/app/views/api/v1/accounts/applied_slas/index.json.jbuilder @@ -0,0 +1,14 @@ +json.array! @applied_slas do |applied_sla| + json.id applied_sla.id + json.sla_policy_id applied_sla.sla_policy_id + json.conversation_id applied_sla.conversation_id + json.sla_status applied_sla.sla_status + json.created_at applied_sla.created_at + json.updated_at applied_sla.updated_at + json.conversation do + json.partial! 'api/v1/models/conversation', conversation: applied_sla.conversation + end + json.sla_events applied_sla.sla_events do |sla_event| + json.partial! 'api/v1/models/sla_event', formats: [:json], sla_event: sla_event + end +end diff --git a/enterprise/app/views/api/v1/models/_sla_event.json.jbuilder b/enterprise/app/views/api/v1/models/_sla_event.json.jbuilder new file mode 100644 index 000000000..e51defc0a --- /dev/null +++ b/enterprise/app/views/api/v1/models/_sla_event.json.jbuilder @@ -0,0 +1,5 @@ +json.id sla_event.id +json.event_type sla_event.event_type +json.meta sla_event.meta +json.updated_at sla_event.updated_at.to_i +json.created_at sla_event.created_at.to_i diff --git a/spec/enterprise/controllers/api/v1/accounts/applied_slas_controller_spec.rb b/spec/enterprise/controllers/api/v1/accounts/applied_slas_controller_spec.rb index f40842bd6..f39460786 100644 --- a/spec/enterprise/controllers/api/v1/accounts/applied_slas_controller_spec.rb +++ b/spec/enterprise/controllers/api/v1/accounts/applied_slas_controller_spec.rb @@ -97,4 +97,86 @@ RSpec.describe 'Applied SLAs API', type: :request do end end end + + describe 'GET /api/v1/accounts/{account.id}/applied_slas' do + context 'when it is an unauthenticated user' do + it 'returns unauthorized' do + get "/api/v1/accounts/#{account.id}/applied_slas" + expect(response).to have_http_status(:unauthorized) + end + end + + context 'when it is an authenticated user' do + it 'returns the applied slas' do + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation1) + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation2) + get "/api/v1/accounts/#{account.id}/applied_slas", + headers: administrator.create_new_auth_token + expect(response).to have_http_status(:success) + body = JSON.parse(response.body) + + expect(body.size).to eq(2) + expect(body.first).to include('id') + expect(body.first).to include('sla_policy_id' => sla_policy1.id) + expect(body.first).to include('conversation_id' => conversation1.id) + end + + it 'filters applied slas based on a date range' do + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation1, created_at: 10.days.ago) + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation2, created_at: 3.days.ago) + + get "/api/v1/accounts/#{account.id}/applied_slas", + params: { since: 5.days.ago.to_time.to_i.to_s, until: Time.zone.today.to_time.to_i.to_s }, + headers: administrator.create_new_auth_token + expect(response).to have_http_status(:success) + body = JSON.parse(response.body) + + expect(body.size).to eq(1) + end + + it 'filters applied slas based on a date range and agent ids' do + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation1, created_at: 10.days.ago) + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation3, created_at: 3.days.ago) + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation2, created_at: 3.days.ago) + + get "/api/v1/accounts/#{account.id}/applied_slas", + params: { agent_ids: [agent2.id] }, + headers: administrator.create_new_auth_token + expect(response).to have_http_status(:success) + body = JSON.parse(response.body) + + expect(body.size).to eq(3) + end + + it 'filters applied slas based on sla policy ids' do + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation1) + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation2) + create(:applied_sla, sla_policy: sla_policy2, conversation: conversation2) + + get "/api/v1/accounts/#{account.id}/applied_slas", + params: { sla_policy_id: sla_policy1.id }, + headers: administrator.create_new_auth_token + expect(response).to have_http_status(:success) + body = JSON.parse(response.body) + + expect(body.size).to eq(2) + end + + it 'filters applied slas based on labels' do + conversation2.update_labels('label1') + conversation3.update_labels('label1') + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation1, created_at: 10.days.ago) + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation2, created_at: 3.days.ago) + create(:applied_sla, sla_policy: sla_policy1, conversation: conversation3, created_at: 3.days.ago) + + get "/api/v1/accounts/#{account.id}/applied_slas", + params: { label_list: ['label1'] }, + headers: administrator.create_new_auth_token + expect(response).to have_http_status(:success) + body = JSON.parse(response.body) + + expect(body.size).to eq(2) + end + end + end end