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
- Check the wrapped %v cause for the real DB error (connection refused, timeout, no rows)
- Verify DB connectivity/credentials in server config
- Confirm the sign-in code's user row exists and was not soft/hard deleted
- 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
- Monitor DB connectivity and pool saturation
- Alert on orphaned sign-in codes pointing at deleted users
- Log the wrapped cause alongside the generic message
- Retry transient DB errors with backoff in GetUser callers
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
- user not found
- not found
- error getting org user config: %v
- error getting user
- error validating org membership
AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05).
Data as JSON: /api/errors/d3893a27c96a3ef3.
Report an issue: GitHub.