feat(api): An order_by param for user.ListMyRepos

Add an optional `order_by` parameter to the `user.ListMyRepos`
handler (which handles the `/api/v1/user/repos` route), allowing a user
to sort repos by name (the default), id, or size.

The latter will be useful later for figuring out which repos use most
space, which repos eat most into a user's quota.

Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
This commit is contained in:
Gergely Nagy 2024-07-06 10:43:34 +02:00
parent b0a104d3d4
commit 250f87db59
No known key found for this signature in database
2 changed files with 28 additions and 0 deletions

View file

@ -99,9 +99,15 @@ func ListMyRepos(ctx *context.APIContext) {
// in: query // in: query
// description: page size of results // description: page size of results
// type: integer // type: integer
// - name: order_by
// in: query
// description: order the repositories by name (default), id, or size
// type: string
// responses: // responses:
// "200": // "200":
// "$ref": "#/responses/RepositoryList" // "$ref": "#/responses/RepositoryList"
// "422":
// "$ref": "#/responses/validationError"
opts := &repo_model.SearchRepoOptions{ opts := &repo_model.SearchRepoOptions{
ListOptions: utils.GetListOptions(ctx), ListOptions: utils.GetListOptions(ctx),
@ -110,6 +116,19 @@ func ListMyRepos(ctx *context.APIContext) {
Private: ctx.IsSigned, Private: ctx.IsSigned,
IncludeDescription: true, IncludeDescription: true,
} }
orderBy := ctx.FormTrim("order_by")
switch orderBy {
case "name":
opts.OrderBy = "name ASC"
case "size":
opts.OrderBy = "size DESC"
case "id":
opts.OrderBy = "id ASC"
case "":
default:
ctx.Error(http.StatusUnprocessableEntity, "", "invalid order_by")
return
}
var err error var err error
repos, count, err := repo_model.SearchRepository(ctx, opts) repos, count, err := repo_model.SearchRepository(ctx, opts)

View file

@ -17529,11 +17529,20 @@
"description": "page size of results", "description": "page size of results",
"name": "limit", "name": "limit",
"in": "query" "in": "query"
},
{
"type": "string",
"description": "order the repositories by name (default), id, or size",
"name": "order_by",
"in": "query"
} }
], ],
"responses": { "responses": {
"200": { "200": {
"$ref": "#/responses/RepositoryList" "$ref": "#/responses/RepositoryList"
},
"422": {
"$ref": "#/responses/validationError"
} }
} }
}, },