refactor: update repository interfaces and improve dependency injection
- Refactored repository structures to use interfaces instead of concrete types, enhancing flexibility and testability. - Updated various repository methods to accept interfaces, allowing for better dependency management. - Modified wire generation to accommodate new repository interfaces, ensuring proper service injection throughout the application. - Enhanced handler methods to utilize DTOs for filtering and data handling, improving code clarity and maintainability.
This commit is contained in:
@@ -56,9 +56,8 @@ type ChatService interface {
|
||||
|
||||
// chatServiceImpl 聊天服务实现
|
||||
type chatServiceImpl struct {
|
||||
db *gorm.DB
|
||||
repo *repository.MessageRepository
|
||||
userRepo *repository.UserRepository
|
||||
repo repository.MessageRepository
|
||||
userRepo repository.UserRepository
|
||||
sensitive SensitiveService
|
||||
sseHub *sse.Hub
|
||||
|
||||
@@ -69,9 +68,8 @@ type chatServiceImpl struct {
|
||||
|
||||
// NewChatService 创建聊天服务
|
||||
func NewChatService(
|
||||
db *gorm.DB,
|
||||
repo *repository.MessageRepository,
|
||||
userRepo *repository.UserRepository,
|
||||
repo repository.MessageRepository,
|
||||
userRepo repository.UserRepository,
|
||||
sensitive SensitiveService,
|
||||
sseHub *sse.Hub,
|
||||
cacheBackend cache.Cache,
|
||||
@@ -90,7 +88,6 @@ func NewChatService(
|
||||
)
|
||||
|
||||
return &chatServiceImpl{
|
||||
db: db,
|
||||
repo: repo,
|
||||
userRepo: userRepo,
|
||||
sensitive: sensitive,
|
||||
@@ -538,13 +535,9 @@ func (s *chatServiceImpl) GetAllUnreadCount(ctx context.Context, userID string)
|
||||
// RecallMessage 撤回消息(2分钟内)
|
||||
func (s *chatServiceImpl) RecallMessage(ctx context.Context, messageID string, userID string) error {
|
||||
// 获取消息
|
||||
var message model.Message
|
||||
err := s.db.First(&message, "id = ?", messageID).Error
|
||||
message, err := s.repo.GetMessageByID(messageID)
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return errors.New("message not found")
|
||||
}
|
||||
return fmt.Errorf("failed to get message: %w", err)
|
||||
return errors.New("message not found")
|
||||
}
|
||||
|
||||
// 验证是否是消息发送者
|
||||
@@ -563,10 +556,7 @@ func (s *chatServiceImpl) RecallMessage(ctx context.Context, messageID string, u
|
||||
}
|
||||
|
||||
// 更新消息状态为已撤回,并清空原始消息内容,仅保留撤回占位
|
||||
err = s.db.Model(&message).Updates(map[string]interface{}{
|
||||
"status": model.MessageStatusRecalled,
|
||||
"segments": model.MessageSegments{},
|
||||
}).Error
|
||||
err = s.repo.RecallMessage(messageID, userID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to recall message: %w", err)
|
||||
}
|
||||
@@ -604,22 +594,15 @@ func (s *chatServiceImpl) RecallMessage(ctx context.Context, messageID string, u
|
||||
// DeleteMessage 删除消息(仅对自己可见)
|
||||
func (s *chatServiceImpl) DeleteMessage(ctx context.Context, messageID string, userID string) error {
|
||||
// 获取消息
|
||||
var message model.Message
|
||||
err := s.db.First(&message, "id = ?", messageID).Error
|
||||
message, err := s.repo.GetMessageByID(messageID)
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return errors.New("message not found")
|
||||
}
|
||||
return fmt.Errorf("failed to get message: %w", err)
|
||||
return errors.New("message not found")
|
||||
}
|
||||
|
||||
// 验证用户是否是会话参与者
|
||||
_, err = s.getParticipant(ctx, message.ConversationID, userID)
|
||||
if err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return errors.New("no permission to delete this message")
|
||||
}
|
||||
return fmt.Errorf("failed to get participant: %w", err)
|
||||
return errors.New("no permission to delete this message")
|
||||
}
|
||||
|
||||
// 对于删除消息,我们使用软删除,但需要确保只对当前用户隐藏
|
||||
@@ -629,7 +612,7 @@ func (s *chatServiceImpl) DeleteMessage(ctx context.Context, messageID string, u
|
||||
}
|
||||
|
||||
// 更新消息状态为已删除
|
||||
err = s.db.Model(&message).Update("status", model.MessageStatusDeleted).Error
|
||||
err = s.repo.UpdateMessageStatus(message.ID, model.MessageStatusDeleted)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete message: %w", err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user