35 lines
1.8 KiB
Cheetah
35 lines
1.8 KiB
Cheetah
package servicecontext
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"git.yuntuo.hk/k2safe/go-omni/health"
|
|
"git.yuntuo.hk/k2safe/go-omni/lifecycle"
|
|
"git.yuntuo.hk/k2safe/go-omni/logx"
|
|
{{if eq .Database "mysql"}}mysqladapter "git.yuntuo.hk/k2safe/go-omni/database/mysql"{{end}}
|
|
"{{.Module}}/internal/settings"
|
|
"{{.Module}}/internal/middleware"
|
|
)
|
|
// New is generator-owned. Customize dependencies in ServiceContext.Init.
|
|
func New(ctx context.Context,logger *logx.Logger,configs ...settings.Config)(result *Context,err error){
|
|
if ctx==nil{ctx=context.Background()}
|
|
if err=ctx.Err();err!=nil{return nil,errors.Join(err,lifecycle.Cause(ctx))}
|
|
if logger==nil{return nil,errors.New("service context requires a logger")}
|
|
if len(configs)>1{return nil,errors.New("expected at most one configuration")}
|
|
cfg:=settings.Default();if len(configs)==1{cfg=configs[0]}
|
|
if err=cfg.Validate();err!=nil{return nil,err}
|
|
checker,err:=health.New();if err!=nil{return nil,err}
|
|
runtime,err:=lifecycle.NewRuntimeWithConfig(logx.WithLogger(ctx,logger),cfg.Server.Lifecycle);if err!=nil{return nil,err}
|
|
c:=&Context{Config:cfg,Logger:logger,Health:checker,Middlewares:middleware.Defaults(),Runtime:runtime}
|
|
ctx=logx.WithLogger(c.Context(),logger)
|
|
defer func(){if p:=recover();p!=nil{_ = c.Close();panic(p)};if err!=nil{err=c.Finish(err)}}()
|
|
{{if eq .Database "mysql"}}
|
|
options:=append([]mysqladapter.Option{mysqladapter.WithLogger(logger)},c.DatabaseOptions()...)
|
|
c.DB,err=mysqladapter.Open(ctx,cfg.Database,options...);if err!=nil{return nil,err}
|
|
c.OnClose(c.DB.Close)
|
|
if err=checker.Add(health.Probe{Name:"database",Timeout:cfg.Database.Pool.PingTimeout,Check:c.DB.Health});err!=nil{return nil,err}
|
|
{{end}}
|
|
{{if ne .Storage "none"}}if err=c.InitStorage(ctx,cfg.Storage);err!=nil{return nil,err}{{end}}
|
|
if err=c.Init(ctx);err!=nil{return nil,err}
|
|
return c,nil
|
|
}
|