Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions app/jobs/reports/sp_issuer_user_counts_report.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
module Reports
class SpIssuerUserCountsReport < BaseReport
REPORT_NAME = 'sp-issuer-user-counts-report'.freeze

def perform(_date)
configs = IdentityConfig.store.sp_issuer_user_counts_report_configs

configs.each do |report_hash|
emails = report_hash['emails']
issuer = report_hash['issuer']

user_counts = Db::Identity::SpUserCounts.with_issuer(issuer)

emails.each do |email|
ReportMailer.sp_issuer_user_counts_report(
name: REPORT_NAME,
email: email,
issuer: issuer,
total: user_counts['total'],
ial1_total: user_counts['ial1_total'],
ial2_total: user_counts['ial2_total'],
).deliver_now
end
end
end
end
end
9 changes: 9 additions & 0 deletions app/mailers/report_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,15 @@ def deleted_user_accounts_report(email:, name:, issuers:, data:)
mail(to: email, subject: t('report_mailer.deleted_accounts_report.subject'))
end

def sp_issuer_user_counts_report(email:, issuer:, total:, ial1_total:, ial2_total:, name:)
@name = name
@issuer = issuer
@total = total
@ial1_total = ial1_total
@ial2_total = ial2_total
mail(to: email, subject: t('report_mailer.sp_issuer_user_counts_report.subject'))
end

def system_demand_report(email:, data:, name:)
@name = name
attachments['system_demand.csv'] = data
Expand Down
15 changes: 15 additions & 0 deletions app/services/db/identity/sp_user_counts.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,21 @@ def self.by_issuer
ActiveRecord::Base.connection.execute(sql).to_a
end

def self.with_issuer(issuer)
sql = <<~SQL
SELECT
count(user_id) AS total,
count(user_id)-count(verified_at) AS ial1_total,
count(verified_at) AS ial2_total
FROM identities
WHERE identities.service_provider = ?
LIMIT 1
SQL

query = ApplicationRecord.sanitize_sql_array([sql, issuer])
ActiveRecord::Base.connection.execute(query).first
end

def self.overall
sql = <<~SQL
SELECT
Expand Down
5 changes: 5 additions & 0 deletions app/views/report_mailer/sp_issuer_user_counts_report.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<%= t('report_mailer.sp_issuer_user_counts_report.name') %>: <%= @name %><br>
<%= t('report_mailer.sp_issuer_user_counts_report.issuer') %>: <%= @issuer %><br>
<%= t('report_mailer.sp_issuer_user_counts_report.total') %>: <%= @total %><br>
<%= t('report_mailer.sp_issuer_user_counts_report.ial1_total') %>: <%= @ial1_total %><br>
<%= t('report_mailer.sp_issuer_user_counts_report.ial2_total') %>: <%= @ial2_total %><br>
1 change: 1 addition & 0 deletions config/application.yml.default
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,7 @@ sp_handoff_bounce_max_seconds: 2
show_user_attribute_deprecation_warnings: false
otp_min_attempts_remaining_warning_count: 3
system_demand_report_email: 'foo@bar.com'
sp_issuer_user_counts_report_configs: '[]'
test_ssn_allowed_list: ''
totp_code_interval: 30
unauthorized_scope_enabled: false
Expand Down
6 changes: 6 additions & 0 deletions config/initializers/job_configurations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@
cron: cron_24h,
args: -> { [Time.zone.today] },
},
# Email user counts for specific issuer
sp_issuer_user_counts: {
class: 'Reports::SpIssuerUserCountsReport',
cron: cron_24h,
args: -> { [Time.zone.today] },
},
# Combined Invoice Supplement Report to S3
combined_invoice_supplement_report: {
class: 'Reports::CombinedInvoiceSupplementReport',
Expand Down
7 changes: 7 additions & 0 deletions config/locales/report_mailer/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ en:
issuers: Issuers
name: Name
subject: Deleted accounts report
sp_issuer_user_counts_report:
ial1_total: IAL1 users
ial2_total: IAL2 users
issuer: Issuer
name: Name
subject: Service provider user count report
total: Total users
system_demand_report:
name: Name
subject: System demand report
7 changes: 7 additions & 0 deletions config/locales/report_mailer/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ es:
issuers: Emisores
name: Nombre
subject: Informe de cuentas eliminadas
sp_issuer_user_counts_report:
ial1_total: IAL1 usuarias
ial2_total: IAL2 usuarias
issuer: Identificación del emisor
name: Nombre
subject: Informe de recuento de usuarios del proveedor de servicios
total: Total de usuarias
system_demand_report:
name: Nombre
subject: Informe de demanda del sistema
7 changes: 7 additions & 0 deletions config/locales/report_mailer/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ fr:
issuers: Émetteurs
name: Nom
subject: Rapport sur les comptes supprimés
sp_issuer_user_counts_report:
ial1_total: IAL1 utilisatrices
ial2_total: IAL2 utilisatrices
issuer: Identifiant de l’émetteur
name: Nom
subject: Rapport sur le nombre d’utilisateurs
total: Nombre total d’utilisateurs
system_demand_report:
name: Nom
subject: Rapport de demande du système
1 change: 1 addition & 0 deletions lib/identity_config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,7 @@ def self.build_store(config_map)
config.add(:session_total_duration_timeout_in_minutes, type: :integer)
config.add(:ses_configuration_set_name, type: :string)
config.add(:set_remember_device_session_expiration, type: :boolean)
config.add(:sp_issuer_user_counts_report_configs, type: :json)
config.add(:show_user_attribute_deprecation_warnings, type: :boolean)
config.add(:skip_encryption_allowed_list, type: :json)
config.add(:sp_handoff_bounce_max_seconds, type: :integer)
Expand Down
31 changes: 31 additions & 0 deletions spec/jobs/reports/sp_issuer_user_counts_report_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
require 'rails_helper'

RSpec.describe Reports::SpIssuerUserCountsReport do
let(:name) { 'sp-issuer-user-counts-report' }
let(:issuer) { 'urn:gov:gsa:openidconnect:sp:sinatra' }
let(:email) { 'foo@bar.com' }
let(:user) { create(:user) }
let(:uuid) { 'foo' }
let(:last_authenticated_at) { '2020-01-02 12:03:04 UTC' }

subject { described_class.new }

it 'sends out a report to the email listed with one total user' do
create(
:service_provider_identity,
service_provider: issuer,
user: user,
uuid: uuid,
last_authenticated_at: last_authenticated_at,
)

allow(IdentityConfig.store).to receive(:sp_issuer_user_counts_report_configs).and_return(
[{ 'issuer' => issuer, 'emails' => [email] }],
)
expect(ReportMailer).to receive(:sp_issuer_user_counts_report).with(
name: name, email: email, ial1_total: 1, ial2_total: 0, issuer: issuer, total: 1,
).and_call_original

subject.perform(Time.zone.today)
end
end