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" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/log" "github.com/samber/lo" "github.com/spf13/cobra" "go.uber.org/dig" ) func defaultProviders(providers ...container.ProviderContainer) container.Providers { return append(container.Providers{ app.DefaultProvider(), http.DefaultProvider(), postgres.DefaultProvider(), jwt.DefaultProvider(), }, providers...) } func Command() atom.Option { providers := defaultProviders( wechat.DefaultProvider(), storage.DefaultProvider(), ).With( users.Provide, medias.Provide, ) return atom.Command( atom.Name("serve"), atom.Short("run http server"), atom.RunE(Serve), atom.Providers(providers.With( middlewares.Provide, )), ) } type Http struct { dig.In Service *http.Service Initials []contracts.Initial `group:"initials"` Routes []contracts.HttpRoute `group:"routes"` Middlewares *middlewares.Middlewares } func Serve(cmd *cobra.Command, args []string) error { return container.Container.Invoke(func(http Http) error { mid := http.Middlewares http.Service.Engine.Use(mid.WeChatVerify) http.Service.Engine.Use(mid.AuthUserInfo) http.Service.Engine.Use(mid.WeChatSilentAuth) 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() }) }