diff --git a/internal/app/onboarding/preflight/preflight_effects.go b/internal/app/onboarding/preflight/preflight_effects.go index 56a7810..2d1eccd 100644 --- a/internal/app/onboarding/preflight/preflight_effects.go +++ b/internal/app/onboarding/preflight/preflight_effects.go @@ -6,6 +6,7 @@ import ( tea "charm.land/bubbletea/v2" + iauth "github.com/usetero/cli/internal/auth" "github.com/usetero/cli/internal/core/bootstrap" "github.com/usetero/cli/internal/domain" ) @@ -13,14 +14,18 @@ import ( func (m *Model) checkAuth() tea.Cmd { return func() tea.Msg { hasValidAuth := false + var user *iauth.User if m.auth.IsAuthenticated() { if _, err := m.auth.GetAccessToken(m.ctx); err == nil { hasValidAuth = true + if userID, err := m.auth.GetUserID(m.ctx); err == nil && userID != "" { + user = &iauth.User{ID: userID} + } } else { _ = m.auth.ClearTokens() } } - return preflightAuthCheckCompletedMsg{hasValidAuth: hasValidAuth} + return preflightAuthCheckCompletedMsg{hasValidAuth: hasValidAuth, user: user} } } diff --git a/internal/app/onboarding/preflight/preflight_types.go b/internal/app/onboarding/preflight/preflight_types.go index eef1e87..e0c57e3 100644 --- a/internal/app/onboarding/preflight/preflight_types.go +++ b/internal/app/onboarding/preflight/preflight_types.go @@ -1,6 +1,7 @@ package preflight import ( + "github.com/usetero/cli/internal/auth" "github.com/usetero/cli/internal/core/bootstrap" "github.com/usetero/cli/internal/domain" ) @@ -11,6 +12,7 @@ type preflightResolutionCompletedMsg struct { type preflightAuthCheckCompletedMsg struct { hasValidAuth bool + user *auth.User } type preflightOrganizationsLoadedMsg struct { diff --git a/internal/app/onboarding/preflight/preflight_update.go b/internal/app/onboarding/preflight/preflight_update.go index 9ad688b..b1ac51a 100644 --- a/internal/app/onboarding/preflight/preflight_update.go +++ b/internal/app/onboarding/preflight/preflight_update.go @@ -29,6 +29,7 @@ func (m *Model) Update(msg tea.Msg) tea.Cmd { func (m *Model) handleAuthChecked(msg preflightAuthCheckCompletedMsg) tea.Cmd { m.state.HasValidAuth = msg.hasValidAuth + m.state.User = msg.user if !m.state.HasValidAuth { return m.emitResult() } diff --git a/internal/app/onboarding/transitions_test.go b/internal/app/onboarding/transitions_test.go index 08709ad..857468f 100644 --- a/internal/app/onboarding/transitions_test.go +++ b/internal/app/onboarding/transitions_test.go @@ -99,6 +99,27 @@ func TestHandleTransitionPreflightRouting(t *testing.T) { } } +func TestHandleTransitionPreflightResolvedCarriesUserState(t *testing.T) { + t.Parallel() + + m := newTestModel(t) + user := ptrUser("user-1") + + cmd := m.handleTransition(bootstrap.PreflightResolved{State: bootstrap.PreflightState{ + HasValidAuth: true, + User: user, + Role: bootstrap.RolePlatform, + Org: ptrOrg("org-1"), + Account: ptrAccount("acc-1"), + }}) + if cmd == nil { + t.Fatal("expected command") + } + if m.state.User == nil || m.state.User.ID != user.ID { + t.Fatalf("user state = %+v, want %s", m.state.User, user.ID) + } +} + func TestHandleTransitionDatadogBranchRouting(t *testing.T) { t.Parallel() diff --git a/internal/core/bootstrap/messages.go b/internal/core/bootstrap/messages.go index 4248666..d0ddd39 100644 --- a/internal/core/bootstrap/messages.go +++ b/internal/core/bootstrap/messages.go @@ -86,6 +86,7 @@ type OnboardingComplete struct { type PreflightState struct { Outcome PreflightOutcome HasValidAuth bool + User *auth.User Role string ActiveOrgID domain.OrganizationID DefaultAccountID domain.AccountID diff --git a/internal/core/bootstrap/state.go b/internal/core/bootstrap/state.go index f81e142..4399cc5 100644 --- a/internal/core/bootstrap/state.go +++ b/internal/core/bootstrap/state.go @@ -32,6 +32,9 @@ func ApplyPreflight(state State, resolved PreflightState) (State, Gate) { if resolved.Account != nil { state.Account = resolved.Account } + if resolved.User != nil { + state.User = resolved.User + } return state, next }