{"record":{"id":"7b337da90b0b4e67","repo":"plandex-ai/plandex","slug":"error-adding-org-users-v","errorCode":null,"errorMessage":"error adding org users: %v","messagePattern":"error adding org users: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"app/server/db/org_helpers.go","lineNumber":174,"sourceCode":"\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)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc DeleteOrgUser(orgId, userId string, tx *sqlx.Tx) error {\n\tlog.Printf(\"Deleting org user, org: %s | user: %s\\n\", orgId, userId)\n\n\t_, err := tx.Exec(\"DELETE FROM orgs_users WHERE org_id = $1 AND user_id = $2\", orgId, userId)\n\n\tif err != nil {\n\t\treturn fmt.Errorf(\"error deleting org member: %v\", err)\n\t}\n\n\treturn nil\n}\n","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/db/org_helpers.go#L156-L192","documentation":"AddOrgDomainUsers wraps a failure of the bulk INSERT into orgs_users (with ON CONFLICT DO NOTHING) into 'error adding org users: %v'. Even though duplicates are skipped via the org_user_unique constraint, other insert failures still bubble up here.","triggerScenarios":"The multi-row INSERT fails: FK violation (23503) because a user id or org_role_id doesn't exist, parameter-count mismatch in the generated $n placeholders, connection drop, or a very large user list exceeding Postgres parameter limits (65535).","commonSituations":"Domains with thousands of users producing more than 65535 bind parameters; role id stale after role-table changes; tx aborted by an earlier statement.","solutions":["Check the wrapped %v for pq error code 23503 (FK) and verify org id and orgMemberRoleId are valid","Chunk the batch insert (e.g. 1000 rows per statement) to stay under the 65535-parameter limit and avoid timeout-scale statements","Confirm GetOrgMemberRoleId returned a live org_roles.id","Retry the flow — ON CONFLICT DO NOTHING makes re-runs idempotent"],"exampleFix":"// before\nstmt := fmt.Sprintf(\"INSERT INTO orgs_users ... VALUES %s ON CONFLICT ...\", strings.Join(valueStrings, \",\"))\n_, err = tx.Exec(stmt, valueArgs...)\n// after\nconst chunk = 1000\nfor start := 0; start < len(usersForDomain); start += chunk {\n    end := start + chunk\n    if end > len(usersForDomain) { end = len(usersForDomain) }\n    // build valueStrings/valueArgs for usersForDomain[start:end] and exec\n}","handlingStrategy":"try-catch","validationCode":"orgMemberRoleId, err := db.GetOrgMemberRoleId()\nif err != nil { return err }\nif len(usersForDomain)*3 > 60000 { /* chunk the batch */ }","typeGuard":null,"tryCatchPattern":"err := db.AddOrgDomainUsers(orgId, domain, tx)\nif err != nil {\n    var pqErr *pq.Error\n    if errors.As(err, &pqErr) && pqErr.Code == \"23503\" {\n        return fmt.Errorf(\"orphan user/role reference: %s\", pqErr.Detail)\n    }\n    return err\n}","preventionTips":["Chunk bulk inserts to stay under Postgres's 65535 bind-parameter limit","Use ON CONFLICT DO NOTHING (already present) so retries are idempotent","Verify role ids are live before batch insert","Skip users deleted concurrently by re-fetching within the same transaction"],"tags":["database","postgresql","batch-insert","foreign-key"],"backgroundTag":"foreign-key-constraint-violation","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"}