Skip to content

Commit 98b3dc9

Browse files
authored
refactor: update Swagger serving and processing method (#11052)
* feat: Add Swagger UI support and update Go module dependencies
1 parent c05e610 commit 98b3dc9

File tree

4 files changed

+70
-15
lines changed

4 files changed

+70
-15
lines changed

core/go.mod

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ require (
2727
github.com/minio/minio-go/v7 v7.0.74
2828
github.com/nicksnyder/go-i18n/v2 v2.4.0
2929
github.com/oschwald/maxminddb-golang v1.13.1
30-
github.com/patrickmn/go-cache v2.1.0+incompatible
3130
github.com/pkg/errors v0.9.1
3231
github.com/pkg/sftp v1.13.6
3332
github.com/qiniu/go-sdk/v7 v7.21.1
@@ -36,8 +35,7 @@ require (
3635
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
3736
github.com/spf13/cobra v1.8.1
3837
github.com/spf13/viper v1.19.0
39-
github.com/swaggo/files v1.0.1
40-
github.com/swaggo/gin-swagger v1.6.0
38+
github.com/swaggo/files/v2 v2.0.2
4139
github.com/swaggo/swag v1.16.3
4240
github.com/tencentyun/cos-go-sdk-v5 v0.7.54
4341
github.com/upyun/go-sdk v2.1.0+incompatible

core/go.sum

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -390,8 +390,6 @@ github.com/nicksnyder/go-i18n/v2 v2.4.0/go.mod h1:nxYSZE9M0bf3Y70gPQjN9ha7XNHX7g
390390
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
391391
github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5MbwsmL4MRQE=
392392
github.com/oschwald/maxminddb-golang v1.13.1/go.mod h1:K4pgV9N/GcK694KSTmVSDTODk4IsCNThNdTmnaBZ/F8=
393-
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
394-
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
395393
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
396394
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
397395
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
@@ -468,10 +466,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
468466
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
469467
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
470468
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
471-
github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
472-
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
473-
github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M=
474-
github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo=
469+
github.com/swaggo/files/v2 v2.0.2 h1:Bq4tgS/yxLB/3nwOMcul5oLEUKa877Ykgz3CJMVbQKU=
470+
github.com/swaggo/files/v2 v2.0.2/go.mod h1:TVqetIzZsO9OhHX1Am9sRf9LdrFZqoK49N37KON/jr0=
475471
github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg=
476472
github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk=
477473
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.563/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
@@ -600,7 +596,6 @@ golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1
600596
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
601597
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
602598
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
603-
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
604599
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
605600
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
606601
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -672,7 +667,6 @@ golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXR
672667
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
673668
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
674669
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
675-
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
676670
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
677671
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
678672
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -684,7 +678,6 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
684678
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
685679
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
686680
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
687-
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
688681
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
689682
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
690683
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

core/init/router/router.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@ import (
1313
"github.com/1Panel-dev/1Panel/core/cmd/server/web"
1414
"github.com/1Panel-dev/1Panel/core/global"
1515
"github.com/1Panel-dev/1Panel/core/i18n"
16+
"github.com/1Panel-dev/1Panel/core/init/swagger"
1617
"github.com/1Panel-dev/1Panel/core/middleware"
1718
rou "github.com/1Panel-dev/1Panel/core/router"
1819
"github.com/1Panel-dev/1Panel/core/utils/security"
1920
"github.com/gin-contrib/gzip"
2021
"github.com/gin-gonic/gin"
21-
swaggerfiles "github.com/swaggo/files"
22-
ginSwagger "github.com/swaggo/gin-swagger"
2322
)
2423

2524
var (
@@ -74,7 +73,8 @@ func Routers() *gin.Engine {
7473

7574
swaggerRouter := Router.Group("1panel")
7675
docs.SwaggerInfo.BasePath = "/api/v2"
77-
swaggerRouter.Use(middleware.SessionAuth()).GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))
76+
swaggerRouter.Use(middleware.SessionAuth()).GET("/swagger/*any", swagger.SwaggerHandler())
77+
7878
PublicGroup := Router.Group("")
7979
{
8080
PublicGroup.Use(gzip.Gzip(gzip.DefaultCompression))

core/init/swagger/swag.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package swagger
2+
3+
import (
4+
"net/http"
5+
"regexp"
6+
"strings"
7+
8+
"github.com/1Panel-dev/1Panel/core/cmd/server/docs"
9+
"github.com/gin-gonic/gin"
10+
swaggerfiles "github.com/swaggo/files/v2"
11+
)
12+
13+
var matcher = regexp.MustCompile(fileMatchPattern)
14+
15+
const swaggerDocFile = "doc.json"
16+
17+
const fileMatchPattern = `(.*)(index\.html|index\.css|swagger-initializer\.js|doc\.json|favicon-16x16\.png|favicon-32x32\.png|/oauth2-redirect\.html|swagger-ui\.css|swagger-ui\.css\.map|swagger-ui\.js|swagger-ui\.js\.map|swagger-ui-bundle\.js|swagger-ui-bundle\.js\.map|swagger-ui-standalone-preset\.js|swagger-ui-standalone-preset\.js\.map)[?|.]*`
18+
const CustomSwaggerInitializerJS = `window.onload = function() {
19+
//<editor-fold desc="Changeable Configuration Block">
20+
window.ui = SwaggerUIBundle({
21+
url: "{{.URL}}",
22+
dom_id: '#swagger-ui',
23+
deepLinking: true,
24+
presets: [
25+
SwaggerUIBundle.presets.apis,
26+
SwaggerUIStandalonePreset
27+
],
28+
plugins: [
29+
SwaggerUIBundle.plugins.DownloadUrl
30+
],
31+
layout: "StandaloneLayout"
32+
});
33+
34+
//</editor-fold>
35+
};
36+
`
37+
38+
func SwaggerHandler() gin.HandlerFunc {
39+
fileServer := http.StripPrefix("/1panel/swagger/", http.FileServer(http.FS(swaggerfiles.FS)))
40+
41+
return func(c *gin.Context) {
42+
path := c.Request.URL.Path
43+
path = strings.TrimPrefix(path, "/1panel/swagger")
44+
if !matcher.MatchString(path) && path != "/" {
45+
// 404
46+
c.AbortWithStatus(http.StatusNotFound)
47+
return
48+
}
49+
switch path {
50+
case "/doc.json":
51+
c.Header("Content-Type", "application/json; charset=utf-8")
52+
c.Header("Cache-Control", "private, max-age=600")
53+
c.String(http.StatusOK, docs.SwaggerInfo.ReadDoc())
54+
case "/swagger-initializer.js":
55+
c.Header("Content-Type", "application/javascript; charset=utf-8")
56+
c.Header("Cache-Control", "private, max-age=600")
57+
c.String(http.StatusOK, strings.ReplaceAll(CustomSwaggerInitializerJS, "{{.URL}}", swaggerDocFile))
58+
default:
59+
60+
c.Header("Cache-Control", "private, max-age=600")
61+
fileServer.ServeHTTP(c.Writer, c.Request)
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)