From 629133b56a743c2f2298f46a7fb2c42fd11d9bb9 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 11 Mar 2026 19:21:26 +0530 Subject: [PATCH] refactor: share report timeseries builder --- .../conversations/base_report_builder.rb | 19 +++--------------- .../timeseries/average_report_builder.rb | 9 +-------- .../timeseries/count_report_builder.rb | 9 +-------- .../v2/reports/timeseries/report_builder.rb | 9 +++++++++ .../conversations/metric_builder_spec.rb | 10 ++++------ .../conversations/report_builder_spec.rb | 20 +++++++++---------- 6 files changed, 28 insertions(+), 48 deletions(-) create mode 100644 app/builders/v2/reports/timeseries/report_builder.rb diff --git a/app/builders/v2/reports/conversations/base_report_builder.rb b/app/builders/v2/reports/conversations/base_report_builder.rb index a7961b0d6..57b115945 100644 --- a/app/builders/v2/reports/conversations/base_report_builder.rb +++ b/app/builders/v2/reports/conversations/base_report_builder.rb @@ -3,23 +3,10 @@ class V2::Reports::Conversations::BaseReportBuilder private - AVG_METRICS = %w[avg_first_response_time avg_resolution_time reply_time].freeze - COUNT_METRICS = %w[ - conversations_count - incoming_messages_count - outgoing_messages_count - resolutions_count - bot_resolutions_count - bot_handoffs_count - ].freeze - def builder_class(metric) - case metric - when *AVG_METRICS - V2::Reports::Timeseries::AverageReportBuilder - when *COUNT_METRICS - V2::Reports::Timeseries::CountReportBuilder - end + return unless ReportingEvents::MetricRegistry.supported_metric?(metric) + + V2::Reports::Timeseries::ReportBuilder end def log_invalid_metric diff --git a/app/builders/v2/reports/timeseries/average_report_builder.rb b/app/builders/v2/reports/timeseries/average_report_builder.rb index 945beee78..17a6a2745 100644 --- a/app/builders/v2/reports/timeseries/average_report_builder.rb +++ b/app/builders/v2/reports/timeseries/average_report_builder.rb @@ -1,9 +1,2 @@ -class V2::Reports::Timeseries::AverageReportBuilder < V2::Reports::Timeseries::BaseTimeseriesBuilder - def timeseries - data_source.timeseries - end - - def aggregate_value - data_source.aggregate - end +class V2::Reports::Timeseries::AverageReportBuilder < V2::Reports::Timeseries::ReportBuilder end diff --git a/app/builders/v2/reports/timeseries/count_report_builder.rb b/app/builders/v2/reports/timeseries/count_report_builder.rb index 07e651718..ae9cbd0f9 100644 --- a/app/builders/v2/reports/timeseries/count_report_builder.rb +++ b/app/builders/v2/reports/timeseries/count_report_builder.rb @@ -1,9 +1,2 @@ -class V2::Reports::Timeseries::CountReportBuilder < V2::Reports::Timeseries::BaseTimeseriesBuilder - def timeseries - data_source.timeseries - end - - def aggregate_value - data_source.aggregate - end +class V2::Reports::Timeseries::CountReportBuilder < V2::Reports::Timeseries::ReportBuilder end diff --git a/app/builders/v2/reports/timeseries/report_builder.rb b/app/builders/v2/reports/timeseries/report_builder.rb new file mode 100644 index 000000000..a3e83c78a --- /dev/null +++ b/app/builders/v2/reports/timeseries/report_builder.rb @@ -0,0 +1,9 @@ +class V2::Reports::Timeseries::ReportBuilder < V2::Reports::Timeseries::BaseTimeseriesBuilder + def timeseries + data_source.timeseries + end + + def aggregate_value + data_source.aggregate + end +end diff --git a/spec/builders/v2/reports/conversations/metric_builder_spec.rb b/spec/builders/v2/reports/conversations/metric_builder_spec.rb index 1b0ed7a38..018bd567b 100644 --- a/spec/builders/v2/reports/conversations/metric_builder_spec.rb +++ b/spec/builders/v2/reports/conversations/metric_builder_spec.rb @@ -5,12 +5,10 @@ RSpec.describe V2::Reports::Conversations::MetricBuilder, type: :model do let(:account) { create(:account) } let(:params) { { since: '2023-01-01', until: '2024-01-01' } } - let(:count_builder_instance) { instance_double(V2::Reports::Timeseries::CountReportBuilder, aggregate_value: 42) } - let(:avg_builder_instance) { instance_double(V2::Reports::Timeseries::AverageReportBuilder, aggregate_value: 42) } + let(:builder_instance) { instance_double(V2::Reports::Timeseries::ReportBuilder, aggregate_value: 42) } before do - allow(V2::Reports::Timeseries::CountReportBuilder).to receive(:new).and_return(count_builder_instance) - allow(V2::Reports::Timeseries::AverageReportBuilder).to receive(:new).and_return(avg_builder_instance) + allow(V2::Reports::Timeseries::ReportBuilder).to receive(:new).and_return(builder_instance) end describe '#summary' do @@ -31,8 +29,8 @@ RSpec.describe V2::Reports::Conversations::MetricBuilder, type: :model do it 'creates builders with proper params' do subject.summary - expect(V2::Reports::Timeseries::CountReportBuilder).to have_received(:new).with(account, params.merge(metric: 'conversations_count')) - expect(V2::Reports::Timeseries::AverageReportBuilder).to have_received(:new).with(account, params.merge(metric: 'avg_first_response_time')) + expect(V2::Reports::Timeseries::ReportBuilder).to have_received(:new).with(account, params.merge(metric: 'conversations_count')) + expect(V2::Reports::Timeseries::ReportBuilder).to have_received(:new).with(account, params.merge(metric: 'avg_first_response_time')) end end diff --git a/spec/builders/v2/reports/conversations/report_builder_spec.rb b/spec/builders/v2/reports/conversations/report_builder_spec.rb index db7a0ac45..a2b293461 100644 --- a/spec/builders/v2/reports/conversations/report_builder_spec.rb +++ b/spec/builders/v2/reports/conversations/report_builder_spec.rb @@ -4,19 +4,19 @@ describe V2::Reports::Conversations::ReportBuilder do subject { described_class.new(account, params) } let(:account) { create(:account) } - let(:average_builder) { V2::Reports::Timeseries::AverageReportBuilder } - let(:count_builder) { V2::Reports::Timeseries::CountReportBuilder } + let(:builder) { V2::Reports::Timeseries::ReportBuilder } - shared_examples 'valid metric handler' do |metric, method, builder| + shared_examples 'valid metric handler' do |metric, method| context 'when a valid metric is given' do let(:params) { { metric: metric } } - it "calls the correct #{method} builder for #{metric}" do + it "calls the shared #{method} builder for #{metric}" do builder_instance = instance_double(builder) allow(builder).to receive(:new).and_return(builder_instance) - allow(builder_instance).to receive(method) + allow(builder_instance).to receive(method).and_return(:result) - builder_instance.public_send(method) + expect(subject.public_send(method)).to eq(:result) + expect(builder).to have_received(:new).with(account, params) expect(builder_instance).to have_received(method) end end @@ -33,12 +33,12 @@ describe V2::Reports::Conversations::ReportBuilder do end describe '#timeseries' do - it_behaves_like 'valid metric handler', 'avg_first_response_time', :timeseries, V2::Reports::Timeseries::AverageReportBuilder - it_behaves_like 'valid metric handler', 'conversations_count', :timeseries, V2::Reports::Timeseries::CountReportBuilder + it_behaves_like 'valid metric handler', 'avg_first_response_time', :timeseries + it_behaves_like 'valid metric handler', 'conversations_count', :timeseries end describe '#aggregate_value' do - it_behaves_like 'valid metric handler', 'avg_first_response_time', :aggregate_value, V2::Reports::Timeseries::AverageReportBuilder - it_behaves_like 'valid metric handler', 'conversations_count', :aggregate_value, V2::Reports::Timeseries::CountReportBuilder + it_behaves_like 'valid metric handler', 'avg_first_response_time', :aggregate_value + it_behaves_like 'valid metric handler', 'conversations_count', :aggregate_value end end