From bc208783ccf3e167902e3d505d4927dcc121c158 Mon Sep 17 00:00:00 2001 From: Allen Wild Date: Sun, 13 May 2018 23:20:29 -0400 Subject: [PATCH] api: repos/search: add parameters to control the sort order 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 --- public/swagger.v1.json | 12 ++++++++++ routers/api/v1/repo/repo.go | 47 +++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/public/swagger.v1.json b/public/swagger.v1.json index c5b1baa9ada0..55e8d5d0514a 100644 --- a/public/swagger.v1.json +++ b/public/swagger.v1.json @@ -915,6 +915,18 @@ "description": "if `uid` is given, search only for repos that the user owns", "name": "exclusive", "in": "query" + }, + { + "type": "string", + "description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", and \"id\". Default is \"alpha\"", + "name": "sort", + "in": "query" + }, + { + "type": "string", + "description": "sort order, either \"asc\" (ascending) or \"desc\" (descending). Default is \"asc\", ignored if \"sort\" is not specified.", + "name": "order", + "in": "query" } ], "responses": { diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 9f64dda61df8..6c0170d00751 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