Skip to content
Closed
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
6 changes: 5 additions & 1 deletion app/controllers/concerns/idv_step_concern.rb
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,11 @@ def letter_not_recently_enqueued?
end

def flow_policy
@flow_policy ||= Idv::FlowPolicy.new(idv_session: idv_session, user: current_user)
@flow_policy ||= Idv::FlowPolicy.new(
analytics: analytics,
idv_session: idv_session,
user: current_user,
)
end

def confirm_step_allowed
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/address_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ def self.step_info
controller: self,
action: :new,
next_steps: [:verify_info],
preconditions: ->(idv_session:, user:) { idv_session.remote_document_capture_complete? },
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.remote_document_capture_complete?
end,
undo_step: ->(idv_session:, user:) { idv_session.updated_user_address = nil },
)
end
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/agreement_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ def self.step_info
key: :agreement,
controller: self,
next_steps: [:hybrid_handoff, :document_capture, :how_to_verify],
preconditions: ->(idv_session:, user:) { idv_session.welcome_visited },
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.welcome_visited
end,
undo_step: ->(idv_session:, user:) do
idv_session.idv_consent_given_at = nil
idv_session.skip_hybrid_handoff = nil
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/by_mail/request_letter_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def self.step_info
controller: self,
action: :index,
next_steps: [:enter_password],
preconditions: ->(idv_session:, user:) do
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.verify_info_step_complete?
end,
undo_step: ->(idv_session:, user:) { idv_session.address_verification_mechanism = nil },
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/document_capture_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ def self.step_info
key: :document_capture,
controller: self,
next_steps: [:ssn, :ipp_ssn], # :ipp_state_id
preconditions: ->(idv_session:, user:) {
preconditions: ->(idv_session:, user:, analytics:) {
idv_session.flow_path == 'standard' && (
# mobile
idv_session.skip_doc_auth_from_handoff ||
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/enter_password_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def self.step_info
controller: self,
action: :new,
next_steps: [:personal_key],
preconditions: ->(idv_session:, user:) do
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.phone_or_address_step_complete?
end,
undo_step: ->(idv_session:, user:) {},
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/how_to_verify_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def self.step_info
key: :how_to_verify,
controller: self,
next_steps: [:hybrid_handoff, :document_capture],
preconditions: ->(idv_session:, user:) do
preconditions: ->(idv_session:, user:, analytics:) do
self.enabled? &&
idv_session.idv_consent_given? &&
idv_session.service_provider&.in_person_proofing_enabled
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/hybrid_handoff_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def self.step_info
key: :hybrid_handoff,
controller: self,
next_steps: [:link_sent, :document_capture],
preconditions: ->(idv_session:, user:) {
preconditions: ->(idv_session:, user:, analytics:) {
idv_session.idv_consent_given? &&
(self.selected_remote(idv_session: idv_session) || # from opt-in screen
# back from ipp doc capture screen
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/in_person/address_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ def self.step_info
key: :ipp_address,
controller: self,
next_steps: [:ipp_ssn],
preconditions: ->(idv_session:, user:) { idv_session.ipp_state_id_complete? },
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.ipp_state_id_complete?
end,
undo_step: ->(idv_session:, user:) do
flow_session[:pii_from_user][:address1] = nil
flow_session[:pii_from_user][:address2] = nil
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/in_person/ssn_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ def self.step_info
key: :ipp_ssn,
controller: self,
next_steps: [:ipp_verify_info],
preconditions: ->(idv_session:, user:) { idv_session.ipp_document_capture_complete? },
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.ipp_document_capture_complete?
end,
undo_step: ->(idv_session:, user:) { idv_session.ssn = nil },
)
end
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/in_person/state_id_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,9 @@ def self.step_info
key: :ipp_state_id,
controller: self,
next_steps: [:ipp_address, :ipp_ssn],
preconditions: ->(idv_session:, user:) { user.establishing_in_person_enrollment },
preconditions: ->(idv_session:, user:, analytics:) do
user.establishing_in_person_enrollment
end,
undo_step: ->(idv_session:, user:) do
pii_from_user[:identity_doc_address1] = nil
pii_from_user[:identity_doc_address2] = nil
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/in_person/verify_info_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def self.step_info
key: :ipp_verify_info,
controller: self,
next_steps: [:phone],
preconditions: ->(idv_session:, user:) do
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.ssn && idv_session.ipp_document_capture_complete?
end,
undo_step: ->(idv_session:, user:) do
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/link_sent_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ def self.step_info
key: :link_sent,
controller: self,
next_steps: [:ssn],
preconditions: ->(idv_session:, user:) { idv_session.flow_path == 'hybrid' },
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.flow_path == 'hybrid'
end,
undo_step: ->(idv_session:, user:) do
idv_session.pii_from_doc = nil
idv_session.invalidate_in_person_pii_from_user!
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/otp_verification_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ def self.step_info
key: :otp_verification,
controller: self,
next_steps: [:enter_password],
preconditions: ->(idv_session:, user:) { idv_session.phone_otp_sent? },
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.phone_otp_sent?
end,
undo_step: ->(idv_session:, user:) { idv_session.user_phone_confirmation = nil },
)
end
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/personal_key_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def self.step_info
key: :personal_key,
controller: self,
next_steps: [FlowPolicy::FINAL],
preconditions: ->(idv_session:, user:) do
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.phone_or_address_step_complete? &&
user.active_or_pending_profile &&
!idv_session.personal_key_acknowledged
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/phone_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def self.step_info
controller: self,
action: :new,
next_steps: [:otp_verification],
preconditions: ->(idv_session:, user:) do
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.verify_info_step_complete? && !idv_session.verify_by_mail?
end,
undo_step: ->(idv_session:, user:) do
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/phone_errors_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,9 @@ def self.step_info
controller: self,
action: :failure,
next_steps: [FlowPolicy::FINAL],
preconditions: ->(idv_session:, user:) { idv_session.previous_phone_step_params.present? },
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.previous_phone_step_params.present?
end,
undo_step: ->(idv_session:, user:) {},
)
end
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/ssn_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ def self.step_info
key: :ssn,
controller: self,
next_steps: [:verify_info],
preconditions: ->(idv_session:, user:) { idv_session.remote_document_capture_complete? },
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.remote_document_capture_complete?
end,
undo_step: ->(idv_session:, user:) { idv_session.ssn = nil },
)
end
Expand Down
2 changes: 1 addition & 1 deletion app/controllers/idv/verify_info_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def self.step_info
key: :verify_info,
controller: self,
next_steps: [:phone, :request_letter],
preconditions: ->(idv_session:, user:) do
preconditions: ->(idv_session:, user:, analytics:) do
idv_session.ssn && idv_session.remote_document_capture_complete?
end,
undo_step: ->(idv_session:, user:) do
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/idv/welcome_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ def self.step_info
key: :welcome,
controller: self,
next_steps: [:agreement],
preconditions: ->(idv_session:, user:) { !user.gpo_verification_pending_profile? },
preconditions: ->(idv_session:, user:, analytics:) do
!user.gpo_verification_pending_profile?
end,
undo_step: ->(idv_session:, user:) do
idv_session.welcome_visited = nil
idv_session.document_capture_session_uuid = nil
Expand Down
77 changes: 41 additions & 36 deletions app/policies/idv/flow_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,54 @@

module Idv
class FlowPolicy
attr_reader :idv_session, :user
attr_reader :analytics, :idv_session, :user

FINAL = :final

def initialize(idv_session:, user:)
def initialize(analytics:, idv_session:, user:)
@analytics = analytics
@idv_session = idv_session
@user = user
end

def steps
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes to this method:

  1. Made it public (so I could use it in a spec)
  2. Added @steps ||= to the beginning so steps are cached
  3. Added .freeze to the object definition

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what's the purpose of the freeze? was code modifying this sneakily?

@steps ||= {
root: Idv::StepInfo.new(
key: :root,
controller: AccountsController,
next_steps: [:welcome, :request_letter],
preconditions: ->(idv_session:, user:, analytics:) { true },
undo_step: ->(idv_session:, user:) { true },
),
welcome: Idv::WelcomeController.step_info,
agreement: Idv::AgreementController.step_info,
how_to_verify: Idv::HowToVerifyController.step_info,
hybrid_handoff: Idv::HybridHandoffController.step_info,
link_sent: Idv::LinkSentController.step_info,
document_capture: Idv::DocumentCaptureController.step_info,
ipp_address: Idv::InPerson::AddressController.step_info,
ssn: Idv::SsnController.step_info,
ipp_ssn: Idv::InPerson::SsnController.step_info,
verify_info: Idv::VerifyInfoController.step_info,
ipp_verify_info: Idv::InPerson::VerifyInfoController.step_info,
address: Idv::AddressController.step_info,
phone: Idv::PhoneController.step_info,
phone_errors: Idv::PhoneErrorsController.step_info,
otp_verification: Idv::OtpVerificationController.step_info,
request_letter: Idv::ByMail::RequestLetterController.step_info,
enter_password: Idv::EnterPasswordController.step_info,
personal_key: Idv::PersonalKeyController.step_info,
}.freeze
end

def step_allowed?(key:)
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes to this one:

  1. Made public
  2. Added analytics: arg

steps[key].preconditions.call(
analytics: analytics,
idv_session: idv_session,
user: user,
)
end

def controller_allowed?(controller:)
controller_name = controller < ApplicationController ?
StepInfo.full_controller_name(controller) : controller
Expand Down Expand Up @@ -43,40 +82,6 @@ def latest_step(current_step: :root)
current_step
end

def steps
{
root: Idv::StepInfo.new(
key: :root,
controller: AccountsController,
next_steps: [:welcome, :request_letter],
preconditions: ->(idv_session:, user:) { true },
undo_step: ->(idv_session:, user:) { true },
),
welcome: Idv::WelcomeController.step_info,
agreement: Idv::AgreementController.step_info,
how_to_verify: Idv::HowToVerifyController.step_info,
hybrid_handoff: Idv::HybridHandoffController.step_info,
link_sent: Idv::LinkSentController.step_info,
document_capture: Idv::DocumentCaptureController.step_info,
ipp_address: Idv::InPerson::AddressController.step_info,
ssn: Idv::SsnController.step_info,
ipp_ssn: Idv::InPerson::SsnController.step_info,
verify_info: Idv::VerifyInfoController.step_info,
ipp_verify_info: Idv::InPerson::VerifyInfoController.step_info,
address: Idv::AddressController.step_info,
phone: Idv::PhoneController.step_info,
phone_errors: Idv::PhoneErrorsController.step_info,
otp_verification: Idv::OtpVerificationController.step_info,
request_letter: Idv::ByMail::RequestLetterController.step_info,
enter_password: Idv::EnterPasswordController.step_info,
personal_key: Idv::PersonalKeyController.step_info,
}
end

def step_allowed?(key:)
steps[key].preconditions.call(idv_session: idv_session, user: user)
end

def undo_steps_from!(key:)
return if key == FINAL

Expand Down
6 changes: 5 additions & 1 deletion spec/controllers/idv/personal_key_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,11 @@ def assert_personal_key_generated_for_profiles(*profile_pii_pairs)

describe '#preconditions' do
let(:preconditions) do
step_info.preconditions.call(idv_session: idv_session, user: user)
step_info.preconditions.call(
analytics: @analytics,
idv_session: idv_session,
user: user,
)
end

context 'when all conditions met' do
Expand Down
15 changes: 14 additions & 1 deletion spec/policies/idv/flow_policy_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
let(:user_phone_confirmation_session) { nil }
let(:has_gpo_pending_profile) { nil }

subject { Idv::FlowPolicy.new(idv_session: idv_session, user: user) }
let(:analytics) { FakeAnalytics.new }

subject { Idv::FlowPolicy.new(analytics: analytics, idv_session: idv_session, user: user) }

context '#controller_allowed?' do
it 'allows the welcome step' do
Expand Down Expand Up @@ -144,6 +146,17 @@
end
end

context '#step_allowed?' do
it 'passes analytics to preconditions' do
expect(subject.steps[:root].preconditions).to receive(:call).with(
analytics: analytics,
idv_session: anything,
user: anything,
).and_call_original
expect(subject.step_allowed?(key: :root)).to eql(true)
end
end

context 'each step in the flow' do
before do
allow(Idv::PhoneConfirmationSession).to receive(:from_h).
Expand Down