Skip to content

Commit

Permalink
Improve Claim Evidence API Error Logging (#23304)
Browse files Browse the repository at this point in the history
* Add CE API Error Handler Class

* Add Error Handling

Update the VBMSService and SensitivityChecker clases to use the
new ClaimEvidenceApiErrorHandler service.

* Add Specs

* Fix Lint Errors and Spec Failures
  • Loading branch information
tradesmanhelix authored and youfoundmanesh committed Oct 25, 2024
1 parent c4b62b1 commit 65ba2ae
Show file tree
Hide file tree
Showing 7 changed files with 416 additions and 28 deletions.
14 changes: 14 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,20 @@ class ApplicationController < ApplicationBaseController
end

rescue_from BGS::SensitivityLevelCheckFailure do |e|
current_user = RequestStore[:current_user]
user_sensitivity_level = if current_user.present?
SensitivityChecker.new(current_user).sensitivity_level_for_user(current_user)
else
"User is not set in the RequestStore"
end

error_details = {
user_css_id: current_user&.css_id || "User is not set in the RequestStore",
user_sensitivity_level: user_sensitivity_level,
error_uuid: SecureRandom.uuid
}
ErrorHandlers::ClaimEvidenceApiErrorHandler.new.handle_error(error: e, error_details: error_details)

render json: {
status: e.message
}, status: :forbidden
Expand Down
31 changes: 31 additions & 0 deletions app/services/error_handlers/claim_evidence_api_error_handler.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# frozen_string_literal: true

class ErrorHandlers::ClaimEvidenceApiErrorHandler
def handle_error(error:, error_details:)
report_error_to_sentry(error: error, error_details: error_details)
end

private

def report_error_to_sentry(error:, error_details:)
Raven.capture_exception(
error,
tags: { feature: "claim_evidence_api" },
extra: {
feature_toggle_enabled_use_ce_api: use_ce_api?,
feature_toggle_enabled_send_current_user_cred_to_ce_api: send_current_user_cred_to_ce_api?,
user_css_id: error_details[:user_css_id],
user_sensitivity_level: error_details[:user_sensitivity_level],
error_uuid: error_details[:error_uuid]
}
)
end

def send_current_user_cred_to_ce_api?
FeatureToggle.enabled?(:send_current_user_cred_to_ce_api)
end

def use_ce_api?
FeatureToggle.enabled?(:use_ce_api)
end
end
86 changes: 62 additions & 24 deletions app/services/external_api/vbms_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ def self.fetch_document_file(document)

if FeatureToggle.enabled?(:use_ce_api)
verify_current_user_veteran_file_number_access(document.file_number)
VeteranFileFetcher.get_document_content(
doc_series_id: document.series_id,
claim_evidence_request: claim_evidence_request
send_claim_evidence_request(
class_name: VeteranFileFetcher,
class_method: :get_document_content,
method_args: { doc_series_id: document.series_id, claim_evidence_request: claim_evidence_request }
)
else
@vbms_client ||= init_vbms_client
Expand All @@ -46,9 +47,10 @@ def self.fetch_documents_for(appeal, _user = nil)
if FeatureToggle.enabled?(:use_ce_api)
verify_current_user_veteran_access(appeal.veteran)

response = VeteranFileFetcher.fetch_veteran_file_list(
veteran_file_number: appeal.veteran_file_number,
claim_evidence_request: claim_evidence_request
response = send_claim_evidence_request(
class_name: VeteranFileFetcher,
class_method: :fetch_veteran_file_list,
method_args: { veteran_file_number: appeal.veteran_file_number, claim_evidence_request: claim_evidence_request }
)
documents = JsonApiResponseAdapter.new.adapt_fetch_document_series_for(response)
{
Expand All @@ -64,9 +66,10 @@ def self.fetch_documents_for(appeal, _user = nil)
def self.fetch_document_series_for(appeal)
if FeatureToggle.enabled?(:use_ce_api)
verify_current_user_veteran_access(appeal.veteran)
response = VeteranFileFetcher.fetch_veteran_file_list(
veteran_file_number: appeal.veteran_file_number,
claim_evidence_request: claim_evidence_request
response = send_claim_evidence_request(
class_name: VeteranFileFetcher,
class_method: :fetch_veteran_file_list,
method_args: { veteran_file_number: appeal.veteran_file_number, claim_evidence_request: claim_evidence_request }
)
JsonApiResponseAdapter.new.adapt_fetch_document_series_for(response)
else
Expand All @@ -90,11 +93,15 @@ def self.upload_document_to_vbms(appeal, uploadable_document)
subject: uploadable_document.document_type,
new_mail: true
)
response = VeteranFileUploader.upload_veteran_file(
file_path: uploadable_document.pdf_location,
claim_evidence_request: claim_evidence_request,
veteran_file_number: appeal.veteran_file_number,
doc_info: file_upload_payload
response = send_claim_evidence_request(
class_name: VeteranFileUploader,
class_method: :upload_veteran_file,
method_args: {
file_path: uploadable_document.pdf_location,
claim_evidence_request: claim_evidence_request,
veteran_file_number: appeal.veteran_file_number,
doc_info: file_upload_payload
}
)
JsonApiResponseAdapter.new.adapt_upload_document(response)
else
Expand All @@ -118,11 +125,15 @@ def self.upload_document_to_vbms_veteran(veteran_file_number, uploadable_documen
new_mail: true
)

response = VeteranFileUploader.upload_veteran_file(
file_path: uploadable_document.pdf_location,
claim_evidence_request: claim_evidence_request,
veteran_file_number: veteran_file_number,
doc_info: file_upload_payload
response = send_claim_evidence_request(
class_name: VeteranFileUploader,
class_method: :upload_veteran_file,
method_args: {
file_path: uploadable_document.pdf_location,
claim_evidence_request: claim_evidence_request,
veteran_file_number: veteran_file_number,
doc_info: file_upload_payload
}
)
JsonApiResponseAdapter.new.adapt_upload_document(response)
else
Expand Down Expand Up @@ -200,11 +211,15 @@ def self.update_document(appeal, uploadable_document)

file_uuid = uploadable_document.document_series_reference_id.delete("{}")

response = VeteranFileUpdater.update_veteran_file(
veteran_file_number: appeal.veteran_file_number,
claim_evidence_request: claim_evidence_request,
file_uuid: file_uuid,
file_update_payload: file_update_payload
response = send_claim_evidence_request(
class_name: VeteranFileUpdater,
class_method: :update_veteran_file,
method_args: {
veteran_file_number: appeal.veteran_file_number,
claim_evidence_request: claim_evidence_request,
file_uuid: file_uuid,
file_update_payload: file_update_payload
}
)
JsonApiResponseAdapter.new.adapt_update_document(response)
else
Expand Down Expand Up @@ -377,4 +392,27 @@ def self.claim_evidence_request
def self.send_user_info?
RequestStore[:current_user].present? && FeatureToggle.enabled?(:send_current_user_cred_to_ce_api)
end

class << self
private

def send_claim_evidence_request(class_name:, class_method:, method_args:)
class_name.public_send(class_method, **method_args)
rescue StandardError => error
current_user = RequestStore[:current_user]
user_sensitivity_level = if current_user.present?
SensitivityChecker.new(current_user).sensitivity_level_for_user(current_user)
else
"User is not set in the RequestStore"
end
error_details = {
user_css_id: current_user&.css_id || "User is not set in the RequestStore",
user_sensitivity_level: user_sensitivity_level,
error_uuid: SecureRandom.uuid
}
ErrorHandlers::ClaimEvidenceApiErrorHandler.new.handle_error(error: error, error_details: error_details)

nil
end
end
end
24 changes: 22 additions & 2 deletions app/services/sensitivity_checker.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,19 @@ def sensitivity_levels_compatible?(user:, veteran:)
bgs_service.sensitivity_level_for_user(user) >=
bgs_service.sensitivity_level_for_veteran(veteran)
rescue StandardError => error
error_uuid = SecureRandom.uuid
Raven.capture_exception(error, extra: { error_uuid: error_uuid })
report_error(error)

false
end

def sensitivity_level_for_user(user)
bgs_service.sensitivity_level_for_user(user)
rescue StandardError => error
report_error(error)

nil
end

private

attr_accessor :current_user
Expand All @@ -29,4 +36,17 @@ def bgs_service

@bgs_service = BGSService.new
end

def error_handler
@error_handler ||= ErrorHandlers::ClaimEvidenceApiErrorHandler.new
end

def report_error(error)
error_details = {
user_css_id: RequestStore[:current_user]&.css_id || "User is not set in RequestStore",
user_sensitivity_level: "Error occurred in SensitivityChecker",
error_uuid: SecureRandom.uuid
}
error_handler.handle_error(error: error, error_details: error_details)
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# frozen_string_literal: true

require "rails_helper"

describe ErrorHandlers::ClaimEvidenceApiErrorHandler do
subject(:described) { described_class.new }

describe "#handle_error" do
let(:mock_sentry_client) { class_double(Raven) }

before do
FeatureToggle.enable!(:use_ce_api)
FeatureToggle.enable!(:send_current_user_cred_to_ce_api)
end

after do
FeatureToggle.disable!(:use_ce_api)
FeatureToggle.disable!(:send_current_user_cred_to_ce_api)
end

it "sends the error to its registered clients" do
error = StandardError.new("Example CE API failure")

expect(Raven).to receive(:capture_exception)
.with(
error,
tags: { feature: "claim_evidence_api" },
extra: {
feature_toggle_enabled_use_ce_api: true,
feature_toggle_enabled_send_current_user_cred_to_ce_api: true,
user_css_id: "USER_12345",
user_sensitivity_level: 4,
error_uuid: "1234-1234-1234"
}
)

error_details = {
user_css_id: "USER_12345",
user_sensitivity_level: 4,
error_uuid: "1234-1234-1234"
}

described.handle_error(error: error, error_details: error_details)
end
end
end
Loading

0 comments on commit 65ba2ae

Please sign in to comment.