From ba12aed5726e088a236c4e75ad59650c5c51d5fd Mon Sep 17 00:00:00 2001
From: dragon <ExplodingFKL@gmail.com>
Date: Fri, 6 Dec 2024 14:51:49 +0800
Subject: [PATCH] cleanup package route

---
 routers/api/packages/api.go              | 64 ++----------------------
 routers/api/packages/arch/arch.go        | 45 ++++++++++++-----
 routers/web/user/package.go              |  4 +-
 templates/package/content/arch.tmpl      |  2 +-
 templates/package/content/container.tmpl |  4 +-
 5 files changed, 42 insertions(+), 77 deletions(-)

diff --git a/routers/api/packages/api.go b/routers/api/packages/api.go
index 1337ce4569..b6666c9269 100644
--- a/routers/api/packages/api.go
+++ b/routers/api/packages/api.go
@@ -153,66 +153,10 @@ func CommonRoutes() *web.Route {
 			})
 		}, reqPackageAccess(perm.AccessModeRead))
 		r.Group("/arch", func() {
-			r.Group("/repository.key", func() {
-				r.Head("", arch.GetRepositoryKey)
-				r.Get("", arch.GetRepositoryKey)
-			})
-
-			r.Methods("HEAD,GET,PUT,DELETE", "*", func(ctx *context.Context) {
-				pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/")
-				groupLen := len(pathGroups)
-				isGetHead := ctx.Req.Method == "HEAD" || ctx.Req.Method == "GET"
-				isPut := ctx.Req.Method == "PUT"
-				isDelete := ctx.Req.Method == "DELETE"
-				if isGetHead {
-					if groupLen < 2 {
-						ctx.Status(http.StatusNotFound)
-						return
-					}
-					if groupLen == 2 {
-						ctx.SetParams("group", "")
-						ctx.SetParams("arch", pathGroups[0])
-						ctx.SetParams("file", pathGroups[1])
-					} else {
-						ctx.SetParams("group", strings.Join(pathGroups[:groupLen-2], "/"))
-						ctx.SetParams("arch", pathGroups[groupLen-2])
-						ctx.SetParams("file", pathGroups[groupLen-1])
-					}
-					arch.GetPackageOrDB(ctx)
-					return
-				} else if isPut {
-					ctx.SetParams("group", strings.Join(pathGroups, "/"))
-					reqPackageAccess(perm.AccessModeWrite)(ctx)
-					if ctx.Written() {
-						return
-					}
-					arch.PushPackage(ctx)
-					return
-				} else if isDelete {
-					if groupLen < 3 {
-						ctx.Status(http.StatusBadRequest)
-						return
-					}
-					if groupLen == 3 {
-						ctx.SetParams("group", "")
-						ctx.SetParams("package", pathGroups[0])
-						ctx.SetParams("version", pathGroups[1])
-						ctx.SetParams("arch", pathGroups[2])
-					} else {
-						ctx.SetParams("group", strings.Join(pathGroups[:groupLen-3], "/"))
-						ctx.SetParams("package", pathGroups[groupLen-3])
-						ctx.SetParams("version", pathGroups[groupLen-2])
-						ctx.SetParams("arch", pathGroups[groupLen-1])
-					}
-					reqPackageAccess(perm.AccessModeWrite)(ctx)
-					if ctx.Written() {
-						return
-					}
-					arch.RemovePackage(ctx)
-					return
-				}
-				ctx.Status(http.StatusNotFound)
-			})
+			r.Methods("HEAD,GET", "/repository.key", arch.GetRepositoryKey)
+			r.Methods("HEAD,GET", "*", arch.GetPackageOrDB)
+			r.Methods("PUT", "*", reqPackageAccess(perm.AccessModeWrite), arch.PushPackage)
+			r.Methods("DELETE", "*", reqPackageAccess(perm.AccessModeWrite), arch.RemovePackage)
 		}, reqPackageAccess(perm.AccessModeRead))
 		r.Group("/cargo", func() {
 			r.Group("/api/v1/crates", func() {
diff --git a/routers/api/packages/arch/arch.go b/routers/api/packages/arch/arch.go
index ecd2281884..3f1614b752 100644
--- a/routers/api/packages/arch/arch.go
+++ b/routers/api/packages/arch/arch.go
@@ -59,7 +59,7 @@ func GetRepositoryKey(ctx *context.Context) {
 }
 
 func PushPackage(ctx *context.Context) {
-	group := ctx.Params("group")
+	group := strings.Trim(ctx.Params("*"), "/")
 	releaser := refreshLocker(ctx, group)
 	defer releaser()
 	upload, needToClose, err := ctx.UploadStream()
@@ -183,11 +183,21 @@ func PushPackage(ctx *context.Context) {
 }
 
 func GetPackageOrDB(ctx *context.Context) {
-	var (
-		file  = ctx.Params("file")
-		group = ctx.Params("group")
-		arch  = ctx.Params("arch")
-	)
+	pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/")
+	groupLen := len(pathGroups)
+	if groupLen < 2 {
+		ctx.Status(http.StatusNotFound)
+		return
+	}
+	var file, group, arch string
+	if groupLen == 2 {
+		arch = pathGroups[0]
+		file = pathGroups[1]
+	} else {
+		group = strings.Join(pathGroups[:groupLen-2], "/")
+		arch = pathGroups[groupLen-2]
+		file = pathGroups[groupLen-1]
+	}
 	if archPkgOrSig.MatchString(file) {
 		pkg, u, pf, err := arch_service.GetPackageFile(ctx, group, file, ctx.Package.Owner.ID)
 		if err != nil {
@@ -220,12 +230,23 @@ func GetPackageOrDB(ctx *context.Context) {
 }
 
 func RemovePackage(ctx *context.Context) {
-	var (
-		group   = ctx.Params("group")
-		pkg     = ctx.Params("package")
-		ver     = ctx.Params("version")
-		pkgArch = ctx.Params("arch")
-	)
+	pathGroups := strings.Split(strings.Trim(ctx.Params("*"), "/"), "/")
+	groupLen := len(pathGroups)
+	if groupLen < 3 {
+		ctx.Status(http.StatusBadRequest)
+		return
+	}
+	var group, pkg, ver, pkgArch string
+	if groupLen == 3 {
+		pkg = pathGroups[0]
+		ver = pathGroups[1]
+		pkgArch = pathGroups[2]
+	} else {
+		group = strings.Join(pathGroups[:groupLen-3], "/")
+		pkg = pathGroups[groupLen-3]
+		ver = pathGroups[groupLen-2]
+		pkgArch = pathGroups[groupLen-1]
+	}
 	releaser := refreshLocker(ctx, group)
 	defer releaser()
 	pv, err := packages_model.GetVersionByNameAndVersion(
diff --git a/routers/web/user/package.go b/routers/web/user/package.go
index d47a36e165..cb4735da7e 100644
--- a/routers/web/user/package.go
+++ b/routers/web/user/package.go
@@ -177,10 +177,11 @@ func ViewPackageVersion(ctx *context.Context) {
 	ctx.Data["Title"] = pd.Package.Name
 	ctx.Data["IsPackagesPage"] = true
 	ctx.Data["PackageDescriptor"] = pd
+	ctx.Data["PackageRegistryHost"] = setting.Packages.RegistryHost
 
 	switch pd.Package.Type {
 	case packages_model.TypeContainer:
-		ctx.Data["RegistryHost"] = setting.Packages.RegistryHost
+
 	case packages_model.TypeAlpine:
 		branches := make(container.Set[string])
 		repositories := make(container.Set[string])
@@ -203,7 +204,6 @@ func ViewPackageVersion(ctx *context.Context) {
 		ctx.Data["Repositories"] = util.Sorted(repositories.Values())
 		ctx.Data["Architectures"] = util.Sorted(architectures.Values())
 	case packages_model.TypeArch:
-		ctx.Data["RegistryHost"] = setting.Packages.RegistryHost
 		ctx.Data["SignMail"] = fmt.Sprintf("%s@noreply.%s", ctx.Package.Owner.Name, setting.Packages.RegistryHost)
 		groups := make(container.Set[string])
 		for _, f := range pd.Files {
diff --git a/templates/package/content/arch.tmpl b/templates/package/content/arch.tmpl
index 6138b1d698..6a041d323b 100644
--- a/templates/package/content/arch.tmpl
+++ b/templates/package/content/arch.tmpl
@@ -25,7 +25,7 @@ pacman-key --lsign-key '{{$.SignMail}}'</code></pre>
 {{end -}}{{- if gt $GroupSize 1 -}}
 # {{ctx.Locale.Tr "packages.arch.pacman.repo.multi.item" .}}
 {{end -}}
-[{{$.PackageDescriptor.Owner.LowerName}}.{{$.RegistryHost}}]
+[{{$.PackageDescriptor.Owner.LowerName}}.{{$.PackageRegistryHost}}]
 SigLevel = Required
 Server = <origin-url data-url="{{AppSubUrl}}/api/packages/{{$.PackageDescriptor.Owner.Name}}/arch/{{.}}/$arch"></origin-url>
 {{end -}}
diff --git a/templates/package/content/container.tmpl b/templates/package/content/container.tmpl
index b5fdcfeb1b..95ac6f8b8e 100644
--- a/templates/package/content/container.tmpl
+++ b/templates/package/content/container.tmpl
@@ -5,13 +5,13 @@
 			<div class="field">
 				<label>{{svg "octicon-terminal"}} {{ctx.Locale.Tr "packages.container.pull"}}</label>
 				{{if eq .PackageDescriptor.Metadata.Type "helm"}}
-				<div class="markup"><pre class="code-block"><code>helm pull oci://{{.RegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}} --version {{.PackageDescriptor.Version.LowerVersion}}</code></pre></div>
+				<div class="markup"><pre class="code-block"><code>helm pull oci://{{.PackageRegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}} --version {{.PackageDescriptor.Version.LowerVersion}}</code></pre></div>
 				{{else}}
 					{{$separator := ":"}}
 					{{if not .PackageDescriptor.Metadata.IsTagged}}
 						{{$separator = "@"}}
 					{{end}}
-					<div class="markup"><pre class="code-block"><code>docker pull {{.RegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}}{{$separator}}{{.PackageDescriptor.Version.LowerVersion}}</code></pre></div>
+					<div class="markup"><pre class="code-block"><code>docker pull {{.PackageRegistryHost}}/{{.PackageDescriptor.Owner.LowerName}}/{{.PackageDescriptor.Package.LowerName}}{{$separator}}{{.PackageDescriptor.Version.LowerVersion}}</code></pre></div>
 				{{end}}
 			</div>
 			<div class="field">