package svc import ( "context" "juwan-backend/app/users/rpc/internal/config" "juwan-backend/app/users/rpc/internal/models" "juwan-backend/app/users/rpc/internal/utils" "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 UsersModel models.UsersModel RedisCluster *redis.ClusterClient JwtManager *utils.JwtManager } func NewServiceContext(c config.Config) *ServiceContext { conn := sqlx.NewSqlConn("postgres", c.DataSource) logx.Infof("success to connect to postgres~") // Initialize Redis Cluster client from CacheConf var redisCluster *redis.ClusterClient if len(c.CacheConf) > 0 { redisCluster = redis.NewClusterClient(&redis.ClusterOptions{ Addrs: []string{c.CacheConf[0].Host}, Password: c.CacheConf[0].Pass, }) // Test Redis Cluster connection ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := redisCluster.Ping(ctx).Err(); err != nil { logx.Errorf("failed to connect to redis cluster: %v", err) } else { logx.Infof("success to connect to redis cluster~") } } // Initialize JWT Manager jwtManager := utils.NewJwtManager(redisCluster, c.Jwt.SecretKey, c.Jwt.Issuer) return &ServiceContext{ Config: c, UsersModel: models.NewUsersModel(conn, c.CacheConf), RedisCluster: redisCluster, JwtManager: jwtManager, } }