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
49 changes: 49 additions & 0 deletions app/controllers/concerns/idv/verify_by_mail_concern.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# frozen_string_literal: true

module Idv
module VerifyByMailConcern
def gpo_verify_by_mail_policy
@gpo_verify_by_mail_policy ||= Idv::GpoVerifyByMailPolicy.new(current_user)
Comment thread
jmhooper marked this conversation as resolved.
end

def log_letter_requested_analytics(resend:)
analytics.idv_gpo_address_letter_requested(
resend: resend,
first_letter_requested_at: first_letter_requested_at,
hours_since_first_letter: hours_since_first_letter,
phone_step_attempts: phone_step_attempt_count,
**ab_test_analytics_buckets,
)
end

def log_letter_enqueued_analytics(resend:)
analytics.idv_gpo_address_letter_enqueued(
enqueued_at: Time.zone.now,
resend: resend,
phone_step_attempts: phone_step_attempt_count,
first_letter_requested_at: first_letter_requested_at,
hours_since_first_letter: hours_since_first_letter,
**ab_test_analytics_buckets,
)
end

def phone_step_attempt_count
@phone_step_attempt_count ||= RateLimiter.new(
user: current_user,
rate_limit_type: :proof_address,
).attempts
end

def first_letter_requested_at
current_user.gpo_verification_pending_profile&.gpo_verification_pending_at
end

def hours_since_first_letter
if first_letter_requested_at.present?
(Time.zone.now - first_letter_requested_at).to_i.seconds.in_hours.to_i
else
0
end
end
end
end
4 changes: 2 additions & 2 deletions app/controllers/concerns/idv_step_concern.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ module IdvStepConcern
include RateLimitConcern
include FraudReviewConcern
include Idv::AbTestAnalyticsConcern
include Idv::VerifyByMailConcern

included do
before_action :confirm_two_factor_authenticated
Expand Down Expand Up @@ -50,8 +51,7 @@ def check_for_mail_only_outage
end

def redirect_for_mail_only
policy = Idv::GpoVerifyByMailPolicy.new(current_user)
if policy.send_letter_available?
if gpo_verify_by_mail_policy.send_letter_available?
redirect_to idv_mail_only_warning_url
else
redirect_to vendor_outage_url
Expand Down
3 changes: 1 addition & 2 deletions app/controllers/concerns/rate_limit_concern.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ def confirm_not_rate_limited_for_phone_address_verification
private

def confirm_not_rate_limited_for_phone_and_letter_address_verification
gpo_policy = Idv::GpoVerifyByMailPolicy.new(current_user)
if idv_attempter_rate_limited?(:proof_address) && gpo_policy.rate_limited?
if idv_attempter_rate_limited?(:proof_address) && gpo_verify_by_mail_policy.rate_limited?
rate_limit_redirect!(:proof_address)
return true
end
Expand Down
12 changes: 4 additions & 8 deletions app/controllers/idv/by_mail/enter_code_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ class EnterCodeController < ApplicationController
include IdvSessionConcern
include Idv::StepIndicatorConcern
include FraudReviewConcern
include AbTestAnalyticsConcern
include VerifyByMailConcern

prepend_before_action :note_if_user_did_not_receive_letter
before_action :confirm_two_factor_authenticated
Expand All @@ -16,7 +18,7 @@ def index
analytics.idv_verify_by_mail_enter_code_visited(
source: user_did_not_receive_letter? ? 'gpo_reminder_email' : nil,
otp_rate_limited: rate_limiter.limited?,
user_can_request_another_letter: user_can_request_another_letter?,
user_can_request_another_letter: gpo_verify_by_mail_policy.resend_letter_available?,
)

if rate_limiter.limited?
Expand Down Expand Up @@ -63,7 +65,7 @@ def create
private

def render_enter_code_form
@can_request_another_letter = user_can_request_another_letter?
@can_request_another_letter = gpo_verify_by_mail_policy.resend_letter_available?
@user_did_not_receive_letter = user_did_not_receive_letter?
@last_date_letter_was_sent = last_date_letter_was_sent
render :index
Expand Down Expand Up @@ -146,12 +148,6 @@ def user_did_not_receive_letter?
params[:did_not_receive_letter].present?
end

def user_can_request_another_letter?
return @user_can_request_another_letter if defined?(@user_can_request_another_letter)
policy = Idv::GpoVerifyByMailPolicy.new(current_user)
@user_can_request_another_letter = policy.resend_letter_available?
end

def last_date_letter_was_sent
return @last_date_letter_was_sent if defined?(@last_date_letter_was_sent)

Expand Down
43 changes: 5 additions & 38 deletions app/controllers/idv/by_mail/request_letter_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class RequestLetterController < ApplicationController
include IdvStepConcern
skip_before_action :confirm_no_pending_gpo_profile
include Idv::StepIndicatorConcern
include VerifyByMailConcern

