plandex-ai/plandex · error

error getting user: %v

Error message

error getting user: %v

What it means

ValidateAndSignIn wraps a failure from db.GetUser(res.UserId) after a successful sign-in-code redemption. It means the user record backing the redeemed sign-in code could not be loaded from the database (or the store returned an error). The raw DB error is preserved via %v for diagnostics.

Source

Thrown at app/server/handlers/auth_helpers.go:314

	var signInCodeId string
	var signInCodeOrgId string
	var err error

	isLocalMode := (os.Getenv("GOENV") == "development" && os.Getenv("LOCAL_MODE") == "1")

	if req.IsSignInCode {
		res, err := db.ValidateSignInCode(req.Pin)

		if err != nil {
			log.Printf("Error validating sign in code: %v\n", err)
			return nil, fmt.Errorf("error validating sign in code: %v", err)
		}

		user, err = db.GetUser(res.UserId)

		if err != nil {
			log.Printf("Error getting user: %v\n", err)
			return nil, fmt.Errorf("error getting user: %v", err)
		}

		if user == nil {
			log.Printf("User not found for id: %v\n", res.UserId)
			return nil, fmt.Errorf("user not found")
		}

		signInCodeId = res.Id
		signInCodeOrgId = res.OrgId
	} else {
		req.Email = strings.ToLower(req.Email)
		user, err = db.GetUserByEmail(req.Email)

		if err != nil {
			log.Printf("Error getting user: %v\n", err)
			return nil, fmt.Errorf("error getting user: %v", err)
		}

View on GitHub (pinned to e2d772072e)

Solutions

  1. Check the wrapped %v cause for the real DB error (connection refused, timeout, no rows)
  2. Verify DB connectivity/credentials in server config
  3. Confirm the sign-in code's user row exists and was not soft/hard deleted
  4. Inspect db.GetUser logs near this error in server logs for the underlying query failure

Example fix

// before
if err != nil {
	return nil, fmt.Errorf("error getting user: %v", err)
}
// after
if err != nil {
	log.Printf("GetUser failed for id=%v: %v", res.UserId, err)
	return nil, fmt.Errorf("error getting user: %v", err)
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Go has no pre-call validation; check DB health first
if err := db.Ping(); err != nil {
	return fmt.Errorf("database unavailable: %v", err)
}

Type guard

func userExists(id string) bool {
	u, err := db.GetUser(id)
	return err == nil && u != nil
}

Try / catch

user, err := ValidateAndSignIn(w, r, req)
if err != nil {
	if strings.HasPrefix(err.Error(), "error getting user") {
		// transient DB issue: log cause and return 503
		http.Error(w, "database error, try again", http.StatusServiceUnavailable)
		return
	}
	http.Error(w, err.Error(), http.StatusUnauthorized)
}

Prevention

When it happens

Trigger: A client signs in with a sign-in code / codeId+pin flow; ValidateCode succeeds and returns res.UserId, but the subsequent db.GetUser(res.UserId) returns a non-nil error (DB connectivity failure, query timeout, row decode error).

Common situations: Database down or restarted mid-request; stale/corrupt sign-in code pointing at a deleted user row via foreign-key mismatch; connection pool exhaustion under load; migration drift causing GetUser query failures.

Related errors


AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05). Data as JSON: /api/errors/d3893a27c96a3ef3. Report an issue: GitHub.