diff --git a/app/forms/idv/api_image_upload_form.rb b/app/forms/idv/api_image_upload_form.rb index b126d45d8cf..1c1062aeb3c 100644 --- a/app/forms/idv/api_image_upload_form.rb +++ b/app/forms/idv/api_image_upload_form.rb @@ -98,6 +98,7 @@ def validate_pii_from_doc(client_response) def extra_attributes @extra_attributes ||= { + attempts: attempts, remaining_attempts: remaining_attempts, user_id: user_uuid, pii_like_keypaths: [[:pii]], @@ -105,8 +106,11 @@ def extra_attributes end def remaining_attempts - return nil unless document_capture_session - throttle.remaining_count + throttle.remaining_count if document_capture_session + end + + def attempts + throttle.attempts if document_capture_session end def determine_response(form_response:, client_response:, doc_pii_response:) diff --git a/app/jobs/document_proofing_job.rb b/app/jobs/document_proofing_job.rb index fc73df9ad1e..f4fb08a6251 100644 --- a/app/jobs/document_proofing_job.rb +++ b/app/jobs/document_proofing_job.rb @@ -72,7 +72,7 @@ def perform( pii: proofer_result.pii_from_doc, ) - remaining_attempts = Throttle.for(user: user, throttle_type: :idv_doc_auth).remaining_count + throttle = Throttle.for(user: user, throttle_type: :idv_doc_auth) analytics.track_event( Analytics::IDV_DOC_AUTH_SUBMITTED_IMAGE_UPLOAD_VENDOR, @@ -80,7 +80,8 @@ def perform( state: proofer_result.pii_from_doc[:state], state_id_type: proofer_result.pii_from_doc[:state_id_type], async: true, - remaining_attempts: remaining_attempts, + attempts: throttle.attempts, + remaining_attempts: throttle.remaining_count, client_image_metrics: image_metadata, ).merge(analytics_data), ) diff --git a/spec/controllers/idv/image_uploads_controller_spec.rb b/spec/controllers/idv/image_uploads_controller_spec.rb index 8f3bce995eb..3f01e129a33 100644 --- a/spec/controllers/idv/image_uploads_controller_spec.rb +++ b/spec/controllers/idv/image_uploads_controller_spec.rb @@ -48,6 +48,7 @@ front: [:blank], }, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -101,6 +102,7 @@ front: [I18n.t('doc_auth.errors.not_a_file')], }, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -198,6 +200,7 @@ limit: [I18n.t('errors.doc_auth.throttled_heading')], }, user_id: user.uuid, + attempts: IdentityConfig.store.doc_auth_max_attempts, remaining_attempts: 0, pii_like_keypaths: [[:pii]], ) @@ -230,6 +233,7 @@ success: true, errors: {}, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -245,6 +249,7 @@ state: 'MT', state_id_type: 'drivers_license', user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, client_image_metrics: { front: { glare: 99.99 }, @@ -258,6 +263,7 @@ success: true, errors: {}, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -303,6 +309,7 @@ success: true, errors: {}, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -318,6 +325,7 @@ state: 'ND', state_id_type: 'drivers_license', user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, client_image_metrics: { front: { glare: 99.99 }, @@ -336,6 +344,7 @@ pii: [I18n.t('doc_auth.errors.alerts.full_name_check')], }, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -355,6 +364,7 @@ success: true, errors: {}, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -370,6 +380,7 @@ state: 'Maryland', state_id_type: 'drivers_license', user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, client_image_metrics: { front: { glare: 99.99 }, @@ -388,6 +399,7 @@ pii: [I18n.t('doc_auth.errors.general.no_liveness')], }, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -407,6 +419,7 @@ success: true, errors: {}, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -422,6 +435,7 @@ state: 'ND', state_id_type: 'drivers_license', user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, client_image_metrics: { front: { glare: 99.99 }, @@ -440,6 +454,7 @@ pii: [I18n.t('doc_auth.errors.alerts.birth_date_checks')], }, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -483,6 +498,7 @@ success: true, errors: {}, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -494,6 +510,7 @@ front: [I18n.t('doc_auth.errors.general.multiple_front_id_failures')], }, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, state: nil, state_id_type: nil, @@ -535,6 +552,7 @@ success: true, errors: {}, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, pii_like_keypaths: [[:pii]], ) @@ -552,6 +570,7 @@ state_id_type: nil, exception: nil, user_id: user.uuid, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, client_image_metrics: { front: { glare: 99.99 }, diff --git a/spec/forms/idv/api_image_upload_form_spec.rb b/spec/forms/idv/api_image_upload_form_spec.rb index 26e86824ce6..bf4198575a0 100644 --- a/spec/forms/idv/api_image_upload_form_spec.rb +++ b/spec/forms/idv/api_image_upload_form_spec.rb @@ -109,6 +109,7 @@ exception: nil, doc_auth_result: 'Passed', billed: true, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, state: 'MT', state_id_type: 'drivers_license', @@ -149,6 +150,7 @@ exception: nil, doc_auth_result: 'Passed', billed: true, + attempts: 1, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts - 1, user_id: document_capture_session.user.uuid, client_image_metrics: { diff --git a/spec/jobs/document_proofing_job_spec.rb b/spec/jobs/document_proofing_job_spec.rb index 3b3ceac3b91..656413518ca 100644 --- a/spec/jobs/document_proofing_job_spec.rb +++ b/spec/jobs/document_proofing_job_spec.rb @@ -149,6 +149,7 @@ state: 'MT', state_id_type: 'drivers_license', async: true, + attempts: 0, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts, client_image_metrics: { front: front_image_metadata, @@ -202,6 +203,7 @@ state: 'MT', state_id_type: 'drivers_license', async: true, + attempts: 0, remaining_attempts: IdentityConfig.store.doc_auth_max_attempts, face_match_results: { is_match: true, match_score: nil }, selfie_liveness_results: {