gitea源码

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package issue
  4. import (
  5. "context"
  6. "code.gitea.io/gitea/models/db"
  7. issues_model "code.gitea.io/gitea/models/issues"
  8. access_model "code.gitea.io/gitea/models/perm/access"
  9. user_model "code.gitea.io/gitea/models/user"
  10. notify_service "code.gitea.io/gitea/services/notify"
  11. )
  12. // ClearLabels clears all of an issue's labels
  13. func ClearLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User) error {
  14. if err := issues_model.ClearIssueLabels(ctx, issue, doer); err != nil {
  15. return err
  16. }
  17. notify_service.IssueClearLabels(ctx, doer, issue)
  18. return nil
  19. }
  20. // AddLabel adds a new label to the issue.
  21. func AddLabel(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, label *issues_model.Label) error {
  22. if err := issues_model.NewIssueLabel(ctx, issue, label, doer); err != nil {
  23. return err
  24. }
  25. notify_service.IssueChangeLabels(ctx, doer, issue, []*issues_model.Label{label}, nil)
  26. return nil
  27. }
  28. // AddLabels adds a list of new labels to the issue.
  29. func AddLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, labels []*issues_model.Label) error {
  30. if err := issues_model.NewIssueLabels(ctx, issue, labels, doer); err != nil {
  31. return err
  32. }
  33. notify_service.IssueChangeLabels(ctx, doer, issue, labels, nil)
  34. return nil
  35. }
  36. // RemoveLabel removes a label from issue by given ID.
  37. func RemoveLabel(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, label *issues_model.Label) error {
  38. if err := db.WithTx(ctx, func(ctx context.Context) error {
  39. if err := issue.LoadRepo(ctx); err != nil {
  40. return err
  41. }
  42. perm, err := access_model.GetUserRepoPermission(ctx, issue.Repo, doer)
  43. if err != nil {
  44. return err
  45. }
  46. if !perm.CanWriteIssuesOrPulls(issue.IsPull) {
  47. if label.OrgID > 0 {
  48. return issues_model.ErrOrgLabelNotExist{}
  49. }
  50. return issues_model.ErrRepoLabelNotExist{}
  51. }
  52. return issues_model.DeleteIssueLabel(ctx, issue, label, doer)
  53. }); err != nil {
  54. return err
  55. }
  56. notify_service.IssueChangeLabels(ctx, doer, issue, nil, []*issues_model.Label{label})
  57. return nil
  58. }
  59. // ReplaceLabels removes all current labels and add new labels to the issue.
  60. func ReplaceLabels(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, labels []*issues_model.Label) error {
  61. old, err := issues_model.GetLabelsByIssueID(ctx, issue.ID)
  62. if err != nil {
  63. return err
  64. }
  65. if err := issues_model.ReplaceIssueLabels(ctx, issue, labels, doer); err != nil {
  66. return err
  67. }
  68. notify_service.IssueChangeLabels(ctx, doer, issue, labels, old)
  69. return nil
  70. }