feat(api): add message segments support for posts and comments
Add rich message segment support enabling structured content (text, images, votes, mentions) in posts and comments. Includes segments field in models, DTOs, handlers, and services. Also adds @mention notification processing and migrates vote data to embedded segments.
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
package service
|
||||
package service
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"with_you/internal/cache"
|
||||
"with_you/internal/dto"
|
||||
"with_you/internal/model"
|
||||
"with_you/internal/pkg/cursor"
|
||||
"with_you/internal/pkg/hook"
|
||||
@@ -37,7 +39,7 @@ func NewCommentService(commentRepo repository.CommentRepository, postRepo reposi
|
||||
}
|
||||
|
||||
// Create 创建评论
|
||||
func (s *CommentService) Create(ctx context.Context, postID, userID, content string, parentID *string, images string, imageURLs []string) (*model.Comment, error) {
|
||||
func (s *CommentService) Create(ctx context.Context, postID, userID, content string, segments model.MessageSegments, parentID *string, images string, imageURLs []string) (*model.Comment, error) {
|
||||
if s.postAIService != nil {
|
||||
// 采用异步审核,前端先立即返回
|
||||
}
|
||||
@@ -52,6 +54,7 @@ func (s *CommentService) Create(ctx context.Context, postID, userID, content str
|
||||
PostID: postID,
|
||||
UserID: userID,
|
||||
Content: content,
|
||||
Segments: segments,
|
||||
ParentID: parentID,
|
||||
Images: images,
|
||||
Status: model.CommentStatusPending,
|
||||
@@ -94,11 +97,38 @@ func (s *CommentService) Create(ctx context.Context, postID, userID, content str
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 异步处理 @提及通知
|
||||
if len(segments) > 0 {
|
||||
bgCtx := context.WithoutCancel(ctx)
|
||||
go s.processCommentMentionNotifications(bgCtx, userID, postID, post.Title, segments)
|
||||
}
|
||||
|
||||
go s.reviewCommentAsync(comment.ID, userID, postID, content, imageURLs, parentID, parentUserID, post.UserID)
|
||||
|
||||
return comment, nil
|
||||
}
|
||||
|
||||
// processCommentMentionNotifications 处理评论中 @提及的通知
|
||||
func (s *CommentService) processCommentMentionNotifications(ctx context.Context, authorID, postID, postTitle string, segments model.MessageSegments) {
|
||||
if s.systemMessageService == nil {
|
||||
return
|
||||
}
|
||||
|
||||
mentionedUserIDs := dto.ExtractMentionedUsers(segments)
|
||||
if len(mentionedUserIDs) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
for _, targetUserID := range mentionedUserIDs {
|
||||
if targetUserID == authorID {
|
||||
continue
|
||||
}
|
||||
if err := s.systemMessageService.SendMentionNotification(ctx, targetUserID, authorID, postID); err != nil {
|
||||
log.Printf("[WARN] Failed to send comment mention notification to user %s: %v", targetUserID, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *CommentService) reviewCommentAsync(
|
||||
commentID, userID, postID, content string,
|
||||
imageURLs []string,
|
||||
|
||||
Reference in New Issue
Block a user