gitea源码

user.go 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Copyright 2019 The Gitea Authors. All rights reserved.
  3. // SPDX-License-Identifier: MIT
  4. package org
  5. import (
  6. "context"
  7. "fmt"
  8. "code.gitea.io/gitea/models/db"
  9. "code.gitea.io/gitea/models/organization"
  10. access_model "code.gitea.io/gitea/models/perm/access"
  11. repo_model "code.gitea.io/gitea/models/repo"
  12. user_model "code.gitea.io/gitea/models/user"
  13. )
  14. // RemoveOrgUser removes user from given organization.
  15. func RemoveOrgUser(ctx context.Context, org *organization.Organization, user *user_model.User) error {
  16. ou := new(organization.OrgUser)
  17. has, err := db.GetEngine(ctx).
  18. Where("uid=?", user.ID).
  19. And("org_id=?", org.ID).
  20. Get(ou)
  21. if err != nil {
  22. return fmt.Errorf("get org-user: %w", err)
  23. } else if !has {
  24. return nil
  25. }
  26. // Check if the user to delete is the last member in owner team.
  27. if isOwner, err := organization.IsOrganizationOwner(ctx, org.ID, user.ID); err != nil {
  28. return err
  29. } else if isOwner {
  30. t, err := organization.GetOwnerTeam(ctx, org.ID)
  31. if err != nil {
  32. return err
  33. }
  34. if t.NumMembers == 1 {
  35. if err := t.LoadMembers(ctx); err != nil {
  36. return err
  37. }
  38. if t.Members[0].ID == user.ID {
  39. return organization.ErrLastOrgOwner{UID: user.ID}
  40. }
  41. }
  42. }
  43. return db.WithTx(ctx, func(ctx context.Context) error {
  44. if _, err := db.DeleteByID[organization.OrgUser](ctx, ou.ID); err != nil {
  45. return err
  46. } else if _, err = db.Exec(ctx, "UPDATE `user` SET num_members=num_members-1 WHERE id=?", org.ID); err != nil {
  47. return err
  48. }
  49. // Delete all repository accesses and unwatch them.
  50. env, err := repo_model.AccessibleReposEnv(ctx, org, user.ID)
  51. if err != nil {
  52. return fmt.Errorf("AccessibleReposEnv: %w", err)
  53. }
  54. repoIDs, err := env.RepoIDs(ctx)
  55. if err != nil {
  56. return fmt.Errorf("GetUserRepositories [%d]: %w", user.ID, err)
  57. }
  58. for _, repoID := range repoIDs {
  59. repo, err := repo_model.GetRepositoryByID(ctx, repoID)
  60. if err != nil {
  61. return err
  62. }
  63. if err = repo_model.WatchRepo(ctx, user, repo, false); err != nil {
  64. return err
  65. }
  66. }
  67. if len(repoIDs) > 0 {
  68. if _, err = db.GetEngine(ctx).
  69. Where("user_id = ?", user.ID).
  70. In("repo_id", repoIDs).
  71. Delete(new(access_model.Access)); err != nil {
  72. return err
  73. }
  74. }
  75. // Delete member in their teams.
  76. teams, err := organization.GetUserOrgTeams(ctx, org.ID, user.ID)
  77. if err != nil {
  78. return err
  79. }
  80. for _, t := range teams {
  81. if err = removeTeamMember(ctx, t, user); err != nil {
  82. return err
  83. }
  84. }
  85. return nil
  86. })
  87. }