mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-24 15:49:39 +02:00
Improve account sync performance, handle concurrent market data syncing (#2236)
* 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
This commit is contained in:
parent
9793cc74f9
commit
10dd9e061a
97 changed files with 1837 additions and 949 deletions
|
@ -26,14 +26,6 @@ class AccountsController < ApplicationController
|
|||
render layout: false
|
||||
end
|
||||
|
||||
def sync_all
|
||||
unless family.syncing?
|
||||
family.sync_later
|
||||
end
|
||||
|
||||
redirect_back_or_to accounts_path
|
||||
end
|
||||
|
||||
private
|
||||
def family
|
||||
Current.family
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
class ApplicationController < ActionController::Base
|
||||
include Onboardable, Localize, AutoSync, Authentication, Invitable, SelfHostable, StoreLocation, Impersonatable, Breadcrumbable, FeatureGuardable, Notifiable
|
||||
include RestoreLayoutPreferences, Onboardable, Localize, AutoSync, Authentication, Invitable,
|
||||
SelfHostable, StoreLocation, Impersonatable, Breadcrumbable,
|
||||
FeatureGuardable, Notifiable
|
||||
|
||||
include Pagy::Backend
|
||||
|
||||
before_action :detect_os
|
||||
|
|
|
@ -46,8 +46,6 @@ module Notifiable
|
|||
[ { partial: "shared/notifications/alert", locals: { message: data } } ]
|
||||
when "cta"
|
||||
[ resolve_cta(data) ]
|
||||
when "loading"
|
||||
[ { partial: "shared/notifications/loading", locals: { message: data } } ]
|
||||
when "notice"
|
||||
messages = Array(data)
|
||||
messages.map { |message| { partial: "shared/notifications/notice", locals: { message: message } } }
|
||||
|
|
24
app/controllers/concerns/restore_layout_preferences.rb
Normal file
24
app/controllers/concerns/restore_layout_preferences.rb
Normal file
|
@ -0,0 +1,24 @@
|
|||
module RestoreLayoutPreferences
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
before_action :restore_active_tabs
|
||||
end
|
||||
|
||||
private
|
||||
def restore_active_tabs
|
||||
last_selected_tab = Current.session&.get_preferred_tab("account_sidebar_tab") || "asset"
|
||||
|
||||
@account_group_tab = account_group_tab_param || last_selected_tab
|
||||
end
|
||||
|
||||
def valid_account_group_tabs
|
||||
%w[asset liability all]
|
||||
end
|
||||
|
||||
def account_group_tab_param
|
||||
param_value = params[:account_sidebar_tab]
|
||||
return nil unless param_value.in?(valid_account_group_tabs)
|
||||
param_value
|
||||
end
|
||||
end
|
22
app/controllers/cookie_sessions_controller.rb
Normal file
22
app/controllers/cookie_sessions_controller.rb
Normal file
|
@ -0,0 +1,22 @@
|
|||
class CookieSessionsController < ApplicationController
|
||||
def update
|
||||
save_kv_to_session(
|
||||
cookie_session_params[:tab_key],
|
||||
cookie_session_params[:tab_value]
|
||||
)
|
||||
|
||||
redirect_back_or_to root_path
|
||||
end
|
||||
|
||||
private
|
||||
def cookie_session_params
|
||||
params.require(:cookie_session).permit(:tab_key, :tab_value)
|
||||
end
|
||||
|
||||
def save_kv_to_session(key, value)
|
||||
raise "Key must be a string" unless key.is_a?(String)
|
||||
raise "Value must be a string" unless value.is_a?(String)
|
||||
|
||||
session["custom_#{key}"] = value
|
||||
end
|
||||
end
|
14
app/controllers/current_sessions_controller.rb
Normal file
14
app/controllers/current_sessions_controller.rb
Normal file
|
@ -0,0 +1,14 @@
|
|||
class CurrentSessionsController < ApplicationController
|
||||
def update
|
||||
if session_params[:tab_key].present? && session_params[:tab_value].present?
|
||||
Current.session.set_preferred_tab(session_params[:tab_key], session_params[:tab_value])
|
||||
end
|
||||
|
||||
head :ok
|
||||
end
|
||||
|
||||
private
|
||||
def session_params
|
||||
params.require(:current_session).permit(:tab_key, :tab_value)
|
||||
end
|
||||
end
|
|
@ -2,8 +2,8 @@ class PlaidItemsController < ApplicationController
|
|||
before_action :set_plaid_item, only: %i[destroy sync]
|
||||
|
||||
def create
|
||||
Current.family.plaid_items.create_from_public_token(
|
||||
plaid_item_params[:public_token],
|
||||
Current.family.create_plaid_item!(
|
||||
public_token: plaid_item_params[:public_token],
|
||||
item_name: item_name,
|
||||
region: plaid_item_params[:region]
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue