aboutsummaryrefslogtreecommitdiffstats
path: root/models
diff options
context:
space:
mode:
authorKN4CK3R <admin@oldschoolhack.me>2022-10-23 03:18:15 +0200
committerGitHub <noreply@github.com>2022-10-23 09:18:15 +0800
commit876ee8c3cd956025aadda14175f80ce4cccfe1bb (patch)
treee3108620f171979e0b9606e993317190ec262b49 /models
parent63ebb53fd526021666bd9fab1f9d092380f7a2f4 (diff)
downloadgitea-876ee8c3cd956025aadda14175f80ce4cccfe1bb.tar.gz
gitea-876ee8c3cd956025aadda14175f80ce4cccfe1bb.zip
Allow package version sorting (#21453)
Diffstat (limited to 'models')
-rw-r--r--models/packages/container/search.go19
-rw-r--r--models/packages/package_version.go23
2 files changed, 34 insertions, 8 deletions
diff --git a/models/packages/container/search.go b/models/packages/container/search.go
index a3409fe743..e4a5a53848 100644
--- a/models/packages/container/search.go
+++ b/models/packages/container/search.go
@@ -165,6 +165,7 @@ type ImageTagsSearchOptions struct {
PackageID int64
Query string
IsTagged bool
+ Sort packages.VersionSort
db.Paginator
}
@@ -195,12 +196,26 @@ func (opts *ImageTagsSearchOptions) toConds() builder.Cond {
return cond
}
+func (opts *ImageTagsSearchOptions) configureOrderBy(e db.Engine) {
+ switch opts.Sort {
+ case packages.SortVersionDesc:
+ e.Desc("package_version.version")
+ case packages.SortVersionAsc:
+ e.Asc("package_version.version")
+ case packages.SortCreatedAsc:
+ e.Asc("package_version.created_unix")
+ default:
+ e.Desc("package_version.created_unix")
+ }
+}
+
// SearchImageTags gets a sorted list of the tags of an image
func SearchImageTags(ctx context.Context, opts *ImageTagsSearchOptions) ([]*packages.PackageVersion, int64, error) {
sess := db.GetEngine(ctx).
Join("INNER", "package", "package.id = package_version.package_id").
- Where(opts.toConds()).
- Desc("package_version.created_unix")
+ Where(opts.toConds())
+
+ opts.configureOrderBy(sess)
if opts.Paginator != nil {
sess = db.SetSessionPagination(sess, opts)
diff --git a/models/packages/package_version.go b/models/packages/package_version.go
index 5479bae1c2..f9965bcb74 100644
--- a/models/packages/package_version.go
+++ b/models/packages/package_version.go
@@ -163,6 +163,17 @@ type SearchValue struct {
ExactMatch bool
}
+type VersionSort = string
+
+const (
+ SortNameAsc VersionSort = "name_asc"
+ SortNameDesc VersionSort = "name_desc"
+ SortVersionAsc VersionSort = "version_asc"
+ SortVersionDesc VersionSort = "version_desc"
+ SortCreatedAsc VersionSort = "created_asc"
+ SortCreatedDesc VersionSort = "created_desc"
+)
+
// PackageSearchOptions are options for SearchXXX methods
// Besides IsInternal are all fields optional and are not used if they have their default value (nil, "", 0)
type PackageSearchOptions struct {
@@ -176,7 +187,7 @@ type PackageSearchOptions struct {
IsInternal util.OptionalBool
HasFileWithName string // only results are found which are associated with a file with the specific name
HasFiles util.OptionalBool // only results are found which have associated files
- Sort string
+ Sort VersionSort
db.Paginator
}
@@ -254,15 +265,15 @@ func (opts *PackageSearchOptions) toConds() builder.Cond {
func (opts *PackageSearchOptions) configureOrderBy(e db.Engine) {
switch opts.Sort {
- case "alphabetically":
+ case SortNameAsc:
e.Asc("package.name")
- case "reversealphabetically":
+ case SortNameDesc:
e.Desc("package.name")
- case "highestversion":
+ case SortVersionDesc:
e.Desc("package_version.version")
- case "lowestversion":
+ case SortVersionAsc:
e.Asc("package_version.version")
- case "oldest":
+ case SortCreatedAsc:
e.Asc("package_version.created_unix")
default:
e.Desc("package_version.created_unix")