package svc import ( "juwan-backend/app/snowflake/rpc/snowflake" "juwan-backend/app/users/rpc/internal/config" "juwan-backend/app/users/rpc/internal/models" "juwan-backend/app/users/rpc/internal/utils" "juwan-backend/common/redisx" "juwan-backend/common/snowflakex" "time" "github.com/redis/go-redis/v9" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" ) type ServiceContext struct { Config config.Config UsersModelRW models.UsersModel UsersModelRO models.UsersModel RedisCluster *redis.ClusterClient Snowflake snowflake.SnowflakeServiceClient JwtManager *utils.JwtManager } func NewServiceContext(c config.Config) *ServiceContext { RWDBConn := sqlx.NewSqlConn("postgres", c.DB.Master) RODBConn := sqlx.NewSqlConn("postgres", c.DB.Slave) logx.Infof("success to connect to postgres~") // Initialize Redis Cluster client from CacheConf redisConn, err := redisx.ConnectMasterSlaveCluster(c.CacheConf, 5*time.Second) redisCluster := redisConn.Client if redisCluster != nil { if err != nil { logx.Errorf("failed to connect to redis cluster: %v", err) } else { if redisConn.HasSlave { logx.Infof("success to connect to redis master/slave (M: %s, S: %s)", redisConn.MasterHost, redisConn.SlaveHost) } else { logx.Infof("success to connect to redis master (M: %s), slave not configured", redisConn.MasterHost) } } } // Initialize JWT Manager jwtManager := utils.NewJwtManager(redisCluster, c.Jwt.SecretKey, c.Jwt.Issuer) return &ServiceContext{ Config: c, UsersModelRW: models.NewUsersModel(RWDBConn, c.CacheConf), UsersModelRO: models.NewUsersModel(RODBConn, c.CacheConf), RedisCluster: redisCluster, JwtManager: jwtManager, Snowflake: snowflakex.NewClient(c.SnowflakeRpcConf), } }