From fe4f0d6dea8373a284187e85cb6bfe41c2918508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Sun, 15 Dec 2024 23:25:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=AD=E9=97=B4=E4=BB=B6=E6=B3=A8?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/web/wire.go | 3 +- cmd/web/wire_gen.go | 12 ++++---- internal/bootstrap/http.go | 4 +-- internal/http/middleware/middleware.go | 37 ++++++++++++++++++------ internal/http/middleware/must_install.go | 7 ++--- 5 files changed, 42 insertions(+), 21 deletions(-) diff --git a/cmd/web/wire.go b/cmd/web/wire.go index a94f75f8..0c68d336 100644 --- a/cmd/web/wire.go +++ b/cmd/web/wire.go @@ -3,6 +3,7 @@ package main import ( + "github.com/TheTNB/panel/internal/http/middleware" "github.com/TheTNB/panel/internal/job" "github.com/google/wire" @@ -15,5 +16,5 @@ import ( // initWeb init application. func initWeb() (*app.Web, error) { - panic(wire.Build(bootstrap.ProviderSet, route.ProviderSet, service.ProviderSet, data.ProviderSet, job.ProviderSet, app.NewWeb)) + panic(wire.Build(bootstrap.ProviderSet, middleware.ProviderSet, route.ProviderSet, service.ProviderSet, data.ProviderSet, job.ProviderSet, app.NewWeb)) } diff --git a/cmd/web/wire_gen.go b/cmd/web/wire_gen.go index 1f755941..3023d0b4 100644 --- a/cmd/web/wire_gen.go +++ b/cmd/web/wire_gen.go @@ -10,6 +10,7 @@ import ( "github.com/TheTNB/panel/internal/app" "github.com/TheTNB/panel/internal/bootstrap" "github.com/TheTNB/panel/internal/data" + "github.com/TheTNB/panel/internal/http/middleware" "github.com/TheTNB/panel/internal/job" "github.com/TheTNB/panel/internal/route" "github.com/TheTNB/panel/internal/service" @@ -36,18 +37,19 @@ func initWeb() (*app.Web, error) { if err != nil { return nil, err } - userRepo := data.NewUserRepo(db) - userService := service.NewUserService(koanf, manager, userRepo) + cacheRepo := data.NewCacheRepo(db) queue := bootstrap.NewQueue() taskRepo := data.NewTaskRepo(db, logger, queue) - cacheRepo := data.NewCacheRepo(db) + appRepo := data.NewAppRepo(db, cacheRepo, taskRepo) + middlewares := middleware.NewMiddlewares(koanf, logger, manager, appRepo) + userRepo := data.NewUserRepo(db) + userService := service.NewUserService(koanf, manager, userRepo) databaseServerRepo := data.NewDatabaseServerRepo(db, logger) databaseUserRepo := data.NewDatabaseUserRepo(databaseServerRepo) databaseRepo := data.NewDatabaseRepo(databaseServerRepo, databaseUserRepo) certRepo := data.NewCertRepo(db) certAccountRepo := data.NewCertAccountRepo(db, userRepo) websiteRepo := data.NewWebsiteRepo(db, cacheRepo, databaseRepo, databaseServerRepo, databaseUserRepo, certRepo, certAccountRepo) - appRepo := data.NewAppRepo(db, cacheRepo, taskRepo) settingRepo := data.NewSettingRepo(db, koanf, taskRepo) cronRepo := data.NewCronRepo(db) backupRepo := data.NewBackupRepo(db, settingRepo, websiteRepo) @@ -86,7 +88,7 @@ func initWeb() (*app.Web, error) { http := route.NewHttp(userService, dashboardService, taskService, websiteService, databaseService, databaseServerService, databaseUserService, backupService, certService, certDNSService, certAccountService, appService, cronService, processService, safeService, firewallService, sshService, containerService, containerNetworkService, containerImageService, containerVolumeService, fileService, monitorService, settingService, systemctlService) wsService := service.NewWsService(koanf, sshRepo) ws := route.NewWs(wsService) - mux, err := bootstrap.NewRouter(koanf, db, logger, manager, http, ws) + mux, err := bootstrap.NewRouter(koanf, db, logger, manager, middlewares, http, ws) if err != nil { return nil, err } diff --git a/internal/bootstrap/http.go b/internal/bootstrap/http.go index 06a9532e..80048956 100644 --- a/internal/bootstrap/http.go +++ b/internal/bootstrap/http.go @@ -14,11 +14,11 @@ import ( "github.com/TheTNB/panel/internal/route" ) -func NewRouter(conf *koanf.Koanf, db *gorm.DB, log *slog.Logger, session *sessions.Manager, http *route.Http, ws *route.Ws) (*chi.Mux, error) { +func NewRouter(conf *koanf.Koanf, db *gorm.DB, log *slog.Logger, session *sessions.Manager, middlewares *middleware.Middlewares, http *route.Http, ws *route.Ws) (*chi.Mux, error) { r := chi.NewRouter() // add middleware - r.Use(middleware.GlobalMiddleware(r, conf, db, log, session)...) + r.Use(middlewares.Globals(r)...) // add http route http.Register(r) // add ws route diff --git a/internal/http/middleware/middleware.go b/internal/http/middleware/middleware.go index 3d97ceda..6abd23a6 100644 --- a/internal/http/middleware/middleware.go +++ b/internal/http/middleware/middleware.go @@ -1,10 +1,11 @@ package middleware import ( + "github.com/TheTNB/panel/internal/biz" "github.com/go-chi/chi/v5" "github.com/go-rat/sessions" + "github.com/google/wire" "github.com/knadh/koanf/v2" - "gorm.io/gorm" "log/slog" "net/http" @@ -13,22 +14,40 @@ import ( "github.com/golang-cz/httplog" ) -// GlobalMiddleware is a collection of global middleware that will be applied to every request. -func GlobalMiddleware(r *chi.Mux, conf *koanf.Koanf, db *gorm.DB, log *slog.Logger, session *sessions.Manager) []func(http.Handler) http.Handler { +var ProviderSet = wire.NewSet(NewMiddlewares) + +type Middlewares struct { + conf *koanf.Koanf + log *slog.Logger + session *sessions.Manager + app biz.AppRepo +} + +func NewMiddlewares(conf *koanf.Koanf, log *slog.Logger, session *sessions.Manager, app biz.AppRepo) *Middlewares { + return &Middlewares{ + conf: conf, + log: log, + session: session, + app: app, + } +} + +// Globals is a collection of global middleware that will be applied to every request. +func (r *Middlewares) Globals(mux *chi.Mux) []func(http.Handler) http.Handler { return []func(http.Handler) http.Handler{ - sessionmiddleware.StartSession(session), - //middleware.SupressNotFound(r),// bug https://github.com/go-chi/chi/pull/940 + sessionmiddleware.StartSession(r.session), + //middleware.SupressNotFound(mux),// bug https://github.com/go-chi/chi/pull/940 middleware.CleanPath, middleware.StripSlashes, middleware.Compress(5), - httplog.RequestLogger(log, &httplog.Options{ + httplog.RequestLogger(r.log, &httplog.Options{ Level: slog.LevelInfo, LogRequestHeaders: []string{"User-Agent"}, }), middleware.Recoverer, Status, - Entrance(conf, session), - MustLogin(session), - MustInstall(db), + Entrance(r.conf, r.session), + MustLogin(r.session), + MustInstall(r.app), } } diff --git a/internal/http/middleware/must_install.go b/internal/http/middleware/must_install.go index 9920735e..c873d1cb 100644 --- a/internal/http/middleware/must_install.go +++ b/internal/http/middleware/must_install.go @@ -2,8 +2,7 @@ package middleware import ( "fmt" - "github.com/TheTNB/panel/internal/data" - "gorm.io/gorm" + "github.com/TheTNB/panel/internal/biz" "net/http" "strings" @@ -11,7 +10,7 @@ import ( ) // MustInstall 确保已安装应用 -func MustInstall(db *gorm.DB) func(next http.Handler) http.Handler { +func MustInstall(app biz.AppRepo) func(next http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var slugs []string @@ -34,7 +33,7 @@ func MustInstall(db *gorm.DB) func(next http.Handler) http.Handler { flag := false for _, s := range slugs { - if installed, _ := data.NewAppRepo(db, nil, nil).IsInstalled("slug = ?", s); installed { // TODO 优化实现 + if installed, _ := app.IsInstalled("slug = ?", s); installed { // TODO 优化实现 flag = true break }