busniess-user-center/server/http.go

125 lines
2.9 KiB
Go

package server
import (
"context"
"fmt"
"strconv"
"time"
"busniess-user-center/config"
"busniess-user-center/pkg/middleware/decoder"
"busniess-user-center/pkg/middleware/jwt"
"busniess-user-center/pkg/middleware/logger"
"busniess-user-center/pkg/middleware/recovery"
"busniess-user-center/pkg/redis"
"busniess-user-center/pkg/utils/token"
"busniess-user-center/pkg/validator"
"busniess-user-center/server/application"
"busniess-user-center/server/organization"
"busniess-user-center/server/role"
"busniess-user-center/server/user"
"github.com/gin-contrib/gzip"
"github.com/gin-contrib/pprof"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/samber/do"
"go.uber.org/zap"
)
const (
httpPost = ":9000"
)
// todo gin 注册自己的校验器
func addr() string {
conf := do.MustInvoke[*config.AppConfig](nil)
if conf.App.Port > 0 {
return ":" + strconv.Itoa(conf.App.Port)
}
return httpPost
}
func RunWebServer(ctx context.Context) error {
// 启用插件
engine, err := newGinEngine()
if err != nil {
return err
}
return engine.Run(addr())
}
func newGinEngine() (*gin.Engine, error) {
setBindValidator()
engine := gin.New()
pprof.Register(engine)
// 设置解压插件
engine.Use(gzip.Gzip(gzip.DefaultCompression))
// 设置日志插件
slogger := do.MustInvoke[*zap.SugaredLogger](nil)
conf := do.MustInvoke[*config.AppConfig](nil)
engine.Use(logger.GinLoggerMiddleware(slogger))
engine.Use(recovery.GinRecoverMiddleware(slogger))
// 解码器插件
engine.Use(decoder.Base64Decoder(slogger))
engine.GET("/metrics", gin.WrapH(promhttp.Handler()))
engine.GET("/version", func(c *gin.Context) {
c.JSON(200, gin.H{
"version": conf.GetVersion(),
})
})
if err := registerWebRoute(engine); err != nil {
return nil, err
}
return engine, nil
}
func registerWebRoute(engine *gin.Engine) error {
// 注册jwt插件-除了登陆接口
redis := do.MustInvoke[*redis.Redis](nil)
conf := do.MustInvoke[*config.AppConfig](nil)
logger := do.MustInvoke[*zap.SugaredLogger](nil)
exprieDuration := time.Duration(conf.Jwt.Expires) * time.Second
tokenFresher := token.NewTokenRefresher(redis, exprieDuration)
do.ProvideValue(nil, tokenFresher)
jwt, err := jwt.NewJwtAuthMiddleware(logger, tokenFresher, []byte(conf.Jwt.Secret), exprieDuration)
if err != nil {
panic(fmt.Sprintf("newjwtAuthMiddleware fail:%s", err.Error()))
}
loginVerify := jwt.AuthHandler()
api := engine.Group("/api")
api.Use(loginVerify)
userApi := api.Group("/user")
user.RegisterRoute(userApi)
orgApi := api.Group("/organization")
organization.RegisterRoute(orgApi)
roleApi := api.Group("/role")
role.RegisterRoute(roleApi)
appApi := api.Group("/application")
application.RegisterRoute(appApi)
return nil
}
func setBindValidator() {
binding.Validator = validator.NewValidator()
}