plandex-ai/plandex · error

error getting org member role id: %v

Error message

error getting org member role id: %v

What it means

GetOrgMemberRoleId memoizes the 'member' org_roles id. If the cached global orgMemberRoleId is empty, it calls cacheOrgMemberRoleId; a failure of that DB lookup (missing row, dead connection, query error) is wrapped with this message. AddOrgDomainUsers therefore cannot resolve the role to assign to users.

Source

Thrown at app/server/db/rbac_helpers.go:30

	if orgOwnerRoleId == "" {
		err := cacheOrgOwnerRoleId()
		if err != nil {
			return "", fmt.Errorf("error getting org owner role id: %v", err)
		}
	}

	if orgOwnerRoleId == "" {
		return "", fmt.Errorf("org owner role id is empty")
	}

	return orgOwnerRoleId, nil
}

func GetOrgMemberRoleId() (string, error) {
	if orgMemberRoleId == "" {
		err := cacheOrgMemberRoleId()
		if err != nil {
			return "", fmt.Errorf("error getting org member role id: %v", err)
		}
	}

	if orgMemberRoleId == "" {
		return "", fmt.Errorf("org member role id is empty")
	}

	return orgMemberRoleId, nil
}

func GetOrgOwners(orgId string) ([]*User, error) {
	var users []*User
	err := Conn.Select(&users, "SELECT * FROM users WHERE id IN (SELECT user_id FROM orgs_users WHERE org_id = $1 AND org_role_id = $2)", orgId, orgOwnerRoleId)

	if err != nil {
		return nil, fmt.Errorf("error getting org owners: %v", err)
	}

View on GitHub (pinned to e2d772072e)

Solutions

  1. Ensure seed data inserts the 'member' row into org_roles
  2. Run CacheOrgRoleIds()/MustInitDb at startup so failures surface early
  3. Verify connectivity: SELECT id FROM org_roles WHERE name = 'member';
  4. Read the wrapped inner error to distinguish sql.ErrNoRows from connection failures

Example fix

// before
memberRoleId, err := GetOrgMemberRoleId()
if err != nil { return err }
// after
if err := CacheOrgRoleIds(); err != nil {
	return fmt.Errorf("role cache unavailable: %w", err)
}
memberRoleId, err := GetOrgMemberRoleId()
Defensive patterns

Strategy: try-catch

Validate before calling

// before AddOrgDomainUsers
var n int
db.QueryRow("SELECT count(*) FROM org_roles WHERE name = 'member'").Scan(&n)
if n == 0 {
	return fmt.Errorf("org_roles 'member' row missing; run seed migrations")
}

Type guard

func hasMemberRole(ctx context.Context, db *sql.DB) bool {
	var n int
	if err := db.QueryRowContext(ctx, "SELECT count(*) FROM org_roles WHERE name = 'member'").Scan(&n); err != nil {
		return false
	}
	return n > 0
}

Try / catch

memberRoleId, err := GetOrgMemberRoleId()
if err != nil {
	if errors.Is(err, sql.ErrNoRows) || strings.Contains(err.Error(), "no rows") {
		return fmt.Errorf("seed data missing: %w", err)
	}
	return fmt.Errorf("database unavailable: %w", err)
}

Prevention

When it happens

Trigger: Calling AddOrgDomainUsers when the org_roles table lacks a 'member' row, the database is unreachable, or Conn is nil/not initialized.

Common situations: Database seeded with only some roles; migration partially applied; environment pointing at wrong database; DB restarted and connections dropped.

Related errors


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