diff options
Diffstat (limited to 'services/issue')
-rw-r--r-- | services/issue/assignee.go | 53 | ||||
-rw-r--r-- | services/issue/assignee_test.go | 37 | ||||
-rw-r--r-- | services/issue/issue.go | 45 |
3 files changed, 93 insertions, 42 deletions
diff --git a/services/issue/assignee.go b/services/issue/assignee.go new file mode 100644 index 0000000000..281f824da7 --- /dev/null +++ b/services/issue/assignee.go @@ -0,0 +1,53 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package issue + +import ( + "code.gitea.io/gitea/models" + "code.gitea.io/gitea/modules/notification" +) + +// DeleteNotPassedAssignee deletes all assignees who aren't passed via the "assignees" array +func DeleteNotPassedAssignee(issue *models.Issue, doer *models.User, assignees []*models.User) (err error) { + var found bool + + for _, assignee := range issue.Assignees { + + found = false + for _, alreadyAssignee := range assignees { + if assignee.ID == alreadyAssignee.ID { + found = true + break + } + } + + if !found { + // This function also does comments and hooks, which is why we call it seperatly instead of directly removing the assignees here + if _, _, err := ToggleAssignee(issue, doer, assignee.ID); err != nil { + return err + } + } + } + + return nil +} + +// ToggleAssignee changes a user between assigned and not assigned for this issue, and make issue comment for it. +func ToggleAssignee(issue *models.Issue, doer *models.User, assigneeID int64) (removed bool, comment *models.Comment, err error) { + removed, comment, err = issue.ToggleAssignee(doer, assigneeID) + if err != nil { + return + } + + assignee, err1 := models.GetUserByID(assigneeID) + if err1 != nil { + err = err1 + return + } + + notification.NotifyIssueChangeAssignee(doer, issue, assignee, removed, comment) + + return +} diff --git a/services/issue/assignee_test.go b/services/issue/assignee_test.go new file mode 100644 index 0000000000..bdd2009bf0 --- /dev/null +++ b/services/issue/assignee_test.go @@ -0,0 +1,37 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package issue + +import ( + "testing" + + "code.gitea.io/gitea/models" + "github.com/stretchr/testify/assert" +) + +func TestDeleteNotPassedAssignee(t *testing.T) { + assert.NoError(t, models.PrepareTestDatabase()) + + // Fake issue with assignees + issue, err := models.GetIssueWithAttrsByID(1) + assert.NoError(t, err) + + user1, err := models.GetUserByID(1) // This user is already assigned (see the definition in fixtures), so running UpdateAssignee should unassign him + assert.NoError(t, err) + + // Check if he got removed + isAssigned, err := models.IsUserAssignedToIssue(issue, user1) + assert.NoError(t, err) + assert.True(t, isAssigned) + + // Clean everyone + err = DeleteNotPassedAssignee(issue, user1, []*models.User{}) + assert.NoError(t, err) + + // Check they're gone + assignees, err := models.GetAssigneesByIssue(issue) + assert.NoError(t, err) + assert.Equal(t, 0, len(assignees)) +} diff --git a/services/issue/issue.go b/services/issue/issue.go index a5f725ab70..06472d8650 100644 --- a/services/issue/issue.go +++ b/services/issue/issue.go @@ -56,44 +56,7 @@ func ChangeTitle(issue *models.Issue, doer *models.User, title string) (err erro return } - mode, _ := models.AccessLevel(issue.Poster, issue.Repo) - if issue.IsPull { - if err = issue.LoadPullRequest(); err != nil { - return fmt.Errorf("loadPullRequest: %v", err) - } - issue.PullRequest.Issue = issue - err = models.PrepareWebhooks(issue.Repo, models.HookEventPullRequest, &api.PullRequestPayload{ - Action: api.HookIssueEdited, - Index: issue.Index, - Changes: &api.ChangesPayload{ - Title: &api.ChangesFromPayload{ - From: oldTitle, - }, - }, - PullRequest: issue.PullRequest.APIFormat(), - Repository: issue.Repo.APIFormat(mode), - Sender: doer.APIFormat(), - }) - } else { - err = models.PrepareWebhooks(issue.Repo, models.HookEventIssues, &api.IssuePayload{ - Action: api.HookIssueEdited, - Index: issue.Index, - Changes: &api.ChangesPayload{ - Title: &api.ChangesFromPayload{ - From: oldTitle, - }, - }, - Issue: issue.APIFormat(), - Repository: issue.Repo.APIFormat(mode), - Sender: issue.Poster.APIFormat(), - }) - } - - if err != nil { - log.Error("PrepareWebhooks [is_pull: %v]: %v", issue.IsPull, err) - } else { - go models.HookQueue.Add(issue.RepoID) - } + notification.NotifyIssueChangeTitle(doer, issue, oldTitle) return nil } @@ -134,7 +97,7 @@ func UpdateAssignees(issue *models.Issue, oneAssignee string, multipleAssignees } // Delete all old assignees not passed - if err = models.DeleteNotPassedAssignee(issue, doer, allNewAssignees); err != nil { + if err = DeleteNotPassedAssignee(issue, doer, allNewAssignees); err != nil { return err } @@ -179,13 +142,11 @@ func AddAssigneeIfNotAssigned(issue *models.Issue, doer *models.User, assigneeID return models.ErrUserDoesNotHaveAccessToRepo{UserID: assigneeID, RepoName: issue.Repo.Name} } - removed, comment, err := issue.ToggleAssignee(doer, assigneeID) + _, _, err = ToggleAssignee(issue, doer, assigneeID) if err != nil { return err } - notification.NotifyIssueChangeAssignee(doer, issue, assignee, removed, comment) - return nil } |