mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	[Refactor] Unify repo search order by logic (#30876)
have repo OrderBy definitions defined in one place and use a single type for OrderBy database options
This commit is contained in:
		| @@ -18,12 +18,6 @@ const ( | |||||||
| 	SearchOrderByRecentUpdated         SearchOrderBy = "updated_unix DESC" | 	SearchOrderByRecentUpdated         SearchOrderBy = "updated_unix DESC" | ||||||
| 	SearchOrderByOldest                SearchOrderBy = "created_unix ASC" | 	SearchOrderByOldest                SearchOrderBy = "created_unix ASC" | ||||||
| 	SearchOrderByNewest                SearchOrderBy = "created_unix DESC" | 	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" | 	SearchOrderByID                    SearchOrderBy = "id ASC" | ||||||
| 	SearchOrderByIDReverse             SearchOrderBy = "id DESC" | 	SearchOrderByIDReverse             SearchOrderBy = "id DESC" | ||||||
| 	SearchOrderByStars                 SearchOrderBy = "num_stars ASC" | 	SearchOrderByStars                 SearchOrderBy = "num_stars ASC" | ||||||
|   | |||||||
| @@ -207,31 +207,6 @@ type SearchRepoOptions struct { | |||||||
| 	OnlyShowRelevant bool | 	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 | // UserOwnedRepoCond returns user ownered repositories | ||||||
| func UserOwnedRepoCond(userID int64) builder.Cond { | func UserOwnedRepoCond(userID int64) builder.Cond { | ||||||
| 	return builder.Eq{ | 	return builder.Eq{ | ||||||
|   | |||||||
| @@ -5,20 +5,72 @@ package repo | |||||||
|  |  | ||||||
| import "code.gitea.io/gitea/models/db" | 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" | ||||||
|  | 	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 | // SearchOrderByMap represents all possible search order | ||||||
| var SearchOrderByMap = map[string]map[string]db.SearchOrderBy{ | var SearchOrderByMap = map[string]map[string]db.SearchOrderBy{ | ||||||
| 	"asc": { | 	"asc": { | ||||||
| 		"alpha":   "owner_name ASC, name ASC", | 		"alpha":    SearchOrderByAlphabetically, | ||||||
| 		"created": db.SearchOrderByOldest, | 		"created":  SearchOrderByOldest, | ||||||
| 		"updated": db.SearchOrderByLeastUpdated, | 		"updated":  SearchOrderByLeastUpdated, | ||||||
| 		"size":    db.SearchOrderBySize, | 		"size":     SearchOrderBySize, | ||||||
| 		"id":      db.SearchOrderByID, | 		"git_size": SearchOrderByGitSize, | ||||||
|  | 		"lfs_size": SearchOrderByLFSSize, | ||||||
|  | 		"id":       SearchOrderByID, | ||||||
|  | 		"stars":    SearchOrderByStars, | ||||||
|  | 		"forks":    SearchOrderByForks, | ||||||
| 	}, | 	}, | ||||||
| 	"desc": { | 	"desc": { | ||||||
| 		"alpha":   "owner_name DESC, name DESC", | 		"alpha":    SearchOrderByAlphabeticallyReverse, | ||||||
| 		"created": db.SearchOrderByNewest, | 		"created":  SearchOrderByNewest, | ||||||
| 		"updated": db.SearchOrderByRecentUpdated, | 		"updated":  SearchOrderByRecentUpdated, | ||||||
| 		"size":    db.SearchOrderBySizeReverse, | 		"size":     SearchOrderBySizeReverse, | ||||||
| 		"id":      db.SearchOrderByIDReverse, | 		"git_size": SearchOrderByGitSizeReverse, | ||||||
|  | 		"lfs_size": SearchOrderByLFSSizeReverse, | ||||||
|  | 		"id":       SearchOrderByIDReverse, | ||||||
|  | 		"stars":    SearchOrderByStarsReverse, | ||||||
|  | 		"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"]["stars"], | ||||||
|  | 	"feweststars":           SearchOrderByMap["asc"]["stars"], | ||||||
|  | 	"mostforks":             SearchOrderByMap["desc"]["forks"], | ||||||
|  | 	"fewestforks":           SearchOrderByMap["asc"]["forks"], | ||||||
|  | } | ||||||
|   | |||||||
| @@ -107,7 +107,7 @@ func Search(ctx *context.APIContext) { | |||||||
| 	// - name: sort | 	// - name: sort | ||||||
| 	//   in: query | 	//   in: query | ||||||
| 	//   description: sort repos by attribute. Supported values are | 	//   description: sort repos by attribute. Supported values are | ||||||
| 	//                "alpha", "created", "updated", "size", and "id". | 	//                "alpha", "created", "updated", "size", "git_size", "lfs_size", "stars", "forks" and "id". | ||||||
| 	//                Default is "alpha" | 	//                Default is "alpha" | ||||||
| 	//   type: string | 	//   type: string | ||||||
| 	// - name: order | 	// - name: order | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ package explore | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/db" | 	"code.gitea.io/gitea/models/db" | ||||||
| 	repo_model "code.gitea.io/gitea/models/repo" | 	repo_model "code.gitea.io/gitea/models/repo" | ||||||
| @@ -57,47 +58,18 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { | |||||||
| 		orderBy db.SearchOrderBy | 		orderBy db.SearchOrderBy | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	sortOrder := ctx.FormString("sort") | 	sortOrder := strings.ToLower(ctx.FormString("sort")) | ||||||
| 	if sortOrder == "" { | 	if sortOrder == "" { | ||||||
| 		sortOrder = setting.UI.ExploreDefaultSort | 		sortOrder = setting.UI.ExploreDefaultSort | ||||||
| 	} | 	} | ||||||
| 	ctx.Data["SortType"] = sortOrder |  | ||||||
|  |  | ||||||
| 	switch sortOrder { | 	if order, ok := repo_model.SearchOrderByFlatMap[sortOrder]; ok { | ||||||
| 	case "newest": | 		orderBy = order | ||||||
| 		orderBy = db.SearchOrderByNewest | 	} else { | ||||||
| 	case "oldest": | 		sortOrder = "recentupdate" | ||||||
| 		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" |  | ||||||
| 		orderBy = db.SearchOrderByRecentUpdated | 		orderBy = db.SearchOrderByRecentUpdated | ||||||
| 	} | 	} | ||||||
|  | 	ctx.Data["SortType"] = sortOrder | ||||||
|  |  | ||||||
| 	keyword := ctx.FormTrim("q") | 	keyword := ctx.FormTrim("q") | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							| @@ -3689,7 +3689,7 @@ | |||||||
|           }, |           }, | ||||||
|           { |           { | ||||||
|             "type": "string", |             "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\", \"stars\", \"forks\" and \"id\". Default is \"alpha\"", | ||||||
|             "name": "sort", |             "name": "sort", | ||||||
|             "in": "query" |             "in": "query" | ||||||
|           }, |           }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user