1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-24 15:49:39 +02:00
Maybe/app/models/provider/plaid_sandbox.rb
Zach Gollwitzer 03a146222d
Some checks are pending
Publish Docker image / ci (push) Waiting to run
Publish Docker image / Build docker image (push) Blocked by required conditions
Plaid sync domain improvements (#2267)
Breaks our Plaid sync process out into more manageable classes. Notably, this moves the sync process to a distinct, 2-step flow:

1. Import stage - we first make API calls and import Plaid data to "mirror" tables
2. Processing stage - read the raw data, apply business rules, build internal domain models and sync balances

This provides several benefits:

- Plaid syncs can now be "replayed" without fetching API data again
- Mirror tables provide better audit and debugging capabilities
- Eliminates the "all or nothing" sync behavior that is currently in place, which is brittle
2025-05-23 18:58:22 -04:00

41 lines
1.1 KiB
Ruby

class Provider::PlaidSandbox < Provider::Plaid
attr_reader :client
def initialize
@client = create_client
@region = :us
end
def create_public_token(username: nil)
client.sandbox_public_token_create(
Plaid::SandboxPublicTokenCreateRequest.new(
institution_id: "ins_109508", # "First Platypus Bank" (Plaid's sandbox institution that works with all products)
initial_products: [ "transactions", "investments", "liabilities" ],
options: {
override_username: username || "custom_test"
}
)
).public_token
end
def fire_webhook(item, type: "TRANSACTIONS", code: "SYNC_UPDATES_AVAILABLE")
client.sandbox_item_fire_webhook(
Plaid::SandboxItemFireWebhookRequest.new(
access_token: item.access_token,
webhook_type: type,
webhook_code: code,
)
)
end
private
def create_client
raise "Plaid sandbox is not supported in production" if Rails.env.production?
api_client = Plaid::ApiClient.new(
Rails.application.config.plaid
)
Plaid::PlaidApi.new(api_client)
end
end