before_action :confirm_mail_not_rate_limited
before_action :confirm_step_allowed
Expand Down Expand Up @@ -39,10 +40,6 @@ def create
end
end

def gpo_mail_policy
@gpo_mail_policy ||= Idv::GpoVerifyByMailPolicy.new(current_user)
end

def self.step_info
Idv::StepInfo.new(
key: :request_letter,
Expand All @@ -59,24 +56,14 @@ def self.step_info
private

def confirm_profile_not_too_old
redirect_to idv_path if gpo_mail_policy.profile_too_old?
redirect_to idv_path if gpo_verify_by_mail_policy.profile_too_old?
end

def update_tracking
Funnel::DocAuth::RegisterStep.new(current_user.id, current_sp&.issuer).
call(:usps_letter_sent, :update, true)

analytics.idv_gpo_address_letter_requested(
resend: resend_requested?,
first_letter_requested_at: first_letter_requested_at,
hours_since_first_letter:
hours_since_first_letter(first_letter_requested_at),
phone_step_attempts: RateLimiter.new(
user: current_user,
rate_limit_type: :proof_address,
).attempts,
**ab_test_analytics_buckets,
)
log_letter_requested_analytics(resend: resend_requested?)
create_user_event(:gpo_mail_sent, current_user)

ProofingComponent.find_or_create_by(user: current_user).update(address_check: 'gpo_letter')
Expand All @@ -86,32 +73,12 @@ def resend_requested?
current_user.gpo_verification_pending_profile?
end

def first_letter_requested_at
current_user.gpo_verification_pending_profile&.gpo_verification_pending_at
end

def hours_since_first_letter(first_letter_requested_at)
first_letter_requested_at ?
(Time.zone.now - first_letter_requested_at).to_i.seconds.in_hours.to_i : 0
end

def confirm_mail_not_rate_limited
redirect_to idv_enter_password_url if gpo_mail_policy.rate_limited?
redirect_to idv_enter_password_url if gpo_verify_by_mail_policy.rate_limited?
end

def resend_letter
analytics.idv_gpo_address_letter_enqueued(
enqueued_at: Time.zone.now,
resend: true,
first_letter_requested_at: first_letter_requested_at,
hours_since_first_letter:
hours_since_first_letter(first_letter_requested_at),
phone_step_attempts: RateLimiter.new(
user: current_user,
rate_limit_type: :proof_address,
).attempts,
**ab_test_analytics_buckets,
)
log_letter_enqueued_analytics(resend: true)
confirmation_maker = confirmation_maker_perform
send_reminder
return unless FeatureManagement.reveal_gpo_code?
Expand Down
44 changes: 7 additions & 37 deletions app/controllers/idv/by_mail/resend_letter_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
module Idv
module ByMail
class ResendLetterController < ApplicationController
include Idv::AvailabilityConcern
include AvailabilityConcern
include IdvSessionConcern
include Idv::StepIndicatorConcern
include StepIndicatorConcern
include VerifyByMailConcern
include AbTestAnalyticsConcern

before_action :confirm_two_factor_authenticated
before_action :confirm_verification_needed
Expand All @@ -27,10 +29,6 @@ def create
end
end

def gpo_mail_policy
@gpo_mail_policy ||= Idv::GpoVerifyByMailPolicy.new(current_user)
end

private

def confirm_verification_needed
Expand All @@ -39,50 +37,22 @@ def confirm_verification_needed
end

def confirm_resend_letter_available
unless gpo_mail_policy.resend_letter_available?
unless gpo_verify_by_mail_policy.resend_letter_available?
redirect_to idv_verify_by_mail_enter_code_path
end
end

def update_tracking
analytics.idv_gpo_address_letter_requested(
resend: true,
first_letter_requested_at: first_letter_requested_at,
hours_since_first_letter:
hours_since_first_letter(first_letter_requested_at),
phone_step_attempts: RateLimiter.new(
user: current_user,
rate_limit_type: :proof_address,
).attempts,
)
Comment thread
jmhooper marked this conversation as resolved.
log_letter_requested_analytics(resend: true)
create_user_event(:gpo_mail_sent, current_user)
end

def resend_requested?
current_user.gpo_verification_pending_profile?
end

def first_letter_requested_at
current_user.gpo_verification_pending_profile&.gpo_verification_pending_at
end

def hours_since_first_letter(first_letter_requested_at)
first_letter_requested_at ?
(Time.zone.now - first_letter_requested_at).to_i.seconds.in_hours.to_i : 0
end

def resend_letter
analytics.idv_gpo_address_letter_enqueued(
enqueued_at: Time.zone.now,
resend: true,
first_letter_requested_at: first_letter_requested_at,
hours_since_first_letter:
hours_since_first_letter(first_letter_requested_at),
phone_step_attempts: RateLimiter.new(
user: current_user,
rate_limit_type: :proof_address,
).attempts,
)
log_letter_enqueued_analytics(resend: true)
confirmation_maker = confirmation_maker_perform
send_reminder
return unless FeatureManagement.reveal_gpo_code?
Expand Down
18 changes: 2 additions & 16 deletions app/controllers/idv/enter_password_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class EnterPasswordController < ApplicationController
include Idv::AvailabilityConcern
include IdvStepConcern
include StepIndicatorConcern
include VerifyByMailConcern

before_action :confirm_step_allowed
before_action :confirm_no_profile_yet
Expand Down Expand Up @@ -126,17 +127,7 @@ def init_profile
)
if idv_session.verify_by_mail?
current_user.send_email_to_all_addresses(:verify_by_mail_letter_requested)
analytics.idv_gpo_address_letter_enqueued(
enqueued_at: Time.zone.now,
resend: false,
phone_step_attempts: RateLimiter.new(
user: current_user,
rate_limit_type: :proof_address,
).attempts,
first_letter_requested_at: first_letter_requested_at,
hours_since_first_letter: hours_since_first_letter(first_letter_requested_at),
**ab_test_analytics_buckets,
)
log_letter_enqueued_analytics(resend: false)
end

