78 lines
2.2 KiB
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,
|
||
|
|
}
|
||
|
|
}
|