mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 11:35:03 +01:00 
			
		
		
		
	[API] expose repo.GetReviewers() & repo.GetAssignees() (#16168)
* API: expose repo.GetReviewers() & repo.GetAssignees() * Add tests * fix unrelated swagger query type
This commit is contained in:
		
							parent
							
								
									0db1048c3a
								
							
						
					
					
						commit
						b3fbd37e99
					
				| @ -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) | ||||
| } | ||||
|  | ||||
| @ -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 { | ||||
|  | ||||
| @ -746,6 +746,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). | ||||
|  | ||||
| @ -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" | ||||
|  | ||||
| @ -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." | ||||
|  | ||||
| @ -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)) | ||||
| } | ||||
|  | ||||
| @ -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" | ||||
| ) | ||||
| 
 | ||||
| @ -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), | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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" | ||||
| @ -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": [ | ||||
| @ -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" | ||||
| @ -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": [ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user