From 28ac6028057b1964f1f9a01c746837ffad25cc57 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 6 May 2024 17:14:17 +0200 Subject: [PATCH 1/5] unify repo search order by logic --- models/repo/repo_list.go | 25 ------------- models/repo/search.go | 70 +++++++++++++++++++++++++++++++------ routers/web/explore/repo.go | 39 +++------------------ 3 files changed, 65 insertions(+), 69 deletions(-) diff --git a/models/repo/repo_list.go b/models/repo/repo_list.go index 987c7df9b0eb0..6cce2d33a3ae7 100644 --- a/models/repo/repo_list.go +++ b/models/repo/repo_list.go @@ -205,31 +205,6 @@ type SearchRepoOptions struct { OnlyShowRelevant bool } -// SearchOrderBy is used to sort the result -type SearchOrderBy string - -func (s SearchOrderBy) String() string { - return string(s) -} - -// Strings for sorting result -const ( - SearchOrderByAlphabetically SearchOrderBy = "name ASC" - SearchOrderByAlphabeticallyReverse SearchOrderBy = "name DESC" - SearchOrderByLeastUpdated SearchOrderBy = "updated_unix ASC" - SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC" - SearchOrderByOldest SearchOrderBy = "created_unix ASC" - SearchOrderByNewest SearchOrderBy = "created_unix DESC" - SearchOrderBySize SearchOrderBy = "size ASC" - SearchOrderBySizeReverse SearchOrderBy = "size DESC" - SearchOrderByID SearchOrderBy = "id ASC" - SearchOrderByIDReverse SearchOrderBy = "id DESC" - SearchOrderByStars SearchOrderBy = "num_stars ASC" - SearchOrderByStarsReverse SearchOrderBy = "num_stars DESC" - SearchOrderByForks SearchOrderBy = "num_forks ASC" - SearchOrderByForksReverse SearchOrderBy = "num_forks DESC" -) - // UserOwnedRepoCond returns user ownered repositories func UserOwnedRepoCond(userID int64) builder.Cond { return builder.Eq{ diff --git a/models/repo/search.go b/models/repo/search.go index 54d6dcfb440c9..80b5c430bfe70 100644 --- a/models/repo/search.go +++ b/models/repo/search.go @@ -5,20 +5,70 @@ package repo import "code.gitea.io/gitea/models/db" +// Strings for sorting result +const ( + SearchOrderByAlphabetically db.SearchOrderBy = "owner_name ASC, name ASC" + SearchOrderByAlphabeticallyReverse db.SearchOrderBy = "owner_name DESC, name DESC" + SearchOrderByLeastUpdated db.SearchOrderBy = db.SearchOrderByLeastUpdated + SearchOrderByRecentUpdated db.SearchOrderBy = db.SearchOrderByRecentUpdated + SearchOrderByOldest db.SearchOrderBy = db.SearchOrderByOldest + SearchOrderByNewest db.SearchOrderBy = db.SearchOrderByNewest + SearchOrderBySize db.SearchOrderBy = db.SearchOrderBySize + SearchOrderBySizeReverse db.SearchOrderBy = db.SearchOrderBySizeReverse + SearchOrderByID db.SearchOrderBy = db.SearchOrderByID + SearchOrderByIDReverse db.SearchOrderBy = db.SearchOrderByIDReverse + SearchOrderByStars db.SearchOrderBy = db.SearchOrderByStars + SearchOrderByStarsReverse db.SearchOrderBy = db.SearchOrderByStarsReverse + SearchOrderByForks db.SearchOrderBy = db.SearchOrderByForks + SearchOrderByForksReverse db.SearchOrderBy = db.SearchOrderByForksReverse + SearchOrderByGitSize db.SearchOrderBy = db.SearchOrderByGitSize + SearchOrderByGitSizeReverse db.SearchOrderBy = db.SearchOrderByGitSizeReverse + SearchOrderByLFSSize db.SearchOrderBy = db.SearchOrderByLFSSize + SearchOrderByLFSSizeReverse db.SearchOrderBy = db.SearchOrderByLFSSizeReverse +) + // SearchOrderByMap represents all possible search order var SearchOrderByMap = map[string]map[string]db.SearchOrderBy{ "asc": { - "alpha": "owner_name ASC, name ASC", - "created": db.SearchOrderByOldest, - "updated": db.SearchOrderByLeastUpdated, - "size": db.SearchOrderBySize, - "id": db.SearchOrderByID, + "alpha": SearchOrderByAlphabetically, + "created": SearchOrderByOldest, + "updated": SearchOrderByLeastUpdated, + "size": SearchOrderBySize, + "git_size": SearchOrderByGitSize, + "lfs_size": SearchOrderByLFSSize, + "id": SearchOrderByID, + "num_stars": SearchOrderByStars, + "num_forks": SearchOrderByForks, }, "desc": { - "alpha": "owner_name DESC, name DESC", - "created": db.SearchOrderByNewest, - "updated": db.SearchOrderByRecentUpdated, - "size": db.SearchOrderBySizeReverse, - "id": db.SearchOrderByIDReverse, + "alpha": SearchOrderByAlphabeticallyReverse, + "created": SearchOrderByNewest, + "updated": SearchOrderByRecentUpdated, + "size": SearchOrderBySizeReverse, + "git_size": SearchOrderByGitSizeReverse, + "lfs_size": SearchOrderByLFSSizeReverse, + "id": SearchOrderByIDReverse, + "num_stars": SearchOrderByStarsReverse, + "num_forks": SearchOrderByForksReverse, }, } + +// SearchOrderByFlatMap is similar to SearchOrderByMap but use human language keywords +// to decide between asc and desc +var SearchOrderByFlatMap = map[string]db.SearchOrderBy{ + "newest": SearchOrderByMap["desc"]["created"], + "oldest": SearchOrderByMap["asc"]["created"], + "leastupdate": SearchOrderByMap["asc"]["updated"], + "reversealphabetically": SearchOrderByMap["desc"]["alpha"], + "alphabetically": SearchOrderByMap["asc"]["alpha"], + "reversesize": SearchOrderByMap["desc"]["size"], + "size": SearchOrderByMap["asc"]["size"], + "reversegitsize": SearchOrderByMap["desc"]["git_size"], + "gitsize": SearchOrderByMap["asc"]["git_size"], + "reverselfssize": SearchOrderByMap["desc"]["lfs_size"], + "lfssize": SearchOrderByMap["asc"]["lfs_size"], + "moststars": SearchOrderByMap["desc"]["num_stars"], + "feweststars": SearchOrderByMap["asc"]["num_stars"], + "mostforks": SearchOrderByMap["desc"]["num_forks"], + "fewestforks": SearchOrderByMap["asc"]["num_forks"], +} diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go index 66477a255cccc..653646d76855f 100644 --- a/routers/web/explore/repo.go +++ b/routers/web/explore/repo.go @@ -61,43 +61,14 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { if sortOrder == "" { sortOrder = setting.UI.ExploreDefaultSort } - ctx.Data["SortType"] = sortOrder - switch sortOrder { - case "newest": - orderBy = db.SearchOrderByNewest - case "oldest": - orderBy = db.SearchOrderByOldest - case "leastupdate": - orderBy = db.SearchOrderByLeastUpdated - case "reversealphabetically": - orderBy = db.SearchOrderByAlphabeticallyReverse - case "alphabetically": - orderBy = db.SearchOrderByAlphabetically - case "reversesize": - orderBy = db.SearchOrderBySizeReverse - case "size": - orderBy = db.SearchOrderBySize - case "reversegitsize": - orderBy = db.SearchOrderByGitSizeReverse - case "gitsize": - orderBy = db.SearchOrderByGitSize - case "reverselfssize": - orderBy = db.SearchOrderByLFSSizeReverse - case "lfssize": - orderBy = db.SearchOrderByLFSSize - case "moststars": - orderBy = db.SearchOrderByStarsReverse - case "feweststars": - orderBy = db.SearchOrderByStars - case "mostforks": - orderBy = db.SearchOrderByForksReverse - case "fewestforks": - orderBy = db.SearchOrderByForks - default: - ctx.Data["SortType"] = "recentupdate" + if order, ok := repo_model.SearchOrderByFlatMap[sortOrder]; ok { + orderBy = order + } else { + sortOrder = "recentupdate" orderBy = db.SearchOrderByRecentUpdated } + ctx.Data["SortType"] = sortOrder keyword := ctx.FormTrim("q") From 0146a0242cfc3cb73662cef6555fff1d19a2d538 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 6 May 2024 17:22:07 +0200 Subject: [PATCH 2/5] update swagger docu --- routers/api/v1/repo/repo.go | 2 +- templates/swagger/v1_json.tmpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 7f35a7fe4176b..7d8e6e3deb6ea 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -107,7 +107,7 @@ func Search(ctx *context.APIContext) { // - name: sort // in: query // description: sort repos by attribute. Supported values are - // "alpha", "created", "updated", "size", and "id". + // "alpha", "created", "updated", "size", "git_size", "lfs_size", "num_stars", "num_forks" and "id". // Default is "alpha" // type: string // - name: order diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 5ca499e708930..e09b03d744ffb 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -3689,7 +3689,7 @@ }, { "type": "string", - "description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", and \"id\". Default is \"alpha\"", + "description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", \"git_size\", \"lfs_size\", \"num_stars\", \"num_forks\" and \"id\". Default is \"alpha\"", "name": "sort", "in": "query" }, From 67bcff1429405f6b6c1896f5e9d23710020c7f14 Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 6 May 2024 17:24:32 +0200 Subject: [PATCH 3/5] better keywords --- models/repo/search.go | 44 +++++++++++++++++----------------- routers/api/v1/repo/repo.go | 2 +- templates/swagger/v1_json.tmpl | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/models/repo/search.go b/models/repo/search.go index 80b5c430bfe70..5d829a2042bce 100644 --- a/models/repo/search.go +++ b/models/repo/search.go @@ -30,26 +30,26 @@ const ( // SearchOrderByMap represents all possible search order var SearchOrderByMap = map[string]map[string]db.SearchOrderBy{ "asc": { - "alpha": SearchOrderByAlphabetically, - "created": SearchOrderByOldest, - "updated": SearchOrderByLeastUpdated, - "size": SearchOrderBySize, - "git_size": SearchOrderByGitSize, - "lfs_size": SearchOrderByLFSSize, - "id": SearchOrderByID, - "num_stars": SearchOrderByStars, - "num_forks": SearchOrderByForks, + "alpha": SearchOrderByAlphabetically, + "created": SearchOrderByOldest, + "updated": SearchOrderByLeastUpdated, + "size": SearchOrderBySize, + "git_size": SearchOrderByGitSize, + "lfs_size": SearchOrderByLFSSize, + "id": SearchOrderByID, + "stars": SearchOrderByStars, + "forks": SearchOrderByForks, }, "desc": { - "alpha": SearchOrderByAlphabeticallyReverse, - "created": SearchOrderByNewest, - "updated": SearchOrderByRecentUpdated, - "size": SearchOrderBySizeReverse, - "git_size": SearchOrderByGitSizeReverse, - "lfs_size": SearchOrderByLFSSizeReverse, - "id": SearchOrderByIDReverse, - "num_stars": SearchOrderByStarsReverse, - "num_forks": SearchOrderByForksReverse, + "alpha": SearchOrderByAlphabeticallyReverse, + "created": SearchOrderByNewest, + "updated": SearchOrderByRecentUpdated, + "size": SearchOrderBySizeReverse, + "git_size": SearchOrderByGitSizeReverse, + "lfs_size": SearchOrderByLFSSizeReverse, + "id": SearchOrderByIDReverse, + "stars": SearchOrderByStarsReverse, + "forks": SearchOrderByForksReverse, }, } @@ -67,8 +67,8 @@ var SearchOrderByFlatMap = map[string]db.SearchOrderBy{ "gitsize": SearchOrderByMap["asc"]["git_size"], "reverselfssize": SearchOrderByMap["desc"]["lfs_size"], "lfssize": SearchOrderByMap["asc"]["lfs_size"], - "moststars": SearchOrderByMap["desc"]["num_stars"], - "feweststars": SearchOrderByMap["asc"]["num_stars"], - "mostforks": SearchOrderByMap["desc"]["num_forks"], - "fewestforks": SearchOrderByMap["asc"]["num_forks"], + "moststars": SearchOrderByMap["desc"]["stars"], + "feweststars": SearchOrderByMap["asc"]["stars"], + "mostforks": SearchOrderByMap["desc"]["forks"], + "fewestforks": SearchOrderByMap["asc"]["forks"], } diff --git a/routers/api/v1/repo/repo.go b/routers/api/v1/repo/repo.go index 7d8e6e3deb6ea..6fc63e2996b89 100644 --- a/routers/api/v1/repo/repo.go +++ b/routers/api/v1/repo/repo.go @@ -107,7 +107,7 @@ func Search(ctx *context.APIContext) { // - name: sort // in: query // description: sort repos by attribute. Supported values are - // "alpha", "created", "updated", "size", "git_size", "lfs_size", "num_stars", "num_forks" and "id". + // "alpha", "created", "updated", "size", "git_size", "lfs_size", "stars", "forks" and "id". // Default is "alpha" // type: string // - name: order diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index e09b03d744ffb..11d0745bc7162 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -3689,7 +3689,7 @@ }, { "type": "string", - "description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", \"git_size\", \"lfs_size\", \"num_stars\", \"num_forks\" and \"id\". Default is \"alpha\"", + "description": "sort repos by attribute. Supported values are \"alpha\", \"created\", \"updated\", \"size\", \"git_size\", \"lfs_size\", \"stars\", \"forks\" and \"id\". Default is \"alpha\"", "name": "sort", "in": "query" }, From 6739a3f72d1cf2e3b5bff9a2113233bd86f5b97a Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Tue, 7 May 2024 14:15:30 +0200 Subject: [PATCH 4/5] move repo only related orderBy const to repo_models --- models/db/search.go | 6 ------ models/repo/search.go | 34 ++++++++++++++++++---------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/models/db/search.go b/models/db/search.go index aa577f08e0439..37565f45e1f9e 100644 --- a/models/db/search.go +++ b/models/db/search.go @@ -18,12 +18,6 @@ const ( SearchOrderByRecentUpdated SearchOrderBy = "updated_unix DESC" SearchOrderByOldest SearchOrderBy = "created_unix ASC" SearchOrderByNewest SearchOrderBy = "created_unix DESC" - SearchOrderBySize SearchOrderBy = "size ASC" - SearchOrderBySizeReverse SearchOrderBy = "size DESC" - SearchOrderByGitSize SearchOrderBy = "git_size ASC" - SearchOrderByGitSizeReverse SearchOrderBy = "git_size DESC" - SearchOrderByLFSSize SearchOrderBy = "lfs_size ASC" - SearchOrderByLFSSizeReverse SearchOrderBy = "lfs_size DESC" SearchOrderByID SearchOrderBy = "id ASC" SearchOrderByIDReverse SearchOrderBy = "id DESC" SearchOrderByStars SearchOrderBy = "num_stars ASC" diff --git a/models/repo/search.go b/models/repo/search.go index 5d829a2042bce..c500d41be8457 100644 --- a/models/repo/search.go +++ b/models/repo/search.go @@ -7,24 +7,26 @@ import "code.gitea.io/gitea/models/db" // Strings for sorting result const ( + // only used for repos SearchOrderByAlphabetically db.SearchOrderBy = "owner_name ASC, name ASC" SearchOrderByAlphabeticallyReverse db.SearchOrderBy = "owner_name DESC, name DESC" - SearchOrderByLeastUpdated db.SearchOrderBy = db.SearchOrderByLeastUpdated - SearchOrderByRecentUpdated db.SearchOrderBy = db.SearchOrderByRecentUpdated - SearchOrderByOldest db.SearchOrderBy = db.SearchOrderByOldest - SearchOrderByNewest db.SearchOrderBy = db.SearchOrderByNewest - SearchOrderBySize db.SearchOrderBy = db.SearchOrderBySize - SearchOrderBySizeReverse db.SearchOrderBy = db.SearchOrderBySizeReverse - SearchOrderByID db.SearchOrderBy = db.SearchOrderByID - SearchOrderByIDReverse db.SearchOrderBy = db.SearchOrderByIDReverse - SearchOrderByStars db.SearchOrderBy = db.SearchOrderByStars - SearchOrderByStarsReverse db.SearchOrderBy = db.SearchOrderByStarsReverse - SearchOrderByForks db.SearchOrderBy = db.SearchOrderByForks - SearchOrderByForksReverse db.SearchOrderBy = db.SearchOrderByForksReverse - SearchOrderByGitSize db.SearchOrderBy = db.SearchOrderByGitSize - SearchOrderByGitSizeReverse db.SearchOrderBy = db.SearchOrderByGitSizeReverse - SearchOrderByLFSSize db.SearchOrderBy = db.SearchOrderByLFSSize - SearchOrderByLFSSizeReverse db.SearchOrderBy = db.SearchOrderByLFSSizeReverse + SearchOrderBySize db.SearchOrderBy = "size ASC" + SearchOrderBySizeReverse db.SearchOrderBy = "size DESC" + SearchOrderByGitSize db.SearchOrderBy = "git_size ASC" + SearchOrderByGitSizeReverse db.SearchOrderBy = "git_size DESC" + SearchOrderByLFSSize db.SearchOrderBy = "lfs_size ASC" + SearchOrderByLFSSizeReverse db.SearchOrderBy = "lfs_size DESC" + // alias as also used elsewhere + SearchOrderByLeastUpdated db.SearchOrderBy = db.SearchOrderByLeastUpdated + SearchOrderByRecentUpdated db.SearchOrderBy = db.SearchOrderByRecentUpdated + SearchOrderByOldest db.SearchOrderBy = db.SearchOrderByOldest + SearchOrderByNewest db.SearchOrderBy = db.SearchOrderByNewest + SearchOrderByID db.SearchOrderBy = db.SearchOrderByID + SearchOrderByIDReverse db.SearchOrderBy = db.SearchOrderByIDReverse + SearchOrderByStars db.SearchOrderBy = db.SearchOrderByStars + SearchOrderByStarsReverse db.SearchOrderBy = db.SearchOrderByStarsReverse + SearchOrderByForks db.SearchOrderBy = db.SearchOrderByForks + SearchOrderByForksReverse db.SearchOrderBy = db.SearchOrderByForksReverse ) // SearchOrderByMap represents all possible search order From 97f6b1e45568a4a491a36f82219589da5f61a2fd Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Thu, 13 Jun 2024 10:44:52 +0200 Subject: [PATCH 5/5] sanitize user sort input --- routers/web/explore/repo.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/routers/web/explore/repo.go b/routers/web/explore/repo.go index 653646d76855f..22b1fc5bf9d93 100644 --- a/routers/web/explore/repo.go +++ b/routers/web/explore/repo.go @@ -6,6 +6,7 @@ package explore import ( "fmt" "net/http" + "strings" "code.gitea.io/gitea/models/db" repo_model "code.gitea.io/gitea/models/repo" @@ -57,7 +58,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { orderBy db.SearchOrderBy ) - sortOrder := ctx.FormString("sort") + sortOrder := strings.ToLower(ctx.FormString("sort")) if sortOrder == "" { sortOrder = setting.UI.ExploreDefaultSort }