{"record":{"id":"cafd74f6d865e11f","repo":"plandex-ai/plandex","slug":"error-deleting-org-user-err-error","errorCode":null,"errorMessage":"Error deleting org user: {err.Error()}","messagePattern":"Error deleting org user: (.+?)","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"app/server/handlers/users.go","lineNumber":218,"sourceCode":"\t\t\tlog.Println(\"Error getting invite for org user: \", err)\n\t\t\treturn fmt.Errorf(\"error getting invite for org user: %v\", err)\n\t\t}\n\n\t\tif invite != nil {\n\t\t\terr = db.DeleteInvite(invite.Id, tx)\n\n\t\t\tif err != nil {\n\t\t\t\tlog.Println(\"Error deleting invite: \", err)\n\t\t\t\treturn fmt.Errorf(\"error deleting invite: %v\", err)\n\t\t\t}\n\t\t}\n\n\t\treturn nil\n\t})\n\n\tif err != nil {\n\t\tlog.Println(\"Error deleting org user: \", err)\n\t\thttp.Error(w, \"Error deleting org user: \"+err.Error(), http.StatusInternalServerError)\n\t\treturn\n\t}\n\n\tlog.Println(\"Successfully processed request for DeleteOrgUserHandler\")\n}\n","sourceCodeStart":200,"sourceCodeEnd":224,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/handlers/users.go#L200-L224","documentation":"The db.WithTx transaction wrapping the delete failed: DeleteOrgUser, GetActiveInviteByEmail, or DeleteInvite returned an error inside the callback, or the transaction itself (commit/rollback/context) failed. The handler replies HTTP 500 'Error deleting org user: <err>' and the tx is rolled back, so no partial deletion persists.","triggerScenarios":"Any step inside the 'delete org user' transaction errors: the org_users DELETE fails (FK constraints, row gone), the active-invite lookup errors, invite deletion fails, or the tx context is cancelled (client disconnect/timeout).","commonSituations":"Foreign-key rows referencing the org_user block deletion; client timeout cancels r.Context() mid-tx; DB connection drop between statements; GetActiveInviteByEmail returning an unexpected error for users with no invites if the query treats 'none' as an error.","solutions":["Read the server log 'Error deleting org user: ' to see which inner step failed","Resolve FK constraints blocking DeleteOrgUser (delete or reassign dependent rows first)","Verify GetActiveInviteByEmail handles no-invite cases as nil rather than erroring","Increase client timeout / avoid cancelling requests mid-tx; retry once the DB is healthy"],"exampleFix":"// before\ninvite, err := db.GetActiveInviteByEmail(auth.OrgId, auth.User.Email)\nif err != nil {\n    return fmt.Errorf(\"error getting invite for org user: %v\", err)\n}\n// after\ninvite, err := db.GetActiveInviteByEmail(auth.OrgId, auth.User.Email)\nif err != nil && !errors.Is(err, sql.ErrNoRows) {\n    return fmt.Errorf(\"error getting invite for org user: %v\", err)\n}","handlingStrategy":"try-catch","validationCode":"ctx, cancel := context.WithTimeout(r.Context(), 30*time.Second)\ndefer cancel()\nif err := db.PingContext(ctx); err != nil {\n    return fmt.Errorf(\"db unavailable: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"err = db.WithTx(r.Context(), \"delete org user\", func(tx *sqlx.Tx) error {\n    if err := db.DeleteOrgUser(auth.OrgId, userId, tx); err != nil {\n        return fmt.Errorf(\"delete org user: %w\", err)\n    }\n    return nil\n})\nif err != nil {\n    log.Printf(\"delete org user tx failed: %v\", err) // tx already rolled back\n    http.Error(w, \"internal error\", http.StatusInternalServerError)\n    return\n}","preventionTips":["Keep transactions short and never do network calls to other services inside them","Ensure GetActiveInviteByEmail treats 'no invite' as nil, not an error","Set request/DB timeouts larger than expected tx duration to avoid context cancellation","Check FK constraints on org_users before deleting; clean dependent rows first","Retry idempotent delete transactions once after transient DB failures"],"tags":["go","database","transaction","http-500","rollback"],"backgroundTag":"transaction-rolled-back","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"}