From 4a1c912adb61a51dd1367bc111db2d6e06f38184 Mon Sep 17 00:00:00 2001 From: Aaron Nagucki Date: Fri, 29 Nov 2024 13:25:02 -0600 Subject: [PATCH 01/11] changelog: Internal, Reporting, Optimize Query Adjust query and add index --- app/models/profile.rb | 4 ++++ app/services/reporting/agency_and_sp_report.rb | 9 ++++----- ...0947_add_index_to_profiles_on_active_and_idv_level.rb | 7 +++++++ db/schema.rb | 3 ++- 4 files changed, 17 insertions(+), 6 deletions(-) create mode 100644 db/primary_migrate/20241129190947_add_index_to_profiles_on_active_and_idv_level.rb diff --git a/app/models/profile.rb b/app/models/profile.rb index be986e03cf4..983a7da02c8 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -52,6 +52,10 @@ def self.verified where.not(verified_at: nil) end + def self.facial_match + where(idv_level: FACIAL_MATCH_IDV_LEVELS) + end + def self.fraud_rejection where.not(fraud_rejection_at: nil) end diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index 2ab63c8320d..20f22378ea3 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -67,11 +67,10 @@ def service_providers end def facial_match_issuers - @facial_match_issuers ||= Profile.where(active: true).where( - 'verified_at <= ?', - report_date.end_of_day, - ).where(idv_level: Profile::FACIAL_MATCH_IDV_LEVELS). - pluck(:initiating_service_provider_issuer).uniq + @facial_match_issuers ||= Profile.active.verified.facial_match. + where('verified_at <= ?', Time.zone.today.end_of_day). + distinct. + pluck(:initiating_service_provider_issuer) end end end diff --git a/db/primary_migrate/20241129190947_add_index_to_profiles_on_active_and_idv_level.rb b/db/primary_migrate/20241129190947_add_index_to_profiles_on_active_and_idv_level.rb new file mode 100644 index 00000000000..ef471947b3e --- /dev/null +++ b/db/primary_migrate/20241129190947_add_index_to_profiles_on_active_and_idv_level.rb @@ -0,0 +1,7 @@ +class AddIndexToProfilesOnActiveAndIdvLevel < ActiveRecord::Migration[7.2] + disable_ddl_transaction! + + def change + add_index :profiles, %i[active idv_level verified_at], algorithm: :concurrently, name: 'index_profiles_on_active_and_idv_level_and_verified_at' + end +end diff --git a/db/schema.rb b/db/schema.rb index 0c4f93cf8d4..d93dd07dada 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2024_11_15_215510) do +ActiveRecord::Schema[7.2].define(version: 2024_11_29_190947) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "pg_stat_statements" @@ -460,6 +460,7 @@ t.text "encrypted_pii_recovery_multi_region", comment: "sensitive=true" t.datetime "gpo_verification_expired_at", comment: "sensitive=false" t.integer "idv_level", comment: "sensitive=false" + t.index ["active", "idv_level", "verified_at"], name: "index_profiles_on_active_and_idv_level_and_verified_at" t.index ["fraud_pending_reason"], name: "index_profiles_on_fraud_pending_reason" t.index ["fraud_rejection_at"], name: "index_profiles_on_fraud_rejection_at" t.index ["fraud_review_pending_at"], name: "index_profiles_on_fraud_review_pending_at" From 5789a551b53e3dc41b19bfc982d2fc708666fa03 Mon Sep 17 00:00:00 2001 From: Aaron Nagucki Date: Fri, 29 Nov 2024 14:51:12 -0600 Subject: [PATCH 02/11] more optimization --- app/services/reporting/agency_and_sp_report.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index 20f22378ea3..d763e0913a8 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -48,12 +48,12 @@ def agency_and_sp_emailable_report end def active_agencies - @active_agencies ||= Agreements::PartnerAccountStatus.find_by(name: 'active'). - partner_accounts. - includes(:agency). - where('became_partner <= ?', report_date). - map(&:agency). - uniq + @active_agencies ||= Agency.joins(:partner_accounts). + where(partner_accounts: { + partner_account_status: Agreements::PartnerAccountStatus.find_by(name: 'active'), + became_partner: ..report_date, + }). + distinct end def service_providers @@ -68,7 +68,7 @@ def service_providers def facial_match_issuers @facial_match_issuers ||= Profile.active.verified.facial_match. - where('verified_at <= ?', Time.zone.today.end_of_day). + where('verified_at <= ?', report_date.end_of_day). distinct. pluck(:initiating_service_provider_issuer) end From 78789067ba15012bbbf94f2c385a26fa9460d9da Mon Sep 17 00:00:00 2001 From: Aaron Nagucki Date: Mon, 2 Dec 2024 09:55:55 -0600 Subject: [PATCH 03/11] remove index --- ...190947_add_index_to_profiles_on_active_and_idv_level.rb | 7 ------- db/schema.rb | 3 +-- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 db/primary_migrate/20241129190947_add_index_to_profiles_on_active_and_idv_level.rb diff --git a/db/primary_migrate/20241129190947_add_index_to_profiles_on_active_and_idv_level.rb b/db/primary_migrate/20241129190947_add_index_to_profiles_on_active_and_idv_level.rb deleted file mode 100644 index ef471947b3e..00000000000 --- a/db/primary_migrate/20241129190947_add_index_to_profiles_on_active_and_idv_level.rb +++ /dev/null @@ -1,7 +0,0 @@ -class AddIndexToProfilesOnActiveAndIdvLevel < ActiveRecord::Migration[7.2] - disable_ddl_transaction! - - def change - add_index :profiles, %i[active idv_level verified_at], algorithm: :concurrently, name: 'index_profiles_on_active_and_idv_level_and_verified_at' - end -end diff --git a/db/schema.rb b/db/schema.rb index d93dd07dada..0c4f93cf8d4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2024_11_29_190947) do +ActiveRecord::Schema[7.2].define(version: 2024_11_15_215510) do # These are extensions that must be enabled in order to support this database enable_extension "citext" enable_extension "pg_stat_statements" @@ -460,7 +460,6 @@ t.text "encrypted_pii_recovery_multi_region", comment: "sensitive=true" t.datetime "gpo_verification_expired_at", comment: "sensitive=false" t.integer "idv_level", comment: "sensitive=false" - t.index ["active", "idv_level", "verified_at"], name: "index_profiles_on_active_and_idv_level_and_verified_at" t.index ["fraud_pending_reason"], name: "index_profiles_on_fraud_pending_reason" t.index ["fraud_rejection_at"], name: "index_profiles_on_fraud_rejection_at" t.index ["fraud_review_pending_at"], name: "index_profiles_on_fraud_review_pending_at" From 635bde1f9b694b692f13d6ab767b4a7e5cba3aca Mon Sep 17 00:00:00 2001 From: Aaron Date: Mon, 2 Dec 2024 10:47:40 -0600 Subject: [PATCH 04/11] Update app/services/reporting/agency_and_sp_report.rb Co-authored-by: Mitchell Henke --- app/services/reporting/agency_and_sp_report.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index d763e0913a8..731f8095a2d 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -67,10 +67,12 @@ def service_providers end def facial_match_issuers - @facial_match_issuers ||= Profile.active.verified.facial_match. - where('verified_at <= ?', report_date.end_of_day). - distinct. - pluck(:initiating_service_provider_issuer) + @facial_match_issuers ||= Reports::BaseReport.transaction_with_timeout do + Profile.active.verified.facial_match. + where('verified_at <= ?', report_date.end_of_day). + distinct. + pluck(:initiating_service_provider_issuer) + end end end end From be510efd9b02ec31fdba16562102e93eaad604da Mon Sep 17 00:00:00 2001 From: Mitchell Henke Date: Mon, 2 Dec 2024 12:03:32 -0600 Subject: [PATCH 05/11] use sp_return_logs for querying "active" service providers --- app/services/reporting/agency_and_sp_report.rb | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index 731f8095a2d..8308648119c 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -57,13 +57,18 @@ def active_agencies end def service_providers - @service_providers ||= Reports::BaseReport.transaction_with_timeout do - issuers = ServiceProviderIdentity. - where('created_at <= ?', report_date). - distinct. - pluck(:service_provider) - ServiceProvider.where(issuer: issuers).active.external + return @service_providers if defined?(@service_providers) + issuers = ServiceProvider.active.external.pluck(:issuer).filter_map do |issuer| + exists = Reports::BaseReport.transaction_with_timeout do + SpReturnLog.where(billable: true, issuer: issuer).where( + 'returned_at::date <= ?', report_date + ).exists? + end + + issuer if exists end + @service_providers = ServiceProvider.where(issuer: issuers) + @service_providers end def facial_match_issuers From fd049429750744b5dc08100242df394c07964cf9 Mon Sep 17 00:00:00 2001 From: Mitchell Henke Date: Mon, 2 Dec 2024 12:38:48 -0600 Subject: [PATCH 06/11] Update app/services/reporting/agency_and_sp_report.rb Co-authored-by: Zach Margolis --- app/services/reporting/agency_and_sp_report.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index 8308648119c..5509a2b9ce6 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -58,14 +58,12 @@ def active_agencies def service_providers return @service_providers if defined?(@service_providers) - issuers = ServiceProvider.active.external.pluck(:issuer).filter_map do |issuer| - exists = Reports::BaseReport.transaction_with_timeout do + issuers = ServiceProvider.active.external.pluck(:issuer).select do |issuer| + Reports::BaseReport.transaction_with_timeout do SpReturnLog.where(billable: true, issuer: issuer).where( 'returned_at::date <= ?', report_date ).exists? end - - issuer if exists end @service_providers = ServiceProvider.where(issuer: issuers) @service_providers From a19347c5f83d3c97dcc59f59d5f32ee3593ef27a Mon Sep 17 00:00:00 2001 From: Mitchell Henke Date: Mon, 2 Dec 2024 13:08:35 -0600 Subject: [PATCH 07/11] Fix specs --- app/models/service_provider.rb | 8 +++++++- app/services/reporting/agency_and_sp_report.rb | 5 ++--- spec/factories/sp_return_logs.rb | 3 +++ .../reporting/agency_and_sp_report_spec.rb | 16 ++++++++++------ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/models/service_provider.rb b/app/models/service_provider.rb index 8146db65b21..e4b8c53090d 100644 --- a/app/models/service_provider.rb +++ b/app/models/service_provider.rb @@ -8,11 +8,17 @@ class ServiceProvider < ApplicationRecord # rubocop:disable Rails/HasManyOrHasOneDependent # In order to preserve unique user UUIDs, we do not want to destroy Identity records - # when we destroy a ServiceProvider + # when we destroy a ServiceProvider. + # We also do not want to destroy SpReturnLog records because they are used for + # billing. has_many :identities, inverse_of: :service_provider_record, foreign_key: 'service_provider', primary_key: 'issuer', class_name: 'ServiceProviderIdentity' + has_many :sp_return_logs, inverse_of: :service_provider, + foreign_key: 'issuer', + primary_key: 'issuer', + class_name: 'SpReturnLog' # rubocop:enable Rails/HasManyOrHasOneDependent has_many :in_person_enrollments, inverse_of: :service_provider, diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index 5509a2b9ce6..4777d9b2d1e 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -60,9 +60,8 @@ def service_providers return @service_providers if defined?(@service_providers) issuers = ServiceProvider.active.external.pluck(:issuer).select do |issuer| Reports::BaseReport.transaction_with_timeout do - SpReturnLog.where(billable: true, issuer: issuer).where( - 'returned_at::date <= ?', report_date - ).exists? + SpReturnLog.where(billable: true, issuer: issuer). + exists?(['returned_at::date <= ?', report_date]) end end @service_providers = ServiceProvider.where(issuer: issuers) diff --git a/spec/factories/sp_return_logs.rb b/spec/factories/sp_return_logs.rb index 945c6b471c5..62709d05fc2 100644 --- a/spec/factories/sp_return_logs.rb +++ b/spec/factories/sp_return_logs.rb @@ -1,5 +1,8 @@ FactoryBot.define do factory :sp_return_log do request_id { SecureRandom.uuid } + billable { true } + ial { 1 } + requested_at { Time.zone.now } end end diff --git a/spec/services/reporting/agency_and_sp_report_spec.rb b/spec/services/reporting/agency_and_sp_report_spec.rb index 7ed81700074..79bca1919b4 100644 --- a/spec/services/reporting/agency_and_sp_report_spec.rb +++ b/spec/services/reporting/agency_and_sp_report_spec.rb @@ -46,7 +46,7 @@ :external, :active, agency:, - identities: [build(:service_provider_identity)], + sp_return_logs: [build(:sp_return_log, returned_at: report_date)], ) end let(:expected_report) do @@ -65,7 +65,7 @@ end context 'when adding an inactive SP' do - let!(:inactive_sp) { create(:service_provider, :external, agency:, identities: []) } + let!(:inactive_sp) { create(:service_provider, :external, agency:, sp_return_logs: []) } let(:expected_report) do [ header_row, @@ -88,7 +88,7 @@ :external, :active, agency:, - identities: [build(:service_provider_identity)], + sp_return_logs: [build(:sp_return_log, returned_at: report_date)], ) end @@ -121,7 +121,7 @@ :active, :idv, agency:, - identities: [build(:service_provider_identity)], + sp_return_logs: [build(:sp_return_log, returned_at: report_date)], ) # The report gets memoized, so we need to reconstruct it here: @@ -138,7 +138,7 @@ :idv, :active, agency:, - identities: [build(:service_provider_identity)], + sp_return_logs: [build(:sp_return_log, returned_at: report_date)], ) end @@ -149,7 +149,11 @@ :idv, :active, agency:, - identities: [build(:service_provider_identity, service_provider: 'https://facialmatch.com')], + sp_return_logs: [build( + :sp_return_log, + issuer: 'https://facialmatch.com', + returned_at: report_date, + )], ) end From 49038c66a218ef01d4fb63eaaa565eaef3969cbf Mon Sep 17 00:00:00 2001 From: Mitchell Henke Date: Mon, 2 Dec 2024 13:42:44 -0600 Subject: [PATCH 08/11] undo service providers change --- app/models/service_provider.rb | 8 +------- app/services/reporting/agency_and_sp_report.rb | 14 ++++++-------- spec/factories/sp_return_logs.rb | 3 --- .../reporting/agency_and_sp_report_spec.rb | 16 ++++++---------- 4 files changed, 13 insertions(+), 28 deletions(-) diff --git a/app/models/service_provider.rb b/app/models/service_provider.rb index e4b8c53090d..8146db65b21 100644 --- a/app/models/service_provider.rb +++ b/app/models/service_provider.rb @@ -8,17 +8,11 @@ class ServiceProvider < ApplicationRecord # rubocop:disable Rails/HasManyOrHasOneDependent # In order to preserve unique user UUIDs, we do not want to destroy Identity records - # when we destroy a ServiceProvider. - # We also do not want to destroy SpReturnLog records because they are used for - # billing. + # when we destroy a ServiceProvider has_many :identities, inverse_of: :service_provider_record, foreign_key: 'service_provider', primary_key: 'issuer', class_name: 'ServiceProviderIdentity' - has_many :sp_return_logs, inverse_of: :service_provider, - foreign_key: 'issuer', - primary_key: 'issuer', - class_name: 'SpReturnLog' # rubocop:enable Rails/HasManyOrHasOneDependent has_many :in_person_enrollments, inverse_of: :service_provider, diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index 4777d9b2d1e..731f8095a2d 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -57,15 +57,13 @@ def active_agencies end def service_providers - return @service_providers if defined?(@service_providers) - issuers = ServiceProvider.active.external.pluck(:issuer).select do |issuer| - Reports::BaseReport.transaction_with_timeout do - SpReturnLog.where(billable: true, issuer: issuer). - exists?(['returned_at::date <= ?', report_date]) - end + @service_providers ||= Reports::BaseReport.transaction_with_timeout do + issuers = ServiceProviderIdentity. + where('created_at <= ?', report_date). + distinct. + pluck(:service_provider) + ServiceProvider.where(issuer: issuers).active.external end - @service_providers = ServiceProvider.where(issuer: issuers) - @service_providers end def facial_match_issuers diff --git a/spec/factories/sp_return_logs.rb b/spec/factories/sp_return_logs.rb index 62709d05fc2..945c6b471c5 100644 --- a/spec/factories/sp_return_logs.rb +++ b/spec/factories/sp_return_logs.rb @@ -1,8 +1,5 @@ FactoryBot.define do factory :sp_return_log do request_id { SecureRandom.uuid } - billable { true } - ial { 1 } - requested_at { Time.zone.now } end end diff --git a/spec/services/reporting/agency_and_sp_report_spec.rb b/spec/services/reporting/agency_and_sp_report_spec.rb index 79bca1919b4..7ed81700074 100644 --- a/spec/services/reporting/agency_and_sp_report_spec.rb +++ b/spec/services/reporting/agency_and_sp_report_spec.rb @@ -46,7 +46,7 @@ :external, :active, agency:, - sp_return_logs: [build(:sp_return_log, returned_at: report_date)], + identities: [build(:service_provider_identity)], ) end let(:expected_report) do @@ -65,7 +65,7 @@ end context 'when adding an inactive SP' do - let!(:inactive_sp) { create(:service_provider, :external, agency:, sp_return_logs: []) } + let!(:inactive_sp) { create(:service_provider, :external, agency:, identities: []) } let(:expected_report) do [ header_row, @@ -88,7 +88,7 @@ :external, :active, agency:, - sp_return_logs: [build(:sp_return_log, returned_at: report_date)], + identities: [build(:service_provider_identity)], ) end @@ -121,7 +121,7 @@ :active, :idv, agency:, - sp_return_logs: [build(:sp_return_log, returned_at: report_date)], + identities: [build(:service_provider_identity)], ) # The report gets memoized, so we need to reconstruct it here: @@ -138,7 +138,7 @@ :idv, :active, agency:, - sp_return_logs: [build(:sp_return_log, returned_at: report_date)], + identities: [build(:service_provider_identity)], ) end @@ -149,11 +149,7 @@ :idv, :active, agency:, - sp_return_logs: [build( - :sp_return_log, - issuer: 'https://facialmatch.com', - returned_at: report_date, - )], + identities: [build(:service_provider_identity, service_provider: 'https://facialmatch.com')], ) end From df40e9ea14352739a75dd8eda6aaf69e282caa4f Mon Sep 17 00:00:00 2001 From: Aaron Nagucki Date: Mon, 2 Dec 2024 14:27:26 -0600 Subject: [PATCH 09/11] update facial match criteria --- app/models/profile.rb | 7 +++++++ app/services/reporting/agency_and_sp_report.rb | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/models/profile.rb b/app/models/profile.rb index 983a7da02c8..2052eb33eaf 100644 --- a/app/models/profile.rb +++ b/app/models/profile.rb @@ -1,7 +1,10 @@ # frozen_string_literal: true class Profile < ApplicationRecord + # IDV levels equivalent to facial match FACIAL_MATCH_IDV_LEVELS = %w[unsupervised_with_selfie in_person].to_set.freeze + # Facial match through IAL2 opt-in flow + FACIAL_MATCH_OPT_IN = %w[unsupervised_with_selfie].to_set.freeze belongs_to :user # rubocop:disable Rails/InverseOf @@ -56,6 +59,10 @@ def self.facial_match where(idv_level: FACIAL_MATCH_IDV_LEVELS) end + def self.facial_match_opt_in + where(idv_level: FACIAL_MATCH_OPT_IN) + end + def self.fraud_rejection where.not(fraud_rejection_at: nil) end diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index 731f8095a2d..698a2e2ecd1 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -68,7 +68,7 @@ def service_providers def facial_match_issuers @facial_match_issuers ||= Reports::BaseReport.transaction_with_timeout do - Profile.active.verified.facial_match. + Profile.active.verified.facial_match_opt_in. where('verified_at <= ?', report_date.end_of_day). distinct. pluck(:initiating_service_provider_issuer) From 15761e9793fb900b2805b3e502e5f91f360407ef Mon Sep 17 00:00:00 2001 From: Aaron Nagucki Date: Mon, 2 Dec 2024 15:49:14 -0600 Subject: [PATCH 10/11] update the IDV facial match requirements --- .../reporting/total_user_count_report.rb | 24 ++++++++--------- bin/rspec | 27 +++++++++++++++++++ spec/factories/profiles.rb | 2 +- 3 files changed, 39 insertions(+), 14 deletions(-) create mode 100755 bin/rspec diff --git a/app/services/reporting/total_user_count_report.rb b/app/services/reporting/total_user_count_report.rb index 62ac028906d..b521f7a8f97 100644 --- a/app/services/reporting/total_user_count_report.rb +++ b/app/services/reporting/total_user_count_report.rb @@ -83,33 +83,30 @@ def total_user_count def verified_legacy_idv_user_count Reports::BaseReport.transaction_with_timeout do - Profile.where(active: true).where( - 'verified_at <= ?', - end_date, + Profile.active.where( + 'verified_at <= ?', end_date ).count - verified_facial_match_user_count end end def verified_facial_match_user_count @verified_facial_match_user_count ||= Reports::BaseReport.transaction_with_timeout do - Profile.where(active: true).where( - 'verified_at <= ?', - end_date, - ).where(idv_level: Profile::FACIAL_MATCH_IDV_LEVELS).count + Profile.active.facial_match_opt_in.where( + 'verified_at <= ?', end_date + ).count end end def new_verified_legacy_idv_user_count Reports::BaseReport.transaction_with_timeout do - Profile.where(active: true).where(verified_at: current_month).count - + Profile.active.where(verified_at: current_month).count - new_verified_facial_match_user_count end end def new_verified_facial_match_user_count @new_verified_facial_match_user_count ||= Reports::BaseReport.transaction_with_timeout do - Profile.where(active: true).where(verified_at: current_month). - where(idv_level: Profile::FACIAL_MATCH_IDV_LEVELS).count + Profile.active.facial_match_opt_in.where(verified_at: current_month).count end end @@ -121,15 +118,16 @@ def annual_total_user_count def annual_verified_legacy_idv_user_count Reports::BaseReport.transaction_with_timeout do - Profile.where(active: true).where(verified_at: annual_start_date..annual_end_date).count - + Profile.active.where(verified_at: annual_start_date..annual_end_date).count - annual_verified_facial_match_user_count end end def annual_verified_facial_match_user_count @annual_verified_facial_match_user_count ||= Reports::BaseReport.transaction_with_timeout do - Profile.where(active: true).where(verified_at: annual_start_date..annual_end_date). - where(idv_level: Profile::FACIAL_MATCH_IDV_LEVELS).count + Profile.active.facial_match_opt_in.where( + verified_at: annual_start_date..annual_end_date, + ).count end end diff --git a/bin/rspec b/bin/rspec new file mode 100755 index 00000000000..cb53ebe5f00 --- /dev/null +++ b/bin/rspec @@ -0,0 +1,27 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# +# This file was generated by Bundler. +# +# The application 'rspec' is installed as part of a gem, and +# this file is here to facilitate running it. +# + +ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__) + +bundle_binstub = File.expand_path("bundle", __dir__) + +if File.file?(bundle_binstub) + if File.read(bundle_binstub, 300).include?("This file was generated by Bundler") + load(bundle_binstub) + else + abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run. +Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.") + end +end + +require "rubygems" +require "bundler/setup" + +load Gem.bin_path("rspec-core", "rspec") diff --git a/spec/factories/profiles.rb b/spec/factories/profiles.rb index 66eead40d4c..c1483a146d4 100644 --- a/spec/factories/profiles.rb +++ b/spec/factories/profiles.rb @@ -80,7 +80,7 @@ end trait :facial_match_proof do - idv_level { :in_person } + idv_level { :unsupervised_with_selfie } initiating_service_provider_issuer { 'urn:gov:gsa:openidconnect:inactive:sp:test' } end From fee6532af0a27c9c07e583e226f6557d20212476 Mon Sep 17 00:00:00 2001 From: Aaron Nagucki Date: Mon, 2 Dec 2024 16:27:57 -0600 Subject: [PATCH 11/11] Remove redundant scope --- app/services/reporting/agency_and_sp_report.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/reporting/agency_and_sp_report.rb b/app/services/reporting/agency_and_sp_report.rb index 698a2e2ecd1..d58744e3a31 100644 --- a/app/services/reporting/agency_and_sp_report.rb +++ b/app/services/reporting/agency_and_sp_report.rb @@ -68,7 +68,7 @@ def service_providers def facial_match_issuers @facial_match_issuers ||= Reports::BaseReport.transaction_with_timeout do - Profile.active.verified.facial_match_opt_in. + Profile.active.facial_match_opt_in. where('verified_at <= ?', report_date.end_of_day). distinct. pluck(:initiating_service_provider_issuer)