if idv_session.profile.active?
Expand All @@ -153,11 +144,6 @@ def first_letter_requested_at
idv_session.profile.gpo_verification_pending_at
end

def hours_since_first_letter(first_letter_requested_at)
first_letter_requested_at ?
(Time.zone.now - first_letter_requested_at).to_i.seconds.in_hours.to_i : 0
end

def valid_password?
current_user.valid_password?(password)
end
Expand Down
19 changes: 10 additions & 9 deletions app/controllers/idv/phone_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class PhoneController < ApplicationController
include StepIndicatorConcern
include PhoneOtpRateLimitable
include PhoneOtpSendable
include Idv::VerifyByMailConcern

attr_reader :idv_form

Expand Down Expand Up @@ -35,11 +36,15 @@ def new
analytics.idv_phone_of_record_visited(
**ab_test_analytics_buckets,
)
render :new, locals: { gpo_letter_available: gpo_letter_available }
render(
:new, locals: { gpo_letter_available: gpo_verify_by_mail_policy.send_letter_available? }
)
elsif async_state.missing?
analytics.proofing_address_result_missing
flash.now[:error] = I18n.t('idv.failure.timeout')
render :new, locals: { gpo_letter_available: gpo_letter_available }
render(
:new, locals: { gpo_letter_available: gpo_verify_by_mail_policy.send_letter_available? }
)
end
end

Expand All @@ -56,7 +61,9 @@ def create
redirect_to idv_phone_path
else
flash.now[:error] = result.first_error_message
render :new, locals: { gpo_letter_available: gpo_letter_available }
render(
:new, locals: { gpo_letter_available: gpo_verify_by_mail_policy.send_letter_available? }
)
end
end

Expand Down Expand Up @@ -223,12 +230,6 @@ def formatted_previous_phone_step_params_phone
)
end

def gpo_letter_available
return @gpo_letter_available if defined?(@gpo_letter_available)
policy = Idv::GpoVerifyByMailPolicy.new(current_user)
@gpo_letter_available = policy.send_letter_available?
end

# Migrated from otp_delivery_method_controller
def otp_sent_tracker_error(result)
if send_phone_confirmation_otp_rate_limited?
Expand Down
7 changes: 2 additions & 5 deletions app/controllers/idv/phone_errors_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ class PhoneErrorsController < ApplicationController
include IdvStepConcern
include StepIndicatorConcern
include Idv::AbTestAnalyticsConcern
include Idv::VerifyByMailConcern

before_action :confirm_step_allowed, except: [:failure]
before_action :set_gpo_letter_available
Expand Down Expand Up @@ -71,12 +72,8 @@ def track_event(type:)
analytics.idv_phone_error_visited(**attributes)
end

# rubocop:disable Naming/MemoizedInstanceVariableName
def set_gpo_letter_available
return @gpo_letter_available if defined?(@gpo_letter_available)
policy = Idv::GpoVerifyByMailPolicy.new(current_user)
@gpo_letter_available = policy.send_letter_available?
@gpo_letter_available = gpo_verify_by_mail_policy.send_letter_available?
end
# rubocop:enable Naming/MemoizedInstanceVariableName
end
end
1 change: 1 addition & 0 deletions app/controllers/idv_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class IdvController < ApplicationController
include AccountReactivationConcern
include VerifyProfileConcern
include RateLimitConcern
include Idv::VerifyByMailConcern

before_action :confirm_two_factor_authenticated
before_action :profile_needs_reactivation?, only: [:index]
Expand Down
Loading