package cmd import ( "context" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" "github.com/gogf/gf/v2/os/gcmd" adminctl "service.xpcool.com/internal/controller/admin" "service.xpcool.com/internal/controller/hello" openctl "service.xpcool.com/internal/controller/open" userctl "service.xpcool.com/internal/controller/user" "service.xpcool.com/internal/library/jwt" "service.xpcool.com/internal/middleware" "service.xpcool.com/internal/service" ) var ( Main = gcmd.Command{ Name: "main", Usage: "main", Brief: "start http server", Func: func(ctx context.Context, parser *gcmd.Parser) (err error) { s := g.Server() tokens := jwt.New(ctx) service.RegisterUserAuth(service.NewUserAuth(tokens, nil, nil)) service.RegisterAdminAuth(service.NewAdminAuth(tokens)) service.RegisterAdminAudit(service.NewAdminAudit()) s.Group("/", func(group *ghttp.RouterGroup) { group.Middleware(middleware.Recover, middleware.CORS) group.Middleware(ghttp.MiddlewareHandlerResponse) group.Bind( hello.NewV1(), ) }) s.Group("/api/open/v1", func(group *ghttp.RouterGroup) { group.Middleware(middleware.Recover, middleware.CORS, ghttp.MiddlewareHandlerResponse) group.Bind(openctl.New()) // Open tools API for frontends, no auth required. }) s.Group("/api/v1", func(group *ghttp.RouterGroup) { group.Middleware(middleware.Recover, middleware.CORS, ghttp.MiddlewareHandlerResponse) group.Bind(userctl.New()) // Login and refresh routes are public. group.Group("/", func(protected *ghttp.RouterGroup) { protected.Middleware(middleware.UserAuth(tokens)) }) }) s.Group("/admin/v1", func(group *ghttp.RouterGroup) { group.Middleware(middleware.Recover, middleware.CORS, ghttp.MiddlewareHandlerResponse) group.Bind(adminctl.New()) // Admin login remains public; protected controllers mount separately. group.Group("/", func(protected *ghttp.RouterGroup) { protected.Middleware(middleware.AdminAuth(tokens, service.AdminAuth().HasPermission, func(ctx context.Context, id uint64, permission, method, path, ip, param string, duration, status int) { service.AdminAudit().Record(ctx, service.AuditEvent{AdminID: id, Permission: permission, Method: method, Path: path, IP: ip, Param: param, DurationMS: duration, StatusCode: status}) })) }) }) s.Run() return nil }, } )