From 854a21993ac85a616a10fbd258d2fc537e93c7d4 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Sun, 25 May 2025 11:52:29 -0400 Subject: [PATCH] Handle ITEM_NOT_FOUND errors on Plaid deletions --- app/jobs/destroy_job.rb | 2 ++ app/models/plaid_item.rb | 9 +++++++++ 2 files changed, 11 insertions(+) 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,