Skip to content

Commit c40f5d2

Browse files
aswildlunny
authored andcommitted
api: repos/search: add parameters to control the sort order (#3964)
The backend SearchRepositoryByName function supports several sort order options, hook these up to the /repos/search API. New parameters for /repos/search: 'sort': alpha, created, updated, size, or id 'order': asc or desc 'sort' defaults to alpha. 'order' defaults to ascending, and is ignored if 'sort' is not specified. The overall default behavior is unchanged (alphabetically ascending). This partially implements issue #3963 Signed-off-by: Allen Wild <[email protected]>
1 parent 819f50c commit c40f5d2

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

routers/api/v1/repo/repo.go

+47
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,23 @@ import (
2020
api "code.gitea.io/sdk/gitea"
2121
)
2222

23+
var searchOrderByMap = map[string]map[string]models.SearchOrderBy{
24+
"asc": {
25+
"alpha": models.SearchOrderByAlphabetically,
26+
"created": models.SearchOrderByOldest,
27+
"updated": models.SearchOrderByLeastUpdated,
28+
"size": models.SearchOrderBySize,
29+
"id": models.SearchOrderByID,
30+
},
31+
"desc": {
32+
"alpha": models.SearchOrderByAlphabeticallyReverse,
33+
"created": models.SearchOrderByNewest,
34+
"updated": models.SearchOrderByRecentUpdated,
35+
"size": models.SearchOrderBySizeReverse,
36+
"id": models.SearchOrderByIDReverse,
37+
},
38+
}
39+
2340
// Search repositories via options
2441
func Search(ctx *context.APIContext) {
2542
// swagger:operation GET /repos/search repository repoSearch
@@ -53,6 +70,17 @@ func Search(ctx *context.APIContext) {
5370
// in: query
5471
// description: if `uid` is given, search only for repos that the user owns
5572
// type: boolean
73+
// - name: sort
74+
// in: query
75+
// description: sort repos by attribute. Supported values are
76+
// "alpha", "created", "updated", "size", and "id".
77+
// Default is "alpha"
78+
// type: string
79+
// - name: order
80+
// in: query
81+
// description: sort order, either "asc" (ascending) or "desc" (descending).
82+
// Default is "asc", ignored if "sort" is not specified.
83+
// type: string
5684
// responses:
5785
// "200":
5886
// "$ref": "#/responses/SearchResults"
@@ -88,6 +116,25 @@ func Search(ctx *context.APIContext) {
88116
return
89117
}
90118

119+
var sortMode = ctx.Query("sort")
120+
if len(sortMode) > 0 {
121+
var sortOrder = ctx.Query("order")
122+
if len(sortOrder) == 0 {
123+
sortOrder = "asc"
124+
}
125+
if searchModeMap, ok := searchOrderByMap[sortOrder]; ok {
126+
if orderBy, ok := searchModeMap[sortMode]; ok {
127+
opts.OrderBy = orderBy
128+
} else {
129+
ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("Invalid sort mode: \"%s\"", sortMode))
130+
return
131+
}
132+
} else {
133+
ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("Invalid sort order: \"%s\"", sortOrder))
134+
return
135+
}
136+
}
137+
91138
var err error
92139
if opts.OwnerID > 0 {
93140
var repoOwner *models.User

templates/swagger/v1_json.tmpl

+12
Original file line numberDiff line numberDiff line change
@@ -985,6 +985,18 @@
985985
"description": "if `uid` is given, search only for repos that the user owns",
986986
"name": "exclusive",
987987
"in": "query"
988+
},
989+
{
990+
"type": "string",
991+
"description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", and \"id\". Default is \"alpha\"",
992+
"name": "sort",
993+
"in": "query"
994+
},
995+
{
996+
"type": "string",
997+
"description": "sort order, either \"asc\" (ascending) or \"desc\" (descending). Default is \"asc\", ignored if \"sort\" is not specified.",
998+
"name": "order",
999+
"in": "query"
9881000
}
9891001
],
9901002
"responses": {

0 commit comments

Comments
 (0)