mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-08-02 20:15:22 +02:00
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
This commit is contained in:
parent
5c82af0e8c
commit
03a146222d
72 changed files with 3763 additions and 706 deletions
|
@ -27,14 +27,23 @@ module Enrichable
|
|||
enrich_attributes({ attr => value }, source:, metadata:)
|
||||
end
|
||||
|
||||
# Enriches all attributes that haven't been locked yet
|
||||
# Enriches and logs all attributes that:
|
||||
# - Are not locked
|
||||
# - Are not ignored
|
||||
# - Have changed value from the last saved value
|
||||
def enrich_attributes(attrs, source:, metadata: {})
|
||||
enrichable_attrs = Array(attrs).reject { |k, _v| locked?(k) }
|
||||
enrichable_attrs = Array(attrs).reject do |attr_key, attr_value|
|
||||
locked?(attr_key) || ignored_enrichable_attributes.include?(attr_key) || self[attr_key.to_s] == attr_value
|
||||
end
|
||||
|
||||
ActiveRecord::Base.transaction do
|
||||
enrichable_attrs.each do |attr, value|
|
||||
self.send("#{attr}=", value)
|
||||
log_enrichment(attribute_name: attr, attribute_value: value, source: source, metadata: metadata)
|
||||
|
||||
# If it's a new record, this isn't technically an "enrichment". No logging necessary.
|
||||
unless self.new_record?
|
||||
log_enrichment(attribute_name: attr, attribute_value: value, source: source, metadata: metadata)
|
||||
end
|
||||
end
|
||||
|
||||
save
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue