From 735e3622c73fe8faee0cb54a5278064f6af10685 Mon Sep 17 00:00:00 2001 From: sdi Date: Sat, 1 Mar 2025 18:40:23 +0200 Subject: [PATCH 1/3] CustomerAPI: configurable CDR fields --- app/forms/customer_api/cdr_export_form.rb | 23 ++++++++++++++++++- .../api/rest/customer/v1/cdr_resource.rb | 2 +- .../rest/customer/v1/incoming_cdr_resource.rb | 13 +++++++++++ config/initializers/_config.rb | 3 ++- .../rest/customer/v1/cdrs_controller_spec.rb | 4 ++-- .../v1/incoming_cdrs_controller_spec.rb | 16 +++++++++++++ 6 files changed, 56 insertions(+), 5 deletions(-) diff --git a/app/forms/customer_api/cdr_export_form.rb b/app/forms/customer_api/cdr_export_form.rb index c6684f715..526c26659 100644 --- a/app/forms/customer_api/cdr_export_form.rb +++ b/app/forms/customer_api/cdr_export_form.rb @@ -22,10 +22,30 @@ def self.policy_class time_end success duration + src_name_in + src_prefix_in + dst_prefix_in + from_domain + to_domain + ruri_domain + lega_disconnect_code + lega_disconnect_reason + auth_orig_ip + auth_orig_port src_prefix_routing dst_prefix_routing + destination_prefix + destination_initial_interval + destination_next_interval destination_initial_rate destination_next_rate + destination_fee + customer_price + customer_duration + orig_call_id + local_tag + lega_user_agent + diversion_in ].freeze model_class 'CdrExport' @@ -50,7 +70,8 @@ def self.policy_class private def apply_fields - model.fields = FIELDS + hidden_fields = YetiConfig.customer_api_outgoing_cdr_hide_fields || [] + model.fields = FIELDS - hidden_fields end def validate_account diff --git a/app/resources/api/rest/customer/v1/cdr_resource.rb b/app/resources/api/rest/customer/v1/cdr_resource.rb index a9a8251eb..200d4be95 100644 --- a/app/resources/api/rest/customer/v1/cdr_resource.rb +++ b/app/resources/api/rest/customer/v1/cdr_resource.rb @@ -104,7 +104,7 @@ def rec def fetchable_fields fields = super - hidden_fields = YetiConfig.customer_api_cdr_hide_fields || [] + hidden_fields = YetiConfig.customer_api_outgoing_cdr_hide_fields || [] fields - hidden_fields.map(&:to_sym) end diff --git a/app/resources/api/rest/customer/v1/incoming_cdr_resource.rb b/app/resources/api/rest/customer/v1/incoming_cdr_resource.rb index 466e8772c..1b5c512fe 100644 --- a/app/resources/api/rest/customer/v1/incoming_cdr_resource.rb +++ b/app/resources/api/rest/customer/v1/incoming_cdr_resource.rb @@ -83,10 +83,23 @@ def rec _model.has_recording? end + def fetchable_fields + fields = super + hidden_fields = YetiConfig.customer_api_incoming_cdr_hide_fields || [] + fields - hidden_fields.map(&:to_sym) + end + def self.apply_allowed_accounts(records, options) context = options[:context] scope = records.where_vendor(context[:customer_id]) scope = scope.where_vendor_account(context[:allowed_account_ids]) if context[:allowed_account_ids].present? scope end + + def self.apply_default_filter_time_start_gteq(options) + return nil if options.dig(:params, :filter, :time_start_gt).present? + return nil if options.dig(:params, :filter, :time_start_eq).present? + + 24.hours.ago.strftime('%F %T') + end end diff --git a/config/initializers/_config.rb b/config/initializers/_config.rb index 7fae76cbd..b0fc63a93 100644 --- a/config/initializers/_config.rb +++ b/config/initializers/_config.rb @@ -90,7 +90,8 @@ def self.setting_files(config_root, _env) optional(:url_return).maybe(:string) end - optional(:customer_api_cdr_hide_fields).array(:string) + optional(:customer_api_outgoing_cdr_hide_fields).array(:string) + optional(:customer_api_incoming_cdr_hide_fields).array(:string) optional(:invoice).schema do optional(:auto_approve).value(:bool) diff --git a/spec/requests/api/rest/customer/v1/cdrs_controller_spec.rb b/spec/requests/api/rest/customer/v1/cdrs_controller_spec.rb index 1db130d31..2f7f802a8 100644 --- a/spec/requests/api/rest/customer/v1/cdrs_controller_spec.rb +++ b/spec/requests/api/rest/customer/v1/cdrs_controller_spec.rb @@ -397,9 +397,9 @@ ) end - context 'when customer_api_cdr_hide_fields configured' do + context 'when customer_api_outgoing_cdr_hide_fields configured' do before do - allow(YetiConfig).to receive(:customer_api_cdr_hide_fields).and_return( + allow(YetiConfig).to receive(:customer_api_outgoing_cdr_hide_fields).and_return( %w[auth_orig_ip lega_user_agent] ) end diff --git a/spec/requests/api/rest/customer/v1/incoming_cdrs_controller_spec.rb b/spec/requests/api/rest/customer/v1/incoming_cdrs_controller_spec.rb index 2872d12ec..b00591b3f 100644 --- a/spec/requests/api/rest/customer/v1/incoming_cdrs_controller_spec.rb +++ b/spec/requests/api/rest/customer/v1/incoming_cdrs_controller_spec.rb @@ -251,6 +251,22 @@ ) end + context 'when customer_api_incoming_cdr_hide_fields configured' do + before do + allow(YetiConfig).to receive(:customer_api_incoming_cdr_hide_fields).and_return( + %w[diversion_out legb_user_agent] + ) + end + + it 'returns record with expected attributes' do + subject + attribute_keys = response_json[:data][:attributes].keys + expect(attribute_keys).to include(:'src-name-out') + expect(attribute_keys).not_to include(:'diversion-out') + expect(attribute_keys).not_to include(:'legb-user-agent') + end + end + context 'with include account' do let(:json_api_request_query) { { include: 'account' } } From a184b894c37a3853d92771778597e90fa638661d Mon Sep 17 00:00:00 2001 From: sdi Date: Sat, 1 Mar 2025 18:51:56 +0200 Subject: [PATCH 2/3] apply default filter by time_start in incoming_cdr_resource --- app/resources/api/rest/customer/v1/incoming_cdr_resource.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/resources/api/rest/customer/v1/incoming_cdr_resource.rb b/app/resources/api/rest/customer/v1/incoming_cdr_resource.rb index 1b5c512fe..f052c8546 100644 --- a/app/resources/api/rest/customer/v1/incoming_cdr_resource.rb +++ b/app/resources/api/rest/customer/v1/incoming_cdr_resource.rb @@ -42,7 +42,7 @@ def self.default_sort has_one :account, class_name: 'Account', relation_name: :vendor_acc, foreign_key_on: :related ransack_filter :id, type: :number - ransack_filter :time_start, type: :datetime + ransack_filter :time_start, type: :datetime, default: { gteq: :apply_default_filter_time_start_gteq } ransack_filter :time_connect, type: :datetime ransack_filter :time_end, type: :datetime ransack_filter :duration, type: :number From 5d95f29ef113958af24a83512daad325c3497765 Mon Sep 17 00:00:00 2001 From: sdi Date: Sat, 1 Mar 2025 19:23:07 +0200 Subject: [PATCH 3/3] fix tests --- .../api/rest/customer/v1/incoming_cdrs_controller_spec.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spec/requests/api/rest/customer/v1/incoming_cdrs_controller_spec.rb b/spec/requests/api/rest/customer/v1/incoming_cdrs_controller_spec.rb index b00591b3f..6b8811aa7 100644 --- a/spec/requests/api/rest/customer/v1/incoming_cdrs_controller_spec.rb +++ b/spec/requests/api/rest/customer/v1/incoming_cdrs_controller_spec.rb @@ -128,7 +128,12 @@ let(:pk) { :id } it_behaves_like :jsonapi_filters_by_number_field, :id - it_behaves_like :jsonapi_filters_by_datetime_field, :time_start + it_behaves_like :jsonapi_filters_by_datetime_field, :time_start do + # overrides default filter to avoid conflicts with tests + let(:json_api_request_query) do + { filter: { time_start_gteq: 50.days.ago.strftime('%F %T') } } + end + end it_behaves_like :jsonapi_filters_by_datetime_field, :time_connect it_behaves_like :jsonapi_filters_by_datetime_field, :time_end it_behaves_like :jsonapi_filters_by_number_field, :duration