template-monorepo/gateway.go

50 lines
1.1 KiB
Go
Raw Permalink Normal View History

2026-05-19 11:00:28 +00:00
// Code scaffolded by goctl. Safe to edit.
// goctl 1.10.1
package main
import (
"context"
2026-05-19 11:00:28 +00:00
"flag"
"fmt"
"os"
"os/signal"
"syscall"
2026-05-19 11:00:28 +00:00
"gateway/internal/config"
"gateway/internal/handler"
"gateway/internal/library/errors/code"
"gateway/internal/response"
2026-05-19 11:00:28 +00:00
"gateway/internal/svc"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/rest"
)
var configFile = flag.String("f", "etc/gateway.yaml", "the config file")
func main() {
flag.Parse()
response.RequestErrScope = code.Facade
2026-05-19 11:00:28 +00:00
var c config.Config
conf.MustLoad(*configFile, &c)
server := rest.MustNewServer(c.RestConf)
defer server.Stop()
sc := svc.NewServiceContext(c)
refactor(middleware): wire AuthJWT + CasbinRBAC via .api middleware directive Stop relying on a global server.Use(CloudEPJWT) that was invisible from the .api source. Protected routes now declare middleware explicitly in each @server block and goctl chains them into routes.go — the .api file is the single source of truth for "who needs Bearer / who needs RBAC". Concretely: - Rewrite middleware to go-zero's standard struct + Handle() pattern. AuthJWT becomes strict: missing/invalid Bearer returns 28501000 (was soft passthrough). CasbinRBAC stays nil-tolerant so dev/test boots without a policy. - Files renamed to goctl's stringx convention (authjwt_middleware.go, casbinrbac_middleware.go) so future `make gen-api` runs see them as already-generated and skip the empty stub. - Move actor context helpers (Actor, WithActor, ActorFromContext) into internal/library/actor so middleware and BOTH logic packages share one context key. Previously each logic package had its own private actorKey struct{}, so an actor injected for member was invisible to permission — the permission RBAC chain would always see "missing actor". member/permission actor.go are now thin type-alias shims. - .api files declare middleware per group: auth.api (public) → no middleware (register/login/token/...) auth.api (logout) → middleware: AuthJWT member.api → middleware: AuthJWT permission.api (catalog,me) → middleware: AuthJWT permission.api (admin ops) → middleware: AuthJWT,CasbinRBAC normal.api (/health) → no middleware - ServiceContext exposes AuthJWT / CasbinRBAC as rest.Middleware; the global server.Use(...) in gateway.go is removed. - Document the pattern in AGENTS.md (cross-agent rules) and generate/api/README.md (detailed examples + filename rules) so any future AI agent or human follows the same convention. make gen-api / gen-doc / lint / build all pass. Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 09:30:50 +00:00
// Middlewares are now mounted per route group via .api `middleware:`
// directives (AuthJWT / CasbinRBAC). See generate/api/README.md.
handler.RegisterHandlers(server, sc)
workerCtx, stopWorkers := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stopWorkers()
sc.StartWorkers(workerCtx)
defer sc.StopWorkers()
2026-05-19 11:00:28 +00:00
fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)
server.Start()
}