2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-06 16:08:44 +08:00

feat: 中间件注入

This commit is contained in:
耗子
2024-12-15 23:25:45 +08:00
parent 8116ea7767
commit fe4f0d6dea
5 changed files with 42 additions and 21 deletions

View File

@@ -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))
}

View File

@@ -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
}

View File

@@ -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

View File

@@ -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),
}
}

View File

@@ -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
}