{"record":{"id":"e7719d8aeb4bbba5","repo":"plandex-ai/plandex","slug":"error-getting-org-member-role-id-v","errorCode":null,"errorMessage":"error getting org member role id: %v","messagePattern":"error getting org member role id: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/server/db/org_helpers.go","lineNumber":156,"sourceCode":"\t\t}\n\n\t\treturn nil, fmt.Errorf(\"error getting org for domain: %v\", err)\n\t}\n\n\treturn &org, nil\n}\n\nfunc AddOrgDomainUsers(orgId, domain string, tx *sqlx.Tx) error {\n\tusersForDomain, err := GetUsersForDomain(domain)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error getting users for domain: %v\", err)\n\t}\n\n\torgMemberRoleId, err := GetOrgMemberRoleId()\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error getting org member role id: %v\", err)\n\t}\n\n\tif len(usersForDomain) > 0 {\n\t\t// create org users for each user\n\t\tvar valueStrings []string\n\t\tvar valueArgs []interface{}\n\t\tfor i, user := range usersForDomain {\n\t\t\tnum := i * 3\n\t\t\tvalueStrings = append(valueStrings, fmt.Sprintf(\"($%d, $%d, $%d)\", num+1, num+2, num+3))\n\t\t\tvalueArgs = append(valueArgs, orgId, user.Id, orgMemberRoleId)\n\t\t}\n\n\t\t// Join all value strings and execute a single query\n\t\tstmt := fmt.Sprintf(\"INSERT INTO orgs_users (org_id, user_id, org_role_id) VALUES %s ON CONFLICT ON CONSTRAINT org_user_unique DO NOTHING\", strings.Join(valueStrings, \",\"))\n\t\t_, err = tx.Exec(stmt, valueArgs...)\n\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"error adding org users: %v\", err)","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/db/org_helpers.go#L138-L174","documentation":"AddOrgDomainUsers wraps a failure from GetOrgMemberRoleId() into 'error getting org member role id: %v'. The member role seed row could not be fetched, blocking creation of org_users rows for domain users.","triggerScenarios":"GetOrgMemberRoleId returns an error — typically sql.ErrNoRows because the member role row is absent from the roles table, or a connection/table error.","commonSituations":"Fresh or partially migrated database lacking role seed rows; a migration renamed or removed the default member role; DB connectivity blip.","solutions":["Run the role-seed migrations to restore the org member role row","Verify with a direct query that the member role exists in the roles table","At startup, assert GetOrgMemberRoleId succeeds and fail fast with a clear message if not","Retry the domain-add flow after reseeding"],"exampleFix":"// before\norgMemberRoleId, err := db.GetOrgMemberRoleId()\nif err != nil { return err }\n// after (startup check)\nif _, err := db.GetOrgMemberRoleId(); err != nil {\n    log.Fatalf(\"org member role missing — apply seed migrations: %v\", err)\n}","handlingStrategy":"retry","validationCode":"// Startup guard\nif _, err := db.GetOrgMemberRoleId(); err != nil {\n    log.Fatalf(\"org member role seed missing: %v\", err)\n}","typeGuard":null,"tryCatchPattern":"err := db.AddOrgDomainUsers(orgId, domain, tx)\nif err != nil && strings.Contains(err.Error(), \"member role id\") {\n    return fmt.Errorf(\"server misconfiguration: run role seed migrations\")\n}","preventionTips":["Seed role rows in every environment (dev/staging/prod)","Fail fast at boot when role lookups fail","Track seeds in migrations, not manual SQL","Add a smoke test that creates an org and adds a domain user"],"tags":["database","missing-seed-data","roles"],"backgroundTag":"missing-seed-data","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}