Skip to content

Commit

Permalink
[API] expose repo.GetReviewers() & repo.GetAssignees() (go-gitea#16168)
Browse files Browse the repository at this point in the history
* API: expose repo.GetReviewers() & repo.GetAssignees()

* Add tests

* fix unrelated swagger query type
  • Loading branch information
6543 authored and AbdulrhmnGhanem committed Aug 10, 2021
1 parent 013540b commit 4bb6d9b
Show file tree
Hide file tree
Showing 8 changed files with 170 additions and 11 deletions.
28 changes: 28 additions & 0 deletions integrations/api_repo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -494,3 +494,31 @@ func TestAPIRepoTransfer(t *testing.T) {
repo = models.AssertExistsAndLoadBean(t, &models.Repository{ID: repo.ID}).(*models.Repository)
_ = models.DeleteRepository(user, repo.OwnerID, repo.ID)
}

func TestAPIRepoGetReviewers(t *testing.T) {
defer prepareTestEnv(t)()
user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session)
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)

req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/reviewers?token=%s", user.Name, repo.Name, token)
resp := session.MakeRequest(t, req, http.StatusOK)
var reviewers []*api.User
DecodeJSON(t, resp, &reviewers)
assert.Len(t, reviewers, 4)
}

func TestAPIRepoGetAssignees(t *testing.T) {
defer prepareTestEnv(t)()
user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
session := loginUser(t, user.Name)
token := getTokenForLoggedInUser(t, session)
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)

req := NewRequestf(t, "GET", "/api/v1/repos/%s/%s/assignees?token=%s", user.Name, repo.Name, token)
resp := session.MakeRequest(t, req, http.StatusOK)
var assignees []*api.User
DecodeJSON(t, resp, &assignees)
assert.Len(t, assignees, 1)
}
9 changes: 9 additions & 0 deletions modules/convert/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,15 @@ func ToUser(user, doer *models.User) *api.User {
return toUser(user, signed, authed)
}

// ToUsers convert list of models.User to list of api.User
func ToUsers(doer *models.User, users []*models.User) []*api.User {
result := make([]*api.User, len(users))
for i := range users {
result[i] = ToUser(users[i], doer)
}
return result
}

// ToUserWithAccessMode convert models.User to api.User
// AccessMode is not none show add some more information
func ToUserWithAccessMode(user *models.User, accessMode models.AccessMode) *api.User {
Expand Down
2 changes: 2 additions & 0 deletions routers/api/v1/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,8 @@ func Routes() *web.Route {
Put(reqAdmin(), bind(api.AddCollaboratorOption{}), repo.AddCollaborator).
Delete(reqAdmin(), repo.DeleteCollaborator)
}, reqToken())
m.Get("/assignees", reqToken(), reqAnyRepoReader(), repo.GetAssignees)
m.Get("/reviewers", reqToken(), reqAnyRepoReader(), repo.GetReviewers)
m.Group("/teams", func() {
m.Get("", reqAnyRepoReader(), repo.ListTeams)
m.Combo("/{team}").Get(reqAnyRepoReader(), repo.IsTeam).
Expand Down
2 changes: 1 addition & 1 deletion routers/api/v1/notify/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func ListRepoNotifications(ctx *context.APIContext) {
// - name: all
// in: query
// description: If true, show notifications marked as read. Default value is false
// type: string
// type: boolean
// - name: status-types
// in: query
// description: "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread & pinned"
Expand Down
2 changes: 1 addition & 1 deletion routers/api/v1/notify/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ func ListNotifications(ctx *context.APIContext) {
// - name: all
// in: query
// description: If true, show notifications marked as read. Default value is false
// type: string
// type: boolean
// - name: status-types
// in: query
// description: "Show notifications with the provided status types. Options are: unread, read and/or pinned. Defaults to unread & pinned."
Expand Down
60 changes: 60 additions & 0 deletions routers/api/v1/repo/collaborators.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,3 +221,63 @@ func DeleteCollaborator(ctx *context.APIContext) {
}
ctx.Status(http.StatusNoContent)
}

// GetReviewers return all users that can be requested to review in this repo
func GetReviewers(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/reviewers repository repoGetReviewers
// ---
// summary: Return all users that can be requested to review in this repo
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/UserList"

reviewers, err := ctx.Repo.Repository.GetReviewers(ctx.User.ID, 0)
if err != nil {
ctx.Error(http.StatusInternalServerError, "ListCollaborators", err)
return
}
ctx.JSON(http.StatusOK, convert.ToUsers(ctx.User, reviewers))
}

// GetAssignees return all users that have write access and can be assigned to issues
func GetAssignees(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/assignees repository repoGetAssignees
// ---
// summary: Return all users that have write access and can be assigned to issues
// produces:
// - application/json
// parameters:
// - name: owner
// in: path
// description: owner of the repo
// type: string
// required: true
// - name: repo
// in: path
// description: name of the repo
// type: string
// required: true
// responses:
// "200":
// "$ref": "#/responses/UserList"

assignees, err := ctx.Repo.Repository.GetAssignees()
if err != nil {
ctx.Error(http.StatusInternalServerError, "ListCollaborators", err)
return
}
ctx.JSON(http.StatusOK, convert.ToUsers(ctx.User, assignees))
}
8 changes: 1 addition & 7 deletions routers/api/v1/user/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/routers/api/v1/utils"
)

Expand Down Expand Up @@ -73,18 +72,13 @@ func Search(ctx *context.APIContext) {
return
}

results := make([]*api.User, len(users))
for i := range users {
results[i] = convert.ToUser(users[i], ctx.User)
}

ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
ctx.Header().Set("X-Total-Count", fmt.Sprintf("%d", maxResults))
ctx.Header().Set("Access-Control-Expose-Headers", "X-Total-Count, Link")

ctx.JSON(http.StatusOK, map[string]interface{}{
"ok": true,
"data": results,
"data": convert.ToUsers(ctx.User, users),
})
}

Expand Down
70 changes: 68 additions & 2 deletions templates/swagger/v1_json.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -630,7 +630,7 @@
"operationId": "notifyGetList",
"parameters": [
{
"type": "string",
"type": "boolean",
"description": "If true, show notifications marked as read. Default value is false",
"name": "all",
"in": "query"
Expand Down Expand Up @@ -2277,6 +2277,39 @@
}
}
},
"/repos/{owner}/{repo}/assignees": {
"get": {
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "Return all users that have write access and can be assigned to issues",
"operationId": "repoGetAssignees",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/UserList"
}
}
}
},
"/repos/{owner}/{repo}/branch_protections": {
"get": {
"produces": [
Expand Down Expand Up @@ -6844,7 +6877,7 @@
"required": true
},
{
"type": "string",
"type": "boolean",
"description": "If true, show notifications marked as read. Default value is false",
"name": "all",
"in": "query"
Expand Down Expand Up @@ -8629,6 +8662,39 @@
}
}
},
"/repos/{owner}/{repo}/reviewers": {
"get": {
"produces": [
"application/json"
],
"tags": [
"repository"
],
"summary": "Return all users that can be requested to review in this repo",
"operationId": "repoGetReviewers",
"parameters": [
{
"type": "string",
"description": "owner of the repo",
"name": "owner",
"in": "path",
"required": true
},
{
"type": "string",
"description": "name of the repo",
"name": "repo",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"$ref": "#/responses/UserList"
}
}
}
},
"/repos/{owner}/{repo}/signing-key.gpg": {
"get": {
"produces": [
Expand Down

0 comments on commit 4bb6d9b

Please sign in to comment.