- api/common/v1 → api/open/v1,路由前缀 /api/common/v1 → /api/open/v1
- 契约层按子功能拆目录:api/open/v1/tools/{uuid,md5,random,time,ip}/index.go
- 控制器同步拆文件:internal/controller/open/{uuid,md5,random,time,ip}.go
- 命名规则(open 优于 common)与 tools 目录规则记入 AGENTS.md
- 冒烟测试:旧路由 404,新路由 5 端点全部通过
60 lines
2.3 KiB
Go
60 lines
2.3 KiB
Go
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
|
|
},
|
|
}
|
|
)
|