diff options
author | 赵智超 <1012112796@qq.com> | 2020-04-18 21:50:25 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-18 10:50:25 -0300 |
commit | 1b86f174ce99b579df35c32e800551b1fd1df807 (patch) | |
tree | e057206a13cea7a0e2eb0219bb66d8d83a8781c9 /models | |
parent | 38d5f88a8183147cc5ecc6ece58fc28836a4af8b (diff) | |
download | gitea-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.go | 27 | ||||
-rw-r--r-- | models/migrations/migrations.go | 2 | ||||
-rw-r--r-- | models/migrations/v138.go | 22 | ||||
-rw-r--r-- | models/review.go | 60 |
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 +} |