fix: send first-time SnapTrade users to connect flow (#1613)

* fix: route unregistered SnapTrade users to connect flow

* test: fix snaptrade controller sign-out helper

* fix: prefer active registered snaptrade items

* test: avoid Current.family outside request cycle

* fix: preserve snaptrade resume flow

* fix: read snaptrade resume session with indifferent keys

---------

Co-authored-by: SureBot <sure-bot@we-promise.com>
This commit is contained in:
Sure Admin (bot)
2026-05-03 10:28:31 +02:00
committed by GitHub
parent a8425a2488
commit e677d382c2
3 changed files with 152 additions and 11 deletions

View File

@@ -132,12 +132,19 @@ class SnaptradeItemsController < ApplicationController
snaptrade_item = Current.family.snaptrade_items.find_by(id: params[:item_id])
if snaptrade_item
# Trigger a sync to fetch the newly connected accounts
snaptrade_item.sync_later unless snaptrade_item.syncing?
# Redirect to accounts page - user can click "accounts need setup" badge
# when sync completes. This avoids the auto-refresh loop issues.
redirect_to accounts_path, notice: t(".success")
stored_return_to, stored_accountable_type = clear_snaptrade_resume_context
return_to = params[:return_to].presence || stored_return_to
accountable_type = params[:accountable_type].presence || stored_accountable_type
if return_to == "setup_accounts"
redirect_to setup_accounts_snaptrade_item_path(snaptrade_item, accountable_type: accountable_type.presence), notice: t(".success")
else
redirect_to accounts_path, notice: t(".success")
end
else
clear_snaptrade_resume_context
redirect_to settings_providers_path, alert: t(".no_item")
end
end
@@ -340,24 +347,35 @@ class SnaptradeItemsController < ApplicationController
# Collection actions for account linking flow
def preload_accounts
snaptrade_item = Current.family.snaptrade_items.first
if snaptrade_item
snaptrade_item = current_snaptrade_item
unless snaptrade_item
redirect_to settings_providers_path, alert: t(".not_configured", default: "SnapTrade is not configured.")
return
end
if snaptrade_item.user_registered?
snaptrade_item.sync_later unless snaptrade_item.syncing?
redirect_to setup_accounts_snaptrade_item_path(snaptrade_item)
else
redirect_to settings_providers_path, alert: t(".not_configured", default: "SnapTrade is not configured.")
redirect_to connect_snaptrade_item_path(snaptrade_item)
end
end
def select_accounts
@accountable_type = params[:accountable_type]
@return_to = params[:return_to]
snaptrade_item = Current.family.snaptrade_items.first
snaptrade_item = current_snaptrade_item
if snaptrade_item
unless snaptrade_item
redirect_to settings_providers_path, alert: t(".not_configured", default: "SnapTrade is not configured.")
return
end
if snaptrade_item.user_registered?
redirect_to setup_accounts_snaptrade_item_path(snaptrade_item, accountable_type: @accountable_type, return_to: @return_to)
else
redirect_to settings_providers_path, alert: t(".not_configured", default: "SnapTrade is not configured.")
store_snaptrade_resume_context(return_to: @return_to, accountable_type: @accountable_type)
redirect_to connect_snaptrade_item_path(snaptrade_item)
end
end
@@ -368,7 +386,7 @@ class SnaptradeItemsController < ApplicationController
def select_existing_account
@account_id = params[:account_id]
@account = Current.family.accounts.find_by(id: @account_id)
snaptrade_item = Current.family.snaptrade_items.first
snaptrade_item = current_snaptrade_item
if snaptrade_item && @account
@snaptrade_accounts = snaptrade_item.snaptrade_accounts
@@ -417,6 +435,26 @@ class SnaptradeItemsController < ApplicationController
@snaptrade_item = Current.family.snaptrade_items.find(params[:id])
end
def current_snaptrade_item
active_items = Current.family.snaptrade_items.active
active_items.syncable.ordered.first ||
active_items.credentials_configured.ordered.first ||
active_items.ordered.first
end
def store_snaptrade_resume_context(return_to:, accountable_type:)
session[:snaptrade_resume] = {
return_to: return_to,
accountable_type: accountable_type
}
end
def clear_snaptrade_resume_context
resume = (session.delete(:snaptrade_resume) || {}).with_indifferent_access
[ resume[:return_to], resume[:accountable_type] ]
end
def snaptrade_item_params
params.require(:snaptrade_item).permit(
:name,