From ccd0a5362e061423ad0f6d0ab32a96f48b0830d7 Mon Sep 17 00:00:00 2001 From: John Maxwell Date: Mon, 28 Aug 2023 12:02:44 -0400 Subject: [PATCH 1/5] Put the entry for the gpo reminder job back changelog: Upcoming Features, USPS verification, re-enable reminder job. --- config/initializers/job_configurations.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/initializers/job_configurations.rb b/config/initializers/job_configurations.rb index 8c1d45db7b9..dd049c2f85e 100644 --- a/config/initializers/job_configurations.rb +++ b/config/initializers/job_configurations.rb @@ -188,6 +188,12 @@ cron: cron_24h, args: -> { [Time.zone.today] }, }, + # Send reminder letters for old, outstanding GPO verification codes + send_gpo_code_reminders: { + class: 'GpoReminderJob', + cron: cron_24h, + args: -> { [14.days.ago] }, + }, }.compact end # rubocop:enable Metrics/BlockLength From fa02705f4b6193c58648299108dd53b2bdef95c8 Mon Sep 17 00:00:00 2001 From: John Maxwell Date: Wed, 30 Aug 2023 14:41:11 -0400 Subject: [PATCH 2/5] Wrapped DB query in a transaction with a long timeout --- app/services/gpo_reminder_sender.rb | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/app/services/gpo_reminder_sender.rb b/app/services/gpo_reminder_sender.rb index d07a8d2d263..c97e7f184ab 100644 --- a/app/services/gpo_reminder_sender.rb +++ b/app/services/gpo_reminder_sender.rb @@ -3,12 +3,19 @@ def send_emails(for_letters_sent_before) letter_eligible_range = IdentityConfig.store.usps_confirmation_max_days.days.ago..for_letters_sent_before - profiles_due_for_reminder = Profile.joins(:gpo_confirmation_codes). - where( - gpo_verification_pending_at: letter_eligible_range, - gpo_confirmation_codes: { reminder_sent_at: nil }, - deactivation_reason: [nil, :in_person_verification_pending], - ) + profiles_due_for_reminder = [] + + ActiveRecord::Base.transaction do + quoted_timeout = ActiveRecord::Base.connection.quote(IdentityConfig.store.report_timeout) + ActiveRecord.base.connection.execute("SET_LOCAL statement_timeout = #{quoted_timeout}") + + profiles_due_for_reminder = Profile.joins(:gpo_confirmation_codes). + where( + gpo_verification_pending_at: letter_eligible_range, + gpo_confirmation_codes: { reminder_sent_at: nil }, + deactivation_reason: [nil, :in_person_verification_pending], + ) + end profiles_due_for_reminder.each do |profile| profile.user.send_email_to_all_addresses(:gpo_reminder) From 666a82b8f0e2c3b97fc8269d1466fe4df95a42a1 Mon Sep 17 00:00:00 2001 From: John Maxwell Date: Wed, 30 Aug 2023 14:45:00 -0400 Subject: [PATCH 3/5] Syntax error --- app/services/gpo_reminder_sender.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/gpo_reminder_sender.rb b/app/services/gpo_reminder_sender.rb index c97e7f184ab..a1efc949fac 100644 --- a/app/services/gpo_reminder_sender.rb +++ b/app/services/gpo_reminder_sender.rb @@ -7,7 +7,7 @@ def send_emails(for_letters_sent_before) ActiveRecord::Base.transaction do quoted_timeout = ActiveRecord::Base.connection.quote(IdentityConfig.store.report_timeout) - ActiveRecord.base.connection.execute("SET_LOCAL statement_timeout = #{quoted_timeout}") + ActiveRecord::Base.connection.execute("SET LOCAL statement_timeout = #{quoted_timeout}") profiles_due_for_reminder = Profile.joins(:gpo_confirmation_codes). where( From 7e03bbd5e6a949aae678ceb3dbcd07ba96bf567e Mon Sep 17 00:00:00 2001 From: John Maxwell Date: Wed, 30 Aug 2023 15:11:15 -0400 Subject: [PATCH 4/5] Review comments Moved `profiles_due_for_reminder` out to its own method and set up a constant for the database timeout. --- app/services/gpo_reminder_sender.rb | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/app/services/gpo_reminder_sender.rb b/app/services/gpo_reminder_sender.rb index a1efc949fac..3b862697fc9 100644 --- a/app/services/gpo_reminder_sender.rb +++ b/app/services/gpo_reminder_sender.rb @@ -1,31 +1,34 @@ class GpoReminderSender + LOCAL_DATABASE_TIMEOUT = 1_000_000 + def send_emails(for_letters_sent_before) letter_eligible_range = IdentityConfig.store.usps_confirmation_max_days.days.ago..for_letters_sent_before - profiles_due_for_reminder = [] + profiles_due_for_reminder(letter_eligible_range).each do |profile| + profile.user.send_email_to_all_addresses(:gpo_reminder) + profile.gpo_confirmation_codes.first.update(reminder_sent_at: Time.zone.now) + analytics.idv_gpo_reminder_email_sent(user_id: profile.user.uuid) + end + end + + private + def profiles_due_for_reminder(letter_eligible_range) ActiveRecord::Base.transaction do - quoted_timeout = ActiveRecord::Base.connection.quote(IdentityConfig.store.report_timeout) - ActiveRecord::Base.connection.execute("SET LOCAL statement_timeout = #{quoted_timeout}") + ActiveRecord::Base.connection.execute( + "SET LOCAL statement_timeout = #{LOCAL_DATABASE_TIMEOUT}", + ) - profiles_due_for_reminder = Profile.joins(:gpo_confirmation_codes). + Profile.joins(:gpo_confirmation_codes). where( gpo_verification_pending_at: letter_eligible_range, gpo_confirmation_codes: { reminder_sent_at: nil }, deactivation_reason: [nil, :in_person_verification_pending], ) end - - profiles_due_for_reminder.each do |profile| - profile.user.send_email_to_all_addresses(:gpo_reminder) - profile.gpo_confirmation_codes.first.update(reminder_sent_at: Time.zone.now) - analytics.idv_gpo_reminder_email_sent(user_id: profile.user.uuid) - end end - private - def analytics Analytics.new(user: AnonymousUser.new, request: nil, session: {}, sp: nil) end From f48db1d8a6aed4d021e360ddbd65d77c1bd1c65a Mon Sep 17 00:00:00 2001 From: John Maxwell Date: Fri, 1 Sep 2023 14:38:44 -0400 Subject: [PATCH 5/5] One last review comment. --- app/services/gpo_reminder_sender.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/gpo_reminder_sender.rb b/app/services/gpo_reminder_sender.rb index 3b862697fc9..32dcf07a20d 100644 --- a/app/services/gpo_reminder_sender.rb +++ b/app/services/gpo_reminder_sender.rb @@ -1,5 +1,5 @@ class GpoReminderSender - LOCAL_DATABASE_TIMEOUT = 1_000_000 + LOCAL_DATABASE_TIMEOUT = 60_000 def send_emails(for_letters_sent_before) letter_eligible_range =