mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-18 20:59:39 +02:00
* PlaidConnectable concern * Remove bad abstraction * Put sync implementations in own concerns * Sync strategies * Move sync orchestration to Sync class * Clean up sync class, add state machine * Basic market data sync cron * Fix price sync * Improve sync window column names, add timestamps * 30 day syncs by default * Clean up market data methods * Report high duplicate sync counts to Sentry * Add sync states throughout app * account tab session * Persistent account tab selections * Remove manual sleep * Add migration to clear stale syncs on self hosted apps * Tweak sync states * Sync completion event broadcasts * Fix timezones in tests * Cleanup * More cleanup * Plaid item UI broadcasts for sync * Fix account ID namespace conflict * Sync broadcasters * Smoother account sync refreshes * Remove test sync delay
57 lines
1.3 KiB
Ruby
57 lines
1.3 KiB
Ruby
class Provider
|
|
Response = Data.define(:success?, :data, :error)
|
|
|
|
class Error < StandardError
|
|
attr_reader :details
|
|
|
|
def initialize(message, details: nil)
|
|
super(message)
|
|
@details = details
|
|
end
|
|
|
|
def as_json
|
|
{
|
|
message: message,
|
|
details: details
|
|
}
|
|
end
|
|
end
|
|
|
|
private
|
|
PaginatedData = Data.define(:paginated, :first_page, :total_pages)
|
|
UsageData = Data.define(:used, :limit, :utilization, :plan)
|
|
|
|
def with_provider_response(error_transformer: nil, &block)
|
|
data = yield
|
|
|
|
Response.new(
|
|
success?: true,
|
|
data: data,
|
|
error: nil,
|
|
)
|
|
rescue => error
|
|
transformed_error = if error_transformer
|
|
error_transformer.call(error)
|
|
else
|
|
default_error_transformer(error)
|
|
end
|
|
|
|
Response.new(
|
|
success?: false,
|
|
data: nil,
|
|
error: transformed_error
|
|
)
|
|
end
|
|
|
|
# Override to set class-level error transformation for methods using `with_provider_response`
|
|
def default_error_transformer(error)
|
|
if error.is_a?(Faraday::Error)
|
|
self.class::Error.new(
|
|
error.message,
|
|
details: error.response&.dig(:body),
|
|
)
|
|
else
|
|
self.class::Error.new(error.message)
|
|
end
|
|
end
|
|
end
|