package svc import ( "fmt" "juwan-backend/app/snowflake/rpc/snowflake" "juwan-backend/app/wallet/rpc/internal/config" "juwan-backend/app/wallet/rpc/internal/models" "juwan-backend/common/redisx" "juwan-backend/common/snowflakex" "juwan-backend/pkg/adapter" "strings" "time" "ariga.io/entcache" "entgo.io/ent/dialect/sql" _ "github.com/jackc/pgx/v5/stdlib" "github.com/zeromicro/go-zero/core/logx" ) type ServiceContext struct { Config config.Config Snowflake snowflake.SnowflakeServiceClient WalletModelsRW *models.Client WalletModelsRO *models.Client } func NewServiceContext(c config.Config) *ServiceContext { RWConn, err := sql.Open("pgx", c.DB.Master) if err != nil { panic(err) } ROConn, err := sql.Open("pgx", c.DB.Slaves) if err != nil { panic(err) } redisCluster, err := redisx.ConnectMasterSlaveCluster(c.CacheConf, 5*time.Second) if redisCluster == nil || err != nil { logx.Errorf("failed to connect to Redis cluster: %v", err) panic(err) } RWDrv := entcache.NewDriver(RWConn, entcache.TTL(30*time.Second), entcache.Levels(adapter.NewRedisCache(redisCluster.Client))) RODrv := entcache.NewDriver(ROConn, entcache.TTL(30*time.Second), entcache.Levels(adapter.NewRedisCache(redisCluster.Client))) entLogFn := func(v ...any) { logx.Infof("[ent][wallet] %s", fmt.Sprint(v...)) } modelOpts := []models.Option{models.Driver(RWDrv), models.Log(entLogFn)} roModelOpts := []models.Option{models.Driver(RODrv), models.Log(entLogFn)} if strings.EqualFold(c.Log.Level, "debug") { modelOpts = append(modelOpts, models.Debug()) roModelOpts = append(roModelOpts, models.Debug()) } return &ServiceContext{ Config: c, Snowflake: snowflakex.NewClient(c.SnowflakeRpcConf), WalletModelsRW: models.NewClient(modelOpts...), WalletModelsRO: models.NewClient(roModelOpts...), } }