You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

repo_collaboration.go 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2016 The Gogs Authors. All rights reserved.
  2. // Copyright 2020 The Gitea Authors.
  3. // SPDX-License-Identifier: MIT
  4. package models
  5. import (
  6. "context"
  7. "fmt"
  8. "code.gitea.io/gitea/models/db"
  9. issues_model "code.gitea.io/gitea/models/issues"
  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. "xorm.io/builder"
  14. )
  15. // DeleteCollaboration removes collaboration relation between the user and repository.
  16. func DeleteCollaboration(repo *repo_model.Repository, uid int64) (err error) {
  17. collaboration := &repo_model.Collaboration{
  18. RepoID: repo.ID,
  19. UserID: uid,
  20. }
  21. ctx, committer, err := db.TxContext(db.DefaultContext)
  22. if err != nil {
  23. return err
  24. }
  25. defer committer.Close()
  26. if has, err := db.GetEngine(ctx).Delete(collaboration); err != nil || has == 0 {
  27. return err
  28. } else if err = access_model.RecalculateAccesses(ctx, repo); err != nil {
  29. return err
  30. }
  31. if err = repo_model.WatchRepo(ctx, uid, repo.ID, false); err != nil {
  32. return err
  33. }
  34. if err = reconsiderWatches(ctx, repo, uid); err != nil {
  35. return err
  36. }
  37. // Unassign a user from any issue (s)he has been assigned to in the repository
  38. if err := reconsiderRepoIssuesAssignee(ctx, repo, uid); err != nil {
  39. return err
  40. }
  41. return committer.Commit()
  42. }
  43. func reconsiderRepoIssuesAssignee(ctx context.Context, repo *repo_model.Repository, uid int64) error {
  44. user, err := user_model.GetUserByID(ctx, uid)
  45. if err != nil {
  46. return err
  47. }
  48. if canAssigned, err := access_model.CanBeAssigned(ctx, user, repo, true); err != nil || canAssigned {
  49. return err
  50. }
  51. if _, err := db.GetEngine(ctx).Where(builder.Eq{"assignee_id": uid}).
  52. In("issue_id", builder.Select("id").From("issue").Where(builder.Eq{"repo_id": repo.ID})).
  53. Delete(&issues_model.IssueAssignees{}); err != nil {
  54. return fmt.Errorf("Could not delete assignee[%d] %w", uid, err)
  55. }
  56. return nil
  57. }
  58. func reconsiderWatches(ctx context.Context, repo *repo_model.Repository, uid int64) error {
  59. if has, err := access_model.HasAccess(ctx, uid, repo); err != nil || has {
  60. return err
  61. }
  62. if err := repo_model.WatchRepo(ctx, uid, repo.ID, false); err != nil {
  63. return err
  64. }
  65. // Remove all IssueWatches a user has subscribed to in the repository
  66. return issues_model.RemoveIssueWatchersByRepoID(ctx, uid, repo.ID)
  67. }