mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-30 22:11:07 +00:00 
			
		
		
		
	[GITEA] enable system users search via the API
Refs: https://codeberg.org/forgejo/forgejo/issues/1403 (cherry picked from commit87bd40411e) Conflicts: routers/api/v1/user/user.go https://codeberg.org/forgejo/forgejo/pulls/1469 (cherry picked from commit74f70ca873) (cherry picked from commit673a75bb43) (cherry picked from commitfcd4535ac6) (cherry picked from commit56b229f22e) (cherry picked from commit45b922ae76) (cherry picked from commit03805f3bf4)
This commit is contained in:
		
					parent
					
						
							
								525f95cf1a
							
						
					
				
			
			
				commit
				
					
						16c67f70d5
					
				
			
		
					 3 changed files with 51 additions and 13 deletions
				
			
		|  | @ -9,10 +9,12 @@ import ( | ||||||
| 	"code.gitea.io/gitea/modules/structs" | 	"code.gitea.io/gitea/modules/structs" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | const GhostUserID = -1 | ||||||
|  | 
 | ||||||
| // NewGhostUser creates and returns a fake user for someone has deleted their account. | // NewGhostUser creates and returns a fake user for someone has deleted their account. | ||||||
| func NewGhostUser() *User { | func NewGhostUser() *User { | ||||||
| 	return &User{ | 	return &User{ | ||||||
| 		ID:        -1, | 		ID:        GhostUserID, | ||||||
| 		Name:      "Ghost", | 		Name:      "Ghost", | ||||||
| 		LowerName: "ghost", | 		LowerName: "ghost", | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -54,19 +54,33 @@ func Search(ctx *context.APIContext) { | ||||||
| 
 | 
 | ||||||
| 	listOptions := utils.GetListOptions(ctx) | 	listOptions := utils.GetListOptions(ctx) | ||||||
| 
 | 
 | ||||||
| 	users, maxResults, err := user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ | 	uid := ctx.FormInt64("uid") | ||||||
| 		Actor:       ctx.Doer, | 	var users []*user_model.User | ||||||
| 		Keyword:     ctx.FormTrim("q"), | 	var maxResults int64 | ||||||
| 		UID:         ctx.FormInt64("uid"), | 	var err error | ||||||
| 		Type:        user_model.UserTypeIndividual, | 
 | ||||||
| 		ListOptions: listOptions, | 	switch uid { | ||||||
| 	}) | 	case user_model.GhostUserID: | ||||||
| 	if err != nil { | 		maxResults = 1 | ||||||
| 		ctx.JSON(http.StatusInternalServerError, map[string]any{ | 		users = []*user_model.User{user_model.NewGhostUser()} | ||||||
| 			"ok":    false, | 	case user_model.ActionsUserID: | ||||||
| 			"error": err.Error(), | 		maxResults = 1 | ||||||
|  | 		users = []*user_model.User{user_model.NewActionsUser()} | ||||||
|  | 	default: | ||||||
|  | 		users, maxResults, err = user_model.SearchUsers(ctx, &user_model.SearchUserOptions{ | ||||||
|  | 			Actor:       ctx.Doer, | ||||||
|  | 			Keyword:     ctx.FormTrim("q"), | ||||||
|  | 			UID:         uid, | ||||||
|  | 			Type:        user_model.UserTypeIndividual, | ||||||
|  | 			ListOptions: listOptions, | ||||||
| 		}) | 		}) | ||||||
| 		return | 		if err != nil { | ||||||
|  | 			ctx.JSON(http.StatusInternalServerError, map[string]any{ | ||||||
|  | 				"ok":    false, | ||||||
|  | 				"error": err.Error(), | ||||||
|  | 			}) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	ctx.SetLinkHeader(int(maxResults), listOptions.PageSize) | 	ctx.SetLinkHeader(int(maxResults), listOptions.PageSize) | ||||||
|  |  | ||||||
|  | @ -56,6 +56,28 @@ func TestAPIUserSearchNotLoggedIn(t *testing.T) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func TestAPIUserSearchSystemUsers(t *testing.T) { | ||||||
|  | 	defer tests.PrepareTestEnv(t)() | ||||||
|  | 	for _, systemUser := range []*user_model.User{ | ||||||
|  | 		user_model.NewGhostUser(), | ||||||
|  | 		user_model.NewActionsUser(), | ||||||
|  | 	} { | ||||||
|  | 		t.Run(systemUser.Name, func(t *testing.T) { | ||||||
|  | 			req := NewRequestf(t, "GET", "/api/v1/users/search?uid=%d", systemUser.ID) | ||||||
|  | 			resp := MakeRequest(t, req, http.StatusOK) | ||||||
|  | 
 | ||||||
|  | 			var results SearchResults | ||||||
|  | 			DecodeJSON(t, resp, &results) | ||||||
|  | 			assert.NotEmpty(t, results.Data) | ||||||
|  | 			if assert.EqualValues(t, 1, len(results.Data)) { | ||||||
|  | 				user := results.Data[0] | ||||||
|  | 				assert.EqualValues(t, user.UserName, systemUser.Name) | ||||||
|  | 				assert.EqualValues(t, user.ID, systemUser.ID) | ||||||
|  | 			} | ||||||
|  | 		}) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestAPIUserSearchAdminLoggedInUserHidden(t *testing.T) { | func TestAPIUserSearchAdminLoggedInUserHidden(t *testing.T) { | ||||||
| 	defer tests.PrepareTestEnv(t)() | 	defer tests.PrepareTestEnv(t)() | ||||||
| 	adminUsername := "user1" | 	adminUsername := "user1" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue