mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +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" | ||||
| 	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" | ||||
|   | ||||
| @@ -207,31 +207,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{ | ||||
|   | ||||
| @@ -5,20 +5,72 @@ package repo | ||||
|  | ||||
| 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 | ||||
| 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, | ||||
| 		"stars":    SearchOrderByStars, | ||||
| 		"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, | ||||
| 		"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 | ||||
| 	//   in: query | ||||
| 	//   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" | ||||
| 	//   type: string | ||||
| 	// - name: order | ||||
|   | ||||
| @@ -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,47 +58,18 @@ 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 | ||||
| 	} | ||||
| 	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") | ||||
|  | ||||
|   | ||||
							
								
								
									
										2
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							| @@ -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\", \"stars\", \"forks\" and \"id\". Default is \"alpha\"", | ||||
|             "name": "sort", | ||||
|             "in": "query" | ||||
|           }, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user