backend/internal/svc/chat.go

72 lines
1.8 KiB
Go

package svc
import (
"backend/internal/config"
"backend/pkg/chat/domain/usecase"
repo "backend/pkg/chat/repository"
uc "backend/pkg/chat/usecase"
"backend/pkg/library/cassandra"
"backend/pkg/library/centrifugo"
errs "backend/pkg/library/errors"
"fmt"
)
func MustMessageUseCase(c *config.Config, logger errs.Logger) usecase.MessageUseCase {
// 初始化 Cassandra DB
cassandraDB, err := initCassandraDB(c)
if err != nil {
panic(fmt.Sprintf("failed to initialize Cassandra DB: %v", err))
}
// 初始化 Message Repository
messageRepo := repo.MustMessageRepository(repo.MessageRepositoryParam{
DB: cassandraDB,
Keyspace: c.Cassandra.Keyspace,
})
// 初始化 Room Repository
roomRepo := repo.MustRoomRepository(repo.RoomRepositoryParam{
DB: cassandraDB,
Keyspace: c.Cassandra.Keyspace,
})
// 初始化 Centrifugo Client
msgClient := centrifugo.NewClientWithConfig(centrifugo.HighPerformanceConfig(c.Centrifugo.APIURL, c.Centrifugo.APIKey))
return uc.NewMessageUseCase(uc.MessageUseCaseParam{
MessageRepo: messageRepo,
RoomRepo: roomRepo,
MsgClient: msgClient,
Logger: logger,
})
}
// initCassandraDB 初始化 Cassandra 資料庫連接
func initCassandraDB(c *config.Config) (*cassandra.DB, error) {
if len(c.Cassandra.Hosts) == 0 {
return nil, fmt.Errorf("cassandra hosts are required")
}
opts := []cassandra.Option{
cassandra.WithHosts(c.Cassandra.Hosts...),
}
if c.Cassandra.Port > 0 {
opts = append(opts, cassandra.WithPort(c.Cassandra.Port))
}
if c.Cassandra.Keyspace != "" {
opts = append(opts, cassandra.WithKeyspace(c.Cassandra.Keyspace))
}
if c.Cassandra.UseAuth {
opts = append(opts, cassandra.WithAuth(c.Cassandra.Username, c.Cassandra.Password))
}
return cassandra.New(opts...)
}
func MustRoomUseCase(c *config.Config, logger errs.Logger) usecase.R {
}