diff options
author | Gusted <williamzijl7@hotmail.com> | 2021-11-11 07:29:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-11 14:29:30 +0800 |
commit | 492e1c2fbd1b646f4428207942a9f89b56f7b6a9 (patch) | |
tree | 3de3f782cc9278f3f85f9c73eda1741390099d8c /routers/web | |
parent | a4dc0c5a82be7fbb472ec9dba204378bfd03dc8c (diff) | |
download | gitea-492e1c2fbd1b646f4428207942a9f89b56f7b6a9.tar.gz gitea-492e1c2fbd1b646f4428207942a9f89b56f7b6a9.zip |
Refactor commentTags functionality (#17558)
* feat: Allow multiple tags on comments
- Allow for multiples tags(Currently Poster + {Owner, Writer}).
- Utilize the Poster tag within the commentTag function and remove the
checking from templates.
- Use bitwise on CommentTags to enable specific tags.
- Don't show poster tag(view_content.tmpl) on the initial issue comment.
* Change parameters naming
* Change function name
* refactor variable wording
* Merge 'master' branch into 'tags-comments' branch
* Change naming
* `tag` -> `role`
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Diffstat (limited to 'routers/web')
-rw-r--r-- | routers/web/repo/issue.go | 78 |
1 files changed, 43 insertions, 35 deletions
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go index 93b6b7a305..d9e15a784f 100644 --- a/routers/web/repo/issue.go +++ b/routers/web/repo/issue.go @@ -1015,38 +1015,46 @@ func NewIssuePost(ctx *context.Context) { } } -// commentTag returns the CommentTag for a comment in/with the given repo, poster and issue -func commentTag(repo *models.Repository, poster *models.User, issue *models.Issue) (models.CommentTag, error) { +// roleDescriptor returns the Role Decriptor for a comment in/with the given repo, poster and issue +func roleDescriptor(repo *models.Repository, poster *models.User, issue *models.Issue) (models.RoleDescriptor, error) { perm, err := models.GetUserRepoPermission(repo, poster) if err != nil { - return models.CommentTagNone, err + return models.RoleDescriptorNone, err } - if perm.IsOwner() { - if !poster.IsAdmin { - return models.CommentTagOwner, nil - } - ok, err := models.IsUserRealRepoAdmin(repo, poster) - if err != nil { - return models.CommentTagNone, err - } + // By default the poster has no roles on the comment. + roleDescriptor := models.RoleDescriptorNone - if ok { - return models.CommentTagOwner, nil - } + // Check if the poster is owner of the repo. + if perm.IsOwner() { + // If the poster isn't a admin, enable the owner role. + if !poster.IsAdmin { + roleDescriptor = roleDescriptor.WithRole(models.RoleDescriptorOwner) + } else { - if ok, err = repo.IsCollaborator(poster.ID); ok && err == nil { - return models.CommentTagWriter, nil + // Otherwise check if poster is the real repo admin. + ok, err := models.IsUserRealRepoAdmin(repo, poster) + if err != nil { + return models.RoleDescriptorNone, err + } + if ok { + roleDescriptor = roleDescriptor.WithRole(models.RoleDescriptorOwner) + } } + } - return models.CommentTagNone, err + // Is the poster can write issues or pulls to the repo, enable the Writer role. + // Only enable this if the poster doesn't have the owner role already. + if !roleDescriptor.HasRole("Owner") && perm.CanWriteIssuesOrPulls(issue.IsPull) { + roleDescriptor = roleDescriptor.WithRole(models.RoleDescriptorWriter) } - if perm.CanWriteIssuesOrPulls(issue.IsPull) { - return models.CommentTagWriter, nil + // If the poster is the actual poster of the issue, enable Poster role. + if issue.IsPoster(poster.ID) { + roleDescriptor = roleDescriptor.WithRole(models.RoleDescriptorPoster) } - return models.CommentTagNone, nil + return roleDescriptor, nil } func getBranchData(ctx *context.Context, issue *models.Issue) { @@ -1249,9 +1257,9 @@ func ViewIssue(ctx *context.Context) { } var ( - tag models.CommentTag + role models.RoleDescriptor ok bool - marked = make(map[int64]models.CommentTag) + marked = make(map[int64]models.RoleDescriptor) comment *models.Comment participants = make([]*models.User, 1, 10) ) @@ -1298,11 +1306,11 @@ func ViewIssue(ctx *context.Context) { // check if dependencies can be created across repositories ctx.Data["AllowCrossRepositoryDependencies"] = setting.Service.AllowCrossRepositoryDependencies - if issue.ShowTag, err = commentTag(repo, issue.Poster, issue); err != nil { - ctx.ServerError("commentTag", err) + if issue.ShowRole, err = roleDescriptor(repo, issue.Poster, issue); err != nil { + ctx.ServerError("roleDescriptor", err) return } - marked[issue.PosterID] = issue.ShowTag + marked[issue.PosterID] = issue.ShowRole // Render comments and and fetch participants. participants[0] = issue.Poster @@ -1331,18 +1339,18 @@ func ViewIssue(ctx *context.Context) { return } // Check tag. - tag, ok = marked[comment.PosterID] + role, ok = marked[comment.PosterID] if ok { - comment.ShowTag = tag + comment.ShowRole = role continue } - comment.ShowTag, err = commentTag(repo, comment.Poster, issue) + comment.ShowRole, err = roleDescriptor(repo, comment.Poster, issue) if err != nil { - ctx.ServerError("commentTag", err) + ctx.ServerError("roleDescriptor", err) return } - marked[comment.PosterID] = comment.ShowTag + marked[comment.PosterID] = comment.ShowRole participants = addParticipant(comment.Poster, participants) } else if comment.Type == models.CommentTypeLabel { if err = comment.LoadLabel(); err != nil { @@ -1430,18 +1438,18 @@ func ViewIssue(ctx *context.Context) { for _, lineComments := range codeComments { for _, c := range lineComments { // Check tag. - tag, ok = marked[c.PosterID] + role, ok = marked[c.PosterID] if ok { - c.ShowTag = tag + c.ShowRole = role continue } - c.ShowTag, err = commentTag(repo, c.Poster, issue) + c.ShowRole, err = roleDescriptor(repo, c.Poster, issue) if err != nil { - ctx.ServerError("commentTag", err) + ctx.ServerError("roleDescriptor", err) return } - marked[c.PosterID] = c.ShowTag + marked[c.PosterID] = c.ShowRole participants = addParticipant(c.Poster, participants) } } |