aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
author赵智超 <1012112796@qq.com>2020-04-18 21:50:25 +0800
committerGitHub <noreply@github.com>2020-04-18 10:50:25 -0300
commit1b86f174ce99b579df35c32e800551b1fd1df807 (patch)
treee057206a13cea7a0e2eb0219bb66d8d83a8781c9 /models
parent38d5f88a8183147cc5ecc6ece58fc28836a4af8b (diff)
downloadgitea-1b86f174ce99b579df35c32e800551b1fd1df807.tar.gz
gitea-1b86f174ce99b579df35c32e800551b1fd1df807.zip
Add a way to mark Conversation (code comment) resolved (#11037)
* Add a way to mark Conversation (code comment) resolved mark Conversation is a way to mark a Conversation is stale or be solved. when it's marked as stale, will be hided like stale. all Pull Request writer , Offical Reviewers and poster can add or remove Conversation resolved mark. Signed-off-by: a1012112796 <1012112796@qq.com> * fix lint * Apply suggestions from code review * Add ResolveDoer * fix ui Co-Authored-By: Lauris BH <lauris@nix.lv> Co-Authored-By: 6543 <6543@obermui.de> * change IsResolved to an function Add permission check in UpdateResolveConversation * Apply suggestions from code review * change return error for permisson check * add default message for deleted user * get issue message from comment * add migration for ``ResolveDoerID`` column another change: * block mark pending review as resolved because it's not necessary Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com> * change button color * resolve button size * fix code style * remove unusefull code Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com> Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: guillep2k <18600385+guillep2k@users.noreply.github.com>
Diffstat (limited to 'models')
-rw-r--r--models/issue_comment.go27
-rw-r--r--models/migrations/migrations.go2
-rw-r--r--models/migrations/v138.go22
-rw-r--r--models/review.go60
4 files changed, 111 insertions, 0 deletions
diff --git a/models/issue_comment.go b/models/issue_comment.go
index 2e59a2cb3f..f7017435d7 100644
--- a/models/issue_comment.go
+++ b/models/issue_comment.go
@@ -122,6 +122,8 @@ type Comment struct {
AssigneeID int64
RemovedAssignee bool
Assignee *User `xorm:"-"`
+ ResolveDoerID int64
+ ResolveDoer *User `xorm:"-"`
OldTitle string
NewTitle string
OldRef string
@@ -420,6 +422,26 @@ func (c *Comment) LoadAssigneeUser() error {
return nil
}
+// LoadResolveDoer if comment.Type is CommentTypeCode and ResolveDoerID not zero, then load resolveDoer
+func (c *Comment) LoadResolveDoer() (err error) {
+ if c.ResolveDoerID == 0 || c.Type != CommentTypeCode {
+ return nil
+ }
+ c.ResolveDoer, err = getUserByID(x, c.ResolveDoerID)
+ if err != nil {
+ if IsErrUserNotExist(err) {
+ c.ResolveDoer = NewGhostUser()
+ err = nil
+ }
+ }
+ return
+}
+
+// IsResolved check if an code comment is resolved
+func (c *Comment) IsResolved() bool {
+ return c.ResolveDoerID != 0 && c.Type == CommentTypeCode
+}
+
// LoadDepIssueDetails loads Dependent Issue Details
func (c *Comment) LoadDepIssueDetails() (err error) {
if c.DependentIssueID <= 0 || c.DependentIssue != nil {
@@ -943,7 +965,12 @@ func fetchCodeCommentsByReview(e Engine, issue *Issue, currentUser *User, review
if err := e.In("id", ids).Find(&reviews); err != nil {
return nil, err
}
+
for _, comment := range comments {
+ if err := comment.LoadResolveDoer(); err != nil {
+ return nil, err
+ }
+
if re, ok := reviews[comment.ReviewID]; ok && re != nil {
// If the review is pending only the author can see the comments (except the review is set)
if review.ID == 0 {
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index fe72d0f630..6868aad7b1 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -208,6 +208,8 @@ var migrations = []Migration{
NewMigration("Add CommitsAhead and CommitsBehind Column to PullRequest Table", addCommitDivergenceToPulls),
// v137 -> v138
NewMigration("Add Branch Protection Block Outdated Branch", addBlockOnOutdatedBranch),
+ // v138 -> v139
+ NewMigration("Add ResolveDoerID to Comment table", addResolveDoerIDCommentColumn),
}
// GetCurrentDBVersion returns the current db version
diff --git a/models/migrations/v138.go b/models/migrations/v138.go
new file mode 100644
index 0000000000..2db9b821ad
--- /dev/null
+++ b/models/migrations/v138.go
@@ -0,0 +1,22 @@
+// Copyright 2020 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 migrations
+
+import (
+ "fmt"
+
+ "xorm.io/xorm"
+)
+
+func addResolveDoerIDCommentColumn(x *xorm.Engine) error {
+ type Comment struct {
+ ResolveDoerID int64
+ }
+
+ if err := x.Sync2(new(Comment)); err != nil {
+ return fmt.Errorf("Sync2: %v", err)
+ }
+ return nil
+}
diff --git a/models/review.go b/models/review.go
index d6bb77925e..7f23777c3e 100644
--- a/models/review.go
+++ b/models/review.go
@@ -5,6 +5,7 @@
package models
import (
+ "fmt"
"strings"
"code.gitea.io/gitea/modules/timeutil"
@@ -594,3 +595,62 @@ func RemoveRewiewRequest(issue *Issue, reviewer *User, doer *User) (comment *Com
return comment, sess.Commit()
}
+
+// MarkConversation Add or remove Conversation mark for a code comment
+func MarkConversation(comment *Comment, doer *User, isResolve bool) (err error) {
+ if comment.Type != CommentTypeCode {
+ return nil
+ }
+
+ if isResolve {
+ if comment.ResolveDoerID != 0 {
+ return nil
+ }
+
+ if _, err = x.Exec("UPDATE `comment` SET resolve_doer_id=? WHERE id=?", doer.ID, comment.ID); err != nil {
+ return err
+ }
+ } else {
+ if comment.ResolveDoerID == 0 {
+ return nil
+ }
+
+ if _, err = x.Exec("UPDATE `comment` SET resolve_doer_id=? WHERE id=?", 0, comment.ID); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+// CanMarkConversation Add or remove Conversation mark for a code comment permission check
+// the PR writer , offfcial reviewer and poster can do it
+func CanMarkConversation(issue *Issue, doer *User) (permResult bool, err error) {
+ if doer == nil || issue == nil {
+ return false, fmt.Errorf("issue or doer is nil")
+ }
+
+ if doer.ID != issue.PosterID {
+ if err = issue.LoadRepo(); err != nil {
+ return false, err
+ }
+
+ perm, err := GetUserRepoPermission(issue.Repo, doer)
+ if err != nil {
+ return false, err
+ }
+
+ permResult = perm.CanAccess(AccessModeWrite, UnitTypePullRequests)
+ if !permResult {
+ if permResult, err = IsOfficialReviewer(issue, doer); err != nil {
+ return false, err
+ }
+ }
+
+ if !permResult {
+ return false, nil
+ }
+ }
+
+ return true, nil
+}