package main import ( "context" "errors" "example.com/userService/internal/handler" "example.com/userService/internal/servicecontext" "example.com/userService/internal/settings" "flag" omni "git.yuntuo.hk/k2safe/go-omni" "git.yuntuo.hk/k2safe/go-omni/httpx" "git.yuntuo.hk/k2safe/go-omni/logx" "log" "os" "os/signal" "syscall" ) func main() { path := flag.String("config", "etc/config.yaml", "configuration file; empty uses defaults and environment") flag.Parse() if err := run(*path); err != nil { log.Fatal(err) } } func run(path string) (runErr error) { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() cfg, err := settings.Load(path) if err != nil { return err } logger, err := logx.New(cfg.Server.Log) if err != nil { return err } defer func() { runErr = errors.Join(runErr, logger.Close()) }() logx.SetDefault(logger) deps, err := servicecontext.New(ctx, logger, cfg) if err != nil { return err } defer func() { runErr = errors.Join(runErr, deps.Close()) }() app := omni.New(omni.WithConfig(cfg.Server)) app.OnShutdown(logger.Close) app.OnShutdown(deps.Close) for _, method := range []string{"GET", "HEAD", "PUT"} { app.Handle(method, "/storage/object", func(c *httpx.Context) error { deps.FileHTTP.ServeHTTP(c.Raw(), c.Request()); return nil }) } if err = handler.RegisterRoutes(app, deps); err != nil { return err } app.GET("/openapi.json", handler.OpenAPI) app.GET("/health/live", deps.Health.LivenessHandler()) app.GET("/health/ready", deps.Health.ReadinessHandler()) logger.InfoContext(ctx, "service.starting", "address", cfg.Server.Address) return app.RunContext(ctx, cfg.Server.Address) }