80 lines
2.6 KiB
Go
80 lines
2.6 KiB
Go
// Package router 装配 gin 引擎与各模块路由。
|
||
// 路由分层:/api/ma(小程序,靠请求头 app_id 鉴权)、/api/admin(后台)。
|
||
package router
|
||
|
||
import (
|
||
"time"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"gorm.io/gorm"
|
||
|
||
adminhdl "portal-mini-go/internal/handler/admin"
|
||
miniapphdl "portal-mini-go/internal/handler/admin/miniapp"
|
||
userhdl "portal-mini-go/internal/handler/admin/user"
|
||
app1hdl "portal-mini-go/internal/handler/miniapp/app1"
|
||
"portal-mini-go/internal/middleware"
|
||
"portal-mini-go/internal/pkg/config"
|
||
"portal-mini-go/internal/pkg/response"
|
||
"portal-mini-go/internal/pkg/session"
|
||
"portal-mini-go/internal/pkg/wechat"
|
||
miniapprepo "portal-mini-go/internal/repository/miniapp"
|
||
"portal-mini-go/internal/repository/user"
|
||
miniappsvc "portal-mini-go/internal/service/admin/miniapp"
|
||
usersvc "portal-mini-go/internal/service/admin/user"
|
||
app1svc "portal-mini-go/internal/service/miniapp/app1"
|
||
)
|
||
|
||
// New 构造并装配整个 HTTP 服务。
|
||
func New(cfg *config.Config, db *gorm.DB, store session.Store) *gin.Engine {
|
||
if cfg.Server.Mode == "release" {
|
||
gin.SetMode(gin.ReleaseMode)
|
||
}
|
||
|
||
r := gin.New()
|
||
r.Use(middleware.Recovery(), middleware.Trace(), middleware.ErrorHandler())
|
||
|
||
r.GET("/healthz", func(c *gin.Context) {
|
||
response.OK(c, gin.H{"status": "ok"})
|
||
})
|
||
|
||
// 共享基础设施:微信客户端、用户仓储、小程序仓储。
|
||
wx := wechat.NewClient()
|
||
userRepo := user.New(db)
|
||
miniRepo := miniapprepo.New(db)
|
||
|
||
// 小程序分组:先校验请求头 app_id 身份,再挂载各小程序业务路由。
|
||
ma := r.Group("/api/ma")
|
||
ma.Use(middleware.MiniAppAuth(miniRepo))
|
||
{
|
||
app1Svc := app1svc.New(userRepo, miniRepo, wx, store)
|
||
app1hdl.Register(ma, app1hdl.NewHandler(app1Svc), middleware.MiniUserAuth(store))
|
||
// 新增小程序时,在此依次注册 app2..app10:
|
||
// app2Svc := app2svc.New(userRepo, miniRepo, wx, store)
|
||
// app2hdl.Register(ma, app2hdl.NewHandler(app2Svc))
|
||
}
|
||
|
||
// 后台管理分组:JWT 鉴权。
|
||
ad := r.Group("/api/admin")
|
||
ad.Use(middleware.AdminAuth(cfg.Admin.JWTSecret))
|
||
{
|
||
adminhdl.Register(ad, adminhdl.NewHandler(cfg.Admin.JWTSecret, parseTTL(cfg.Admin.TokenTTL)))
|
||
|
||
// 小程序管理:被后台纳管的微信小程序配置(增删改查)。
|
||
miniSvc := miniappsvc.New(miniRepo)
|
||
miniapphdl.Register(ad, miniapphdl.NewHandler(miniSvc))
|
||
|
||
// 用户管理:各小程序端用户(列表、详情、编辑、禁用/启用)。
|
||
userSvc := usersvc.New(userRepo)
|
||
userhdl.Register(ad, userhdl.NewHandler(userSvc))
|
||
}
|
||
|
||
return r
|
||
}
|
||
|
||
func parseTTL(s string) time.Duration {
|
||
if d, err := time.ParseDuration(s); err == nil {
|
||
return d
|
||
}
|
||
return 24 * time.Hour
|
||
}
|