diff --git a/app/jobs/destroy_job.rb b/app/jobs/destroy_job.rb index 74348555..692585de 100644 --- a/app/jobs/destroy_job.rb +++ b/app/jobs/destroy_job.rb @@ -3,5 +3,7 @@ class DestroyJob < ApplicationJob def perform(model) model.destroy + rescue => e + model.update!(scheduled_for_deletion: false) # Let's the user try again by resetting the state end end diff --git a/app/models/plaid_item.rb b/app/models/plaid_item.rb index 151b261e..25aa3e18 100644 --- a/app/models/plaid_item.rb +++ b/app/models/plaid_item.rb @@ -108,6 +108,15 @@ class PlaidItem < ApplicationRecord private def remove_plaid_item plaid_provider.remove_item(access_token) + rescue Plaid::ApiError => e + json_response = JSON.parse(e.response_body) + + # If the item is not found, that means it was already deleted by the user on their + # Plaid portal OR by Plaid support. Either way, we're not being billed, so continue + # with the deletion of our internal record. + unless json_response["error_code"] == "ITEM_NOT_FOUND" + raise e + end end # Plaid returns mutually exclusive arrays here. If the item has made a request for a product,