diff --git a/routers/api/v1/user/repo.go b/routers/api/v1/user/repo.go index 3b0654ef13..7df13ee413 100644 --- a/routers/api/v1/user/repo.go +++ b/routers/api/v1/user/repo.go @@ -101,8 +101,9 @@ func ListMyRepos(ctx *context.APIContext) { // type: integer // - name: order_by // in: query - // description: order the repositories by name (default), id, or size + // description: order the repositories // type: string + // enum: [name, id, newest, oldest, recentupdate, leastupdate, reversealphabetically, alphabetically, reversesize, size, reversegitsize, gitsize, reverselfssize, lfssize, moststars, feweststars, mostforks, fewestforks] // responses: // "200": // "$ref": "#/responses/RepositoryList" @@ -124,14 +125,15 @@ func ListMyRepos(ctx *context.APIContext) { 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 + if orderBy, ok := repo_model.OrderByFlatMap[orderBy]; ok { + opts.OrderBy = orderBy + } else if orderBy != "" { + ctx.Error(http.StatusUnprocessableEntity, "", "invalid order_by") + return + } } repos, count, err := repo_model.SearchRepository(ctx, opts) diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 4679a13fa3..4cc8f7eddd 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -19361,8 +19361,28 @@ "in": "query" }, { + "enum": [ + "name", + "id", + "newest", + "oldest", + "recentupdate", + "leastupdate", + "reversealphabetically", + "alphabetically", + "reversesize", + "size", + "reversegitsize", + "gitsize", + "reverselfssize", + "lfssize", + "moststars", + "feweststars", + "mostforks", + "fewestforks" + ], "type": "string", - "description": "order the repositories by name (default), id, or size", + "description": "order the repositories", "name": "order_by", "in": "query" } diff --git a/tests/integration/api_repo_test.go b/tests/integration/api_repo_test.go index b635b7099e..6cc7aea2c8 100644 --- a/tests/integration/api_repo_test.go +++ b/tests/integration/api_repo_test.go @@ -764,3 +764,58 @@ func TestAPIRepoCommitPull(t *testing.T) { req = NewRequest(t, "GET", "/api/v1/repos/user2/repo1/commits/not-a-commit/pull") MakeRequest(t, req, http.StatusNotFound) } + +func TestAPIListOwnRepoSorting(t *testing.T) { + defer tests.PrepareTestEnv(t)() + + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) + session := loginUser(t, user.Name) + token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeReadRepository, auth_model.AccessTokenScopeReadUser) + + t.Run("No sorting", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos").AddTokenAuth(token), http.StatusOK) + }) + + t.Run("ID sorting", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + var repos []api.Repository + resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=id").AddTokenAuth(token), http.StatusOK) + DecodeJSON(t, resp, &repos) + + assert.Len(t, repos, 2) + assert.EqualValues(t, 1, repos[0].ID) + assert.EqualValues(t, 2, repos[1].ID) + }) + + t.Run("Name sorting", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + var repos []api.Repository + resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=name").AddTokenAuth(token), http.StatusOK) + DecodeJSON(t, resp, &repos) + + assert.Len(t, repos, 2) + assert.EqualValues(t, "big_test_private_4", repos[0].Name) + // Postgres doesn't do ascii sorting. + if setting.Database.Type.IsPostgreSQL() { + assert.EqualValues(t, "commitsonpr", repos[1].Name) + } else { + assert.EqualValues(t, "commits_search_test", repos[1].Name) + } + }) + + t.Run("Reverse alphabetic sorting", func(t *testing.T) { + defer tests.PrintCurrentTest(t)() + + var repos []api.Repository + resp := MakeRequest(t, NewRequest(t, "GET", "/api/v1/user/repos?limit=2&order_by=reversealphabetically").AddTokenAuth(token), http.StatusOK) + DecodeJSON(t, resp, &repos) + + assert.Len(t, repos, 2) + assert.EqualValues(t, "utf8", repos[0].Name) + assert.EqualValues(t, "test_workflows", repos[1].Name) + }) +}