summaryrefslogtreecommitdiffstats
path: root/routers/api/v1
diff options
context:
space:
mode:
authorAllen Wild <aswild@users.noreply.github.com>2018-08-02 04:10:02 -0400
committerLunny Xiao <xiaolunwen@gmail.com>2018-08-02 16:10:02 +0800
commitc40f5d2d4cad5fa02faa360f1cad4438f957b1d5 (patch)
treeb1079fee355fb65d9350506a90a4a60e88578dd1 /routers/api/v1
parent819f50ccd50b6f7ff320e1341cf430356d5c01fb (diff)
downloadgitea-c40f5d2d4cad5fa02faa360f1cad4438f957b1d5.tar.gz
gitea-c40f5d2d4cad5fa02faa360f1cad4438f957b1d5.zip
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 <allenwild93@gmail.com>
Diffstat (limited to 'routers/api/v1')
-rw-r--r--routers/api/v1/repo/repo.go47
1 files changed, 47 insertions, 0 deletions
diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go
index 044b1e9c18..90acde2eea 100644
--- a/routers/api/v1/repo/repo.go
+++ b/routers/api/v1/repo/repo.go
@@ -20,6 +20,23 @@ import (
api "code.gitea.io/sdk/gitea"
)
+var searchOrderByMap = map[string]map[string]models.SearchOrderBy{
+ "asc": {
+ "alpha": models.SearchOrderByAlphabetically,
+ "created": models.SearchOrderByOldest,
+ "updated": models.SearchOrderByLeastUpdated,
+ "size": models.SearchOrderBySize,
+ "id": models.SearchOrderByID,
+ },
+ "desc": {
+ "alpha": models.SearchOrderByAlphabeticallyReverse,
+ "created": models.SearchOrderByNewest,
+ "updated": models.SearchOrderByRecentUpdated,
+ "size": models.SearchOrderBySizeReverse,
+ "id": models.SearchOrderByIDReverse,
+ },
+}
+
// Search repositories via options
func Search(ctx *context.APIContext) {
// swagger:operation GET /repos/search repository repoSearch
@@ -53,6 +70,17 @@ func Search(ctx *context.APIContext) {
// in: query
// description: if `uid` is given, search only for repos that the user owns
// type: boolean
+ // - name: sort
+ // in: query
+ // description: sort repos by attribute. Supported values are
+ // "alpha", "created", "updated", "size", and "id".
+ // Default is "alpha"
+ // type: string
+ // - name: order
+ // in: query
+ // description: sort order, either "asc" (ascending) or "desc" (descending).
+ // Default is "asc", ignored if "sort" is not specified.
+ // type: string
// responses:
// "200":
// "$ref": "#/responses/SearchResults"
@@ -88,6 +116,25 @@ func Search(ctx *context.APIContext) {
return
}
+ var sortMode = ctx.Query("sort")
+ if len(sortMode) > 0 {
+ var sortOrder = ctx.Query("order")
+ if len(sortOrder) == 0 {
+ sortOrder = "asc"
+ }
+ if searchModeMap, ok := searchOrderByMap[sortOrder]; ok {
+ if orderBy, ok := searchModeMap[sortMode]; ok {
+ opts.OrderBy = orderBy
+ } else {
+ ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("Invalid sort mode: \"%s\"", sortMode))
+ return
+ }
+ } else {
+ ctx.Error(http.StatusUnprocessableEntity, "", fmt.Errorf("Invalid sort order: \"%s\"", sortOrder))
+ return
+ }
+ }
+
var err error
if opts.OwnerID > 0 {
var repoOwner *models.User