From 29894cff9c92980edf94b27bd4f9d78e731b73ba Mon Sep 17 00:00:00 2001 From: Rogee Date: Fri, 6 Dec 2024 16:53:33 +0800 Subject: [PATCH] feat: refactor http --- backend/common/service/http/http.go | 45 +++++++++++++++++++++----- backend/modules/medias/provider.gen.go | 6 ++-- backend/modules/medias/router.go | 26 ++++++++++----- backend/modules/users/provider.gen.go | 6 ++-- backend/modules/users/router.go | 24 ++++++++++---- backend/providers/http/engine.go | 5 ++- 6 files changed, 82 insertions(+), 30 deletions(-) diff --git a/backend/common/service/http/http.go b/backend/common/service/http/http.go index 48d83ee..35fe628 100644 --- a/backend/common/service/http/http.go +++ b/backend/common/service/http/http.go @@ -1,16 +1,22 @@ package http import ( + "backend/modules/medias" "backend/modules/middlewares" "backend/modules/users" "backend/providers/app" "backend/providers/http" + "backend/providers/jwt" "backend/providers/postgres" + "backend/providers/storage" + "backend/providers/wechat" "git.ipao.vip/rogeecn/atom" "git.ipao.vip/rogeecn/atom/container" "git.ipao.vip/rogeecn/atom/contracts" - log "github.com/sirupsen/logrus" + "github.com/gofiber/fiber/v3" + "github.com/gofiber/fiber/v3/log" + "github.com/samber/lo" "github.com/spf13/cobra" "go.uber.org/dig" ) @@ -20,12 +26,17 @@ func defaultProviders(providers ...container.ProviderContainer) container.Provid app.DefaultProvider(), http.DefaultProvider(), postgres.DefaultProvider(), + jwt.DefaultProvider(), }, providers...) } func Command() atom.Option { - providers := defaultProviders().With( + providers := defaultProviders( + wechat.DefaultProvider(), + storage.DefaultProvider(), + ).With( users.Provide, + medias.Provide, ) return atom.Command( @@ -49,17 +60,35 @@ type Http struct { func Serve(cmd *cobra.Command, args []string) error { return container.Container.Invoke(func(http Http) error { - for _, route := range http.Routes { - if err := route.Register(); err != nil { - log.Fatal(err) - } - } - mid := http.Middlewares http.Service.Engine.Use(mid.Verify) http.Service.Engine.Use(mid.AuthUserInfo) http.Service.Engine.Use(mid.SilentAuth) + mounts := map[string][]string{ + "/t/{tenant}": {"users", "medias"}, + } + for _, route := range http.Routes { + r := route.Register() + if app, ok := r.(*fiber.App); ok { + match := false + for prefix, groups := range mounts { + log.Infof("mount %s to %s", prefix, route.Name()) + if lo.Contains(groups, route.Name()) { + match = true + http.Service.Engine.Use(prefix, app) + break + } + } + _ = match + + if !match { + log.Infof("mount / to %s", route.Name()) + http.Service.Engine.Use(app) + } + } + } + return http.Service.Serve() }) } diff --git a/backend/modules/medias/provider.gen.go b/backend/modules/medias/provider.gen.go index 831082d..ad6841b 100755 --- a/backend/modules/medias/provider.gen.go +++ b/backend/modules/medias/provider.gen.go @@ -1,7 +1,6 @@ package medias import ( - "backend/providers/http" "backend/providers/storage" "database/sql" @@ -25,11 +24,12 @@ func Provide(opts ...opt.Option) error { if err := container.Container.Provide(func( controller *Controller, - http *http.Service, ) (contracts.HttpRoute, error) { obj := &Router{ controller: controller, - http: http, + } + if err := obj.Prepare(); err != nil { + return nil, err } return obj, nil }, atom.GroupRoutes); err != nil { diff --git a/backend/modules/medias/router.go b/backend/modules/medias/router.go index 990c36c..499ef57 100755 --- a/backend/modules/medias/router.go +++ b/backend/modules/medias/router.go @@ -1,8 +1,6 @@ package medias import ( - "backend/providers/http" - _ "git.ipao.vip/rogeecn/atom" _ "git.ipao.vip/rogeecn/atom/contracts" "github.com/gofiber/fiber/v3" @@ -11,16 +9,28 @@ import ( // @provider:except contracts.HttpRoute atom.GroupRoutes type Router struct { - http *http.Service + app *fiber.App `inject:"false"` + group fiber.Router `inject:"false"` + log *log.Entry `inject:"false"` controller *Controller } -func (r *Router) Register() error { - group := r.http.Engine.Group("medias") - log.Infof("register route group: %s", group.(*fiber.Group).Prefix) - group.Get("", r.controller.List) - group.Get("{id}", r.controller.Show) +func (r *Router) Name() string { + return "medias" +} + +func (r *Router) Prepare() error { + r.log = log.WithField("http.group", r.Name()) + r.app = fiber.New() + r.group = r.app.Group(r.Name()) return nil } + +func (r *Router) Register() any { + r.group.Get("", r.controller.List) + r.group.Get("{id}", r.controller.Show) + + return r.app +} diff --git a/backend/modules/users/provider.gen.go b/backend/modules/users/provider.gen.go index fe50745..12c86d0 100755 --- a/backend/modules/users/provider.gen.go +++ b/backend/modules/users/provider.gen.go @@ -1,7 +1,6 @@ package users import ( - "backend/providers/http" "database/sql" "git.ipao.vip/rogeecn/atom" @@ -24,11 +23,12 @@ func Provide(opts ...opt.Option) error { if err := container.Container.Provide(func( controller *Controller, - http *http.Service, ) (contracts.HttpRoute, error) { obj := &Router{ controller: controller, - http: http, + } + if err := obj.Prepare(); err != nil { + return nil, err } return obj, nil }, atom.GroupRoutes); err != nil { diff --git a/backend/modules/users/router.go b/backend/modules/users/router.go index 94939b1..2ef0b16 100755 --- a/backend/modules/users/router.go +++ b/backend/modules/users/router.go @@ -1,8 +1,6 @@ package users import ( - "backend/providers/http" - _ "git.ipao.vip/rogeecn/atom" _ "git.ipao.vip/rogeecn/atom/contracts" "github.com/gofiber/fiber/v3" @@ -11,15 +9,27 @@ import ( // @provider:except contracts.HttpRoute atom.GroupRoutes type Router struct { - http *http.Service + app *fiber.App `inject:"false"` + group fiber.Router `inject:"false"` + log *log.Entry `inject:"false"` controller *Controller } -func (r *Router) Register() error { - group := r.http.Engine.Group("users") - log.Infof("register route group: %s", group.(*fiber.Group).Prefix) - group.Get("", r.controller.List) +func (r *Router) Prepare() error { + r.log = log.WithField("http.group", r.Name()) + r.app = fiber.New() + r.group = r.app.Group(r.Name()) return nil } + +func (r *Router) Name() string { + return "users" +} + +func (r *Router) Register() any { + r.group.Get("", r.controller.List) + + return r.app +} diff --git a/backend/providers/http/engine.go b/backend/providers/http/engine.go index 9c878be..598969b 100644 --- a/backend/providers/http/engine.go +++ b/backend/providers/http/engine.go @@ -83,6 +83,9 @@ func Provide(opts ...opt.Option) error { TimeZone: "Asia/Shanghai", })) - return &Service{Engine: engine, conf: &config}, nil + return &Service{ + Engine: engine, + conf: &config, + }, nil }, o.DiOptions()...) }