chat/internal/svc/service_context.go

78 lines
2.2 KiB
Go

package svc
import (
"chat/internal/config"
domainRepo "chat/internal/domain/repository"
domainUsecase "chat/internal/domain/usecase"
"chat/internal/library/cassandra"
"chat/internal/library/centrifugo"
"chat/internal/middleware"
repoImpl "chat/internal/repository"
usecaseImpl "chat/internal/usecase"
"context"
"github.com/redis/go-redis/v9"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/rest"
)
type ServiceContext struct {
Config config.Config
AnonMiddleware rest.Middleware
// Clients
RedisClient *redis.Client
CentrifugoClient *centrifugo.Client
CassandraDB *cassandra.DB
// Repositories
MatchmakingRepo domainRepo.MatchmakingRepository
MessageRepo domainRepo.MessageRepository
// UseCases
AuthUseCase domainUsecase.AuthUseCase
MatchmakingUseCase domainUsecase.MatchmakingUseCase
MessageUseCase domainUsecase.MessageUseCase
}
func NewServiceContext(c config.Config) *ServiceContext {
ctx := context.Background()
redis, err := initRedis(ctx, c.Redis)
if err != nil {
panic(err)
}
cassandraDB, err := initCassandra(ctx, c.Cassandra)
if err != nil {
panic(err)
}
centrifugoClient := initCentrifugo(c.Centrifugo)
// 初始化 Repositories
// 初始化 Repositories
matchmakingRepo := repoImpl.NewMatchmakingRepository(redis)
messageRepo, err := repoImpl.NewMessageRepository(cassandraDB, c.Cassandra.Keyspace)
if err != nil {
logx.Errorf("Failed to create message repository: %v", err)
}
// 初始化 UseCases
// AuthUseCase 需要 MatchmakingRepository 來查詢使用者所在的房間
authUseCase := usecaseImpl.NewAuthUseCase(c.JWT.Secret, c.JWT.Expire, c.JWT.CentrifugoSecret, matchmakingRepo)
matchmakingUseCase := usecaseImpl.NewMatchmakingUseCase(matchmakingRepo)
messageUseCase := usecaseImpl.NewMessageUseCase(messageRepo, matchmakingRepo, centrifugoClient)
return &ServiceContext{
Config: c,
AnonMiddleware: middleware.NewAnonMiddleware(c).Handle,
RedisClient: redis,
CentrifugoClient: centrifugoClient,
CassandraDB: cassandraDB,
MatchmakingRepo: matchmakingRepo,
MessageRepo: messageRepo,
AuthUseCase: authUseCase,
MatchmakingUseCase: matchmakingUseCase,
MessageUseCase: messageUseCase,
}
}