aboutsummaryrefslogtreecommitdiffstats
path: root/routers/web
diff options
context:
space:
mode:
authoryp05327 <576951401@qq.com>2023-08-24 14:06:17 +0900
committerGitHub <noreply@github.com>2023-08-24 13:06:17 +0800
commitd2e4039def61d9cc9952be462216001125327270 (patch)
tree45f12e0c48fb603f868a80296e07670bcc35dce4 /routers/web
parent0d55f64e6cd3de2e1e5c0ee795605823efb14231 (diff)
downloadgitea-d2e4039def61d9cc9952be462216001125327270.tar.gz
gitea-d2e4039def61d9cc9952be462216001125327270.zip
Add `member`, `collaborator`, `contributor`, and `first-time contributor` roles and tooltips (#26658)
GitHub like role descriptor ![image](https://github.com/go-gitea/gitea/assets/18380374/ceaed92c-6749-47b3-89e8-0e0e7ae65321) ![image](https://github.com/go-gitea/gitea/assets/18380374/8193ec34-cbf0-47f9-b0de-10dbddd66970) ![image](https://github.com/go-gitea/gitea/assets/18380374/56c7ed85-6177-425e-9f2f-926e99770782) --------- Co-authored-by: delvh <dev.lh@web.de> 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.go69
1 files changed, 46 insertions, 23 deletions
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index b04802e452..9a2add1452 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -1228,47 +1228,70 @@ func NewIssuePost(ctx *context.Context) {
}
}
-// roleDescriptor returns the Role Descriptor for a comment in/with the given repo, poster and issue
+// roleDescriptor returns the role descriptor for a comment in/with the given repo, poster and issue
func roleDescriptor(ctx stdCtx.Context, repo *repo_model.Repository, poster *user_model.User, issue *issues_model.Issue, hasOriginalAuthor bool) (issues_model.RoleDescriptor, error) {
+ roleDescriptor := issues_model.RoleDescriptor{}
+
if hasOriginalAuthor {
- return issues_model.RoleDescriptorNone, nil
+ return roleDescriptor, nil
}
perm, err := access_model.GetUserRepoPermission(ctx, repo, poster)
if err != nil {
- return issues_model.RoleDescriptorNone, err
+ return roleDescriptor, err
}
- // By default the poster has no roles on the comment.
- roleDescriptor := issues_model.RoleDescriptorNone
+ // If the poster is the actual poster of the issue, enable Poster role.
+ roleDescriptor.IsPoster = issue.IsPoster(poster.ID)
// Check if the poster is owner of the repo.
if perm.IsOwner() {
- // If the poster isn't a admin, enable the owner role.
+ // If the poster isn't an admin, enable the owner role.
if !poster.IsAdmin {
- roleDescriptor = roleDescriptor.WithRole(issues_model.RoleDescriptorOwner)
- } else {
+ roleDescriptor.RoleInRepo = issues_model.RoleRepoOwner
+ return roleDescriptor, nil
+ }
- // Otherwise check if poster is the real repo admin.
- ok, err := access_model.IsUserRealRepoAdmin(repo, poster)
- if err != nil {
- return issues_model.RoleDescriptorNone, err
- }
- if ok {
- roleDescriptor = roleDescriptor.WithRole(issues_model.RoleDescriptorOwner)
- }
+ // Otherwise check if poster is the real repo admin.
+ ok, err := access_model.IsUserRealRepoAdmin(repo, poster)
+ if err != nil {
+ return roleDescriptor, err
+ }
+ if ok {
+ roleDescriptor.RoleInRepo = issues_model.RoleRepoOwner
+ return roleDescriptor, nil
}
}
- // 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(issues_model.RoleDescriptorWriter)
+ // If repo is organization, check Member role
+ if err := repo.LoadOwner(ctx); err != nil {
+ return roleDescriptor, err
+ }
+ if repo.Owner.IsOrganization() {
+ if isMember, err := organization.IsOrganizationMember(ctx, repo.Owner.ID, poster.ID); err != nil {
+ return roleDescriptor, err
+ } else if isMember {
+ roleDescriptor.RoleInRepo = issues_model.RoleRepoMember
+ return roleDescriptor, nil
+ }
}
- // If the poster is the actual poster of the issue, enable Poster role.
- if issue.IsPoster(poster.ID) {
- roleDescriptor = roleDescriptor.WithRole(issues_model.RoleDescriptorPoster)
+ // If the poster is the collaborator of the repo
+ if isCollaborator, err := repo_model.IsCollaborator(ctx, repo.ID, poster.ID); err != nil {
+ return roleDescriptor, err
+ } else if isCollaborator {
+ roleDescriptor.RoleInRepo = issues_model.RoleRepoCollaborator
+ return roleDescriptor, nil
+ }
+
+ hasMergedPR, err := issues_model.HasMergedPullRequestInRepo(ctx, repo.ID, poster.ID)
+ if err != nil {
+ return roleDescriptor, err
+ } else if hasMergedPR {
+ roleDescriptor.RoleInRepo = issues_model.RoleRepoContributor
+ } else {
+ // only display first time contributor in the first opening pull request
+ roleDescriptor.RoleInRepo = issues_model.RoleRepoFirstTimeContributor
}
return roleDescriptor, nil