refactor: cleanup unused code and simplify internal packages
This commit performs a significant cleanup of the codebase by removing unused functions, methods, and entire files across various internal modules. This reduces technical debt and simplifies the project structure. Key changes include: - **cache**: Removed unused cache key generators and metrics snapshots. - **dto**: Removed redundant converter functions and segment creation helpers. - **middleware**: Deleted the unused `logger.go` middleware and simplified `ratelimit.go` and `casbin.go`. - **model**: Removed unused ID helpers, database closing functions, and batch decryption logic. - **pkg**: Cleaned up unused utility functions in `circuitbreaker`, `crypto`, `cursor`, `hook`, and `utils`. - **service**: Deleted `account_cleanup_service.go` and removed unused helper functions in `log_cleanup_service.go` and `sensitive_service.go`. - **repository**: Removed unused private loading methods in `comment_repo.go`.
This commit is contained in:
@@ -143,49 +143,3 @@ type CallConfigResponse struct {
|
||||
ICEServers []ICEServerConfig `json:"ice_servers"`
|
||||
}
|
||||
|
||||
// ==================== Converter Functions ====================
|
||||
|
||||
// ConvertCallSessionToResponse 转换通话会话为响应格式
|
||||
func ConvertCallSessionToResponse(call *model.CallSession, caller *model.User, participants []*model.User) *CallSessionResponse {
|
||||
resp := &CallSessionResponse{
|
||||
ID: call.ID,
|
||||
ConversationID: call.ConversationID,
|
||||
CallerID: call.CallerID,
|
||||
CallType: call.CallType,
|
||||
Status: call.Status,
|
||||
StartedAt: call.StartedAt,
|
||||
EndedAt: call.EndedAt,
|
||||
Duration: call.Duration,
|
||||
CreatedAt: call.CreatedAt,
|
||||
}
|
||||
|
||||
if call.GroupID != nil {
|
||||
resp.GroupID = *call.GroupID
|
||||
}
|
||||
|
||||
if caller != nil {
|
||||
resp.Caller = ConvertUserToResponse(caller)
|
||||
}
|
||||
|
||||
// 转换参与者
|
||||
resp.Participants = make([]CallParticipantResponse, 0, len(call.Participants))
|
||||
userMap := make(map[string]*model.User)
|
||||
for _, u := range participants {
|
||||
userMap[u.ID] = u
|
||||
}
|
||||
|
||||
for _, p := range call.Participants {
|
||||
pr := CallParticipantResponse{
|
||||
UserID: p.UserID,
|
||||
Status: p.Status,
|
||||
JoinedAt: p.JoinedAt,
|
||||
LeftAt: p.LeftAt,
|
||||
}
|
||||
if u, ok := userMap[p.UserID]; ok {
|
||||
pr.User = ConvertUserToResponse(u)
|
||||
}
|
||||
resp.Participants = append(resp.Participants, pr)
|
||||
}
|
||||
|
||||
return resp
|
||||
}
|
||||
|
||||
@@ -50,26 +50,6 @@ func GroupMemberToResponse(member *model.GroupMember) *GroupMemberResponse {
|
||||
}
|
||||
}
|
||||
|
||||
// GroupMemberToResponseWithUser 将GroupMember转换为GroupMemberResponse(包含用户信息)
|
||||
func GroupMemberToResponseWithUser(member *model.GroupMember, user *model.User) *GroupMemberResponse {
|
||||
if member == nil {
|
||||
return nil
|
||||
}
|
||||
resp := GroupMemberToResponse(member)
|
||||
if user != nil {
|
||||
resp.User = ConvertUserToResponse(user)
|
||||
}
|
||||
return resp
|
||||
}
|
||||
|
||||
// GroupMembersToResponse 将GroupMember列表转换为GroupMemberResponse列表
|
||||
func GroupMembersToResponse(members []model.GroupMember) []*GroupMemberResponse {
|
||||
result := make([]*GroupMemberResponse, 0, len(members))
|
||||
for i := range members {
|
||||
result = append(result, GroupMemberToResponse(&members[i]))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// GroupAnnouncementToResponse 将GroupAnnouncement转换为GroupAnnouncementResponse
|
||||
func GroupAnnouncementToResponse(announcement *model.GroupAnnouncement) *GroupAnnouncementResponse {
|
||||
|
||||
@@ -107,14 +107,6 @@ func ConvertMessagesToResponse(messages []*model.Message) []*MessageResponse {
|
||||
return result
|
||||
}
|
||||
|
||||
// ConvertConversationsToResponse 将Conversation列表转换为响应列表
|
||||
func ConvertConversationsToResponse(convs []*model.Conversation) []*ConversationResponse {
|
||||
result := make([]*ConversationResponse, 0, len(convs))
|
||||
for _, conv := range convs {
|
||||
result = append(result, ConvertConversationToResponse(conv, nil, 0, nil, false, false))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// ==================== PushRecord 转换 ====================
|
||||
|
||||
|
||||
@@ -33,49 +33,6 @@ func ConvertNotificationsToResponse(notifications []*model.Notification) []*Noti
|
||||
return result
|
||||
}
|
||||
|
||||
// ==================== SystemMessage 转换 ====================
|
||||
|
||||
// SystemMessageToResponse 将Message转换为SystemMessageResponse
|
||||
func SystemMessageToResponse(msg *model.Message) *SystemMessageResponse {
|
||||
if msg == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 从 segments 中提取文本内容
|
||||
content := ExtractTextContentFromModel(msg.Segments)
|
||||
|
||||
resp := &SystemMessageResponse{
|
||||
ID: msg.ID,
|
||||
SenderID: msg.SenderID,
|
||||
ReceiverID: "", // 系统消息的接收者需要从上下文获取
|
||||
Content: content,
|
||||
Category: string(msg.Category),
|
||||
SystemType: string(msg.SystemType),
|
||||
CreatedAt: msg.CreatedAt,
|
||||
}
|
||||
if msg.ExtraData != nil {
|
||||
resp.ExtraData = map[string]any{
|
||||
"actor_id": msg.ExtraData.ActorID,
|
||||
"actor_name": msg.ExtraData.ActorName,
|
||||
"avatar_url": msg.ExtraData.AvatarURL,
|
||||
"target_id": msg.ExtraData.TargetID,
|
||||
"target_type": msg.ExtraData.TargetType,
|
||||
"action_url": msg.ExtraData.ActionURL,
|
||||
"action_time": msg.ExtraData.ActionTime,
|
||||
}
|
||||
}
|
||||
return resp
|
||||
}
|
||||
|
||||
// SystemMessagesToResponse 将Message列表转换为SystemMessageResponse列表
|
||||
func SystemMessagesToResponse(messages []*model.Message) []*SystemMessageResponse {
|
||||
result := make([]*SystemMessageResponse, 0, len(messages))
|
||||
for _, msg := range messages {
|
||||
result = append(result, SystemMessageToResponse(msg))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// SystemNotificationToResponse 将SystemNotification转换为SystemMessageResponse
|
||||
func SystemNotificationToResponse(n *model.SystemNotification) *SystemMessageResponse {
|
||||
if n == nil {
|
||||
@@ -118,11 +75,3 @@ func SystemNotificationToResponse(n *model.SystemNotification) *SystemMessageRes
|
||||
return resp
|
||||
}
|
||||
|
||||
// SystemNotificationsToResponse 将SystemNotification列表转换为SystemMessageResponse列表
|
||||
func SystemNotificationsToResponse(notifications []*model.SystemNotification) []*SystemMessageResponse {
|
||||
result := make([]*SystemMessageResponse, 0, len(notifications))
|
||||
for _, n := range notifications {
|
||||
result = append(result, SystemNotificationToResponse(n))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -212,14 +212,6 @@ func ConvertCommentToResponse(comment *model.Comment, isLiked bool) *CommentResp
|
||||
}
|
||||
}
|
||||
|
||||
// ConvertCommentsToResponse 将Comment列表转换为响应列表
|
||||
func ConvertCommentsToResponse(comments []*model.Comment, isLiked bool) []*CommentResponse {
|
||||
result := make([]*CommentResponse, 0, len(comments))
|
||||
for _, comment := range comments {
|
||||
result = append(result, ConvertCommentToResponse(comment, isLiked))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// IsLikedChecker 点赞状态检查器接口
|
||||
type IsLikedChecker interface {
|
||||
|
||||
@@ -108,11 +108,6 @@ type AdminBatchHandleResponse struct {
|
||||
|
||||
// ==================== 转换函数 ====================
|
||||
|
||||
func baseAdminReportFields(report *model.Report) (string, string) {
|
||||
reason := string(report.Reason)
|
||||
status := string(report.Status)
|
||||
return reason, status
|
||||
}
|
||||
|
||||
// ConvertReportToResponse 将 Report 模型转换为响应
|
||||
func ConvertReportToResponse(report *model.Report) *ReportResponse {
|
||||
|
||||
@@ -8,15 +8,6 @@ import (
|
||||
"with_you/internal/model"
|
||||
)
|
||||
|
||||
// ParseSegmentData 解析Segment数据到目标结构体
|
||||
func ParseSegmentData(segment model.MessageSegment, target any) error {
|
||||
dataBytes, err := json.Marshal(segment.Data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return json.Unmarshal(dataBytes, target)
|
||||
}
|
||||
|
||||
// NewTextSegment 创建文本Segment
|
||||
func NewTextSegment(content string) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
@@ -25,137 +16,6 @@ func NewTextSegment(content string) model.MessageSegment {
|
||||
}
|
||||
}
|
||||
|
||||
// NewImageSegment 创建图片Segment
|
||||
func NewImageSegment(url string, width, height int, thumbnailURL string) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeImage),
|
||||
Data: map[string]any{
|
||||
"url": url,
|
||||
"width": width,
|
||||
"height": height,
|
||||
"thumbnail_url": thumbnailURL,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewImageSegmentWithSize 创建带文件大小的图片Segment
|
||||
func NewImageSegmentWithSize(url string, width, height int, thumbnailURL string, fileSize int64) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeImage),
|
||||
Data: map[string]any{
|
||||
"url": url,
|
||||
"width": width,
|
||||
"height": height,
|
||||
"thumbnail_url": thumbnailURL,
|
||||
"file_size": fileSize,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewVoiceSegment 创建语音Segment
|
||||
func NewVoiceSegment(url string, duration int, fileSize int64) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeVoice),
|
||||
Data: map[string]any{
|
||||
"url": url,
|
||||
"duration": duration,
|
||||
"file_size": fileSize,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewVideoSegment 创建视频Segment
|
||||
func NewVideoSegment(url string, width, height, duration int, thumbnailURL string, fileSize int64) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeVideo),
|
||||
Data: map[string]any{
|
||||
"url": url,
|
||||
"width": width,
|
||||
"height": height,
|
||||
"duration": duration,
|
||||
"thumbnail_url": thumbnailURL,
|
||||
"file_size": fileSize,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewFileSegment 创建文件Segment
|
||||
func NewFileSegment(url, name string, size int64, mimeType string) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeFile),
|
||||
Data: map[string]any{
|
||||
"url": url,
|
||||
"name": name,
|
||||
"size": size,
|
||||
"mime_type": mimeType,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewAtSegment 创建@Segment,只存储 user_id,昵称由前端根据群成员列表实时解析
|
||||
func NewAtSegment(userID string) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeAt),
|
||||
Data: map[string]any{
|
||||
"user_id": userID,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewAtAllSegment 创建@所有人Segment
|
||||
func NewAtAllSegment() model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeAt),
|
||||
Data: map[string]any{
|
||||
"user_id": "all",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewReplySegment 创建回复Segment
|
||||
func NewReplySegment(messageID string) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeReply),
|
||||
Data: map[string]any{"id": messageID},
|
||||
}
|
||||
}
|
||||
|
||||
// NewFaceSegment 创建表情Segment
|
||||
func NewFaceSegment(id int, name, url string) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeFace),
|
||||
Data: map[string]any{
|
||||
"id": id,
|
||||
"name": name,
|
||||
"url": url,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewLinkSegment 创建链接Segment
|
||||
func NewLinkSegment(url, title, description, image string) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypeLink),
|
||||
Data: map[string]any{
|
||||
"url": url,
|
||||
"title": title,
|
||||
"description": description,
|
||||
"image": image,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// NewPostRefSegment 创建帖子内链Segment
|
||||
func NewPostRefSegment(postID, title string) model.MessageSegment {
|
||||
return model.MessageSegment{
|
||||
Type: string(SegmentTypePostRef),
|
||||
Data: map[string]any{
|
||||
"post_id": postID,
|
||||
"title": title,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// ExtractVoteSegmentData 从消息链中提取投票Segment数据
|
||||
func ExtractVoteSegmentData(segments model.MessageSegments) *VoteSegmentData {
|
||||
for _, segment := range segments {
|
||||
@@ -179,22 +39,6 @@ func HasVoteSegment(segments model.MessageSegments) bool {
|
||||
return HasSegmentType(segments, SegmentTypeVote)
|
||||
}
|
||||
|
||||
// ExtractTextContentFromJSON 从JSON格式的segments中提取纯文本内容
|
||||
// 用于从数据库读取的 []byte 格式的 segments
|
||||
// 已废弃:现在数据库直接存储 model.MessageSegments 类型
|
||||
func ExtractTextContentFromJSON(segmentsJSON []byte) string {
|
||||
if len(segmentsJSON) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
var segments model.MessageSegments
|
||||
if err := json.Unmarshal(segmentsJSON, &segments); err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
return ExtractTextContentFromModel(segments)
|
||||
}
|
||||
|
||||
// ExtractTextContentFromModel 从 model.MessageSegments 中提取纯文本内容
|
||||
func ExtractTextContentFromModel(segments model.MessageSegments) string {
|
||||
var result string
|
||||
@@ -290,72 +134,6 @@ func ExtractReferencedPosts(segments model.MessageSegments) []string {
|
||||
return postIDs
|
||||
}
|
||||
|
||||
// HasPostRefSegment 检查消息链中是否包含帖子引用
|
||||
func HasPostRefSegment(segments model.MessageSegments) bool {
|
||||
return HasSegmentType(segments, SegmentTypePostRef)
|
||||
}
|
||||
|
||||
// IsAtAll 检查消息是否@了所有人
|
||||
func IsAtAll(segments model.MessageSegments) bool {
|
||||
return slices.ContainsFunc(segments, func(segment model.MessageSegment) bool {
|
||||
if segment.Type == string(SegmentTypeAt) {
|
||||
if userID, ok := segment.Data["user_id"].(string); ok && userID == "all" {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
})
|
||||
}
|
||||
|
||||
// GetReplyMessageID 从消息链中获取被回复的消息ID
|
||||
// 如果没有回复segment,返回空字符串
|
||||
func GetReplyMessageID(segments model.MessageSegments) string {
|
||||
idx := slices.IndexFunc(segments, func(segment model.MessageSegment) bool {
|
||||
return segment.Type == string(SegmentTypeReply)
|
||||
})
|
||||
if idx == -1 {
|
||||
return ""
|
||||
}
|
||||
if id, ok := segments[idx].Data["id"].(string); ok {
|
||||
return id
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// BuildSegmentsFromContent 从旧版content构建segments
|
||||
// 用于兼容旧版本消息
|
||||
func BuildSegmentsFromContent(contentType, content string, mediaURL *string) model.MessageSegments {
|
||||
var segments model.MessageSegments
|
||||
|
||||
switch contentType {
|
||||
case "text":
|
||||
segments = append(segments, NewTextSegment(content))
|
||||
case "image":
|
||||
if mediaURL != nil {
|
||||
segments = append(segments, NewImageSegment(*mediaURL, 0, 0, ""))
|
||||
}
|
||||
case "voice":
|
||||
if mediaURL != nil {
|
||||
segments = append(segments, NewVoiceSegment(*mediaURL, 0, 0))
|
||||
}
|
||||
case "video":
|
||||
if mediaURL != nil {
|
||||
segments = append(segments, NewVideoSegment(*mediaURL, 0, 0, 0, "", 0))
|
||||
}
|
||||
case "file":
|
||||
if mediaURL != nil {
|
||||
segments = append(segments, NewFileSegment(*mediaURL, content, 0, ""))
|
||||
}
|
||||
default:
|
||||
// 默认当作文本处理
|
||||
if content != "" {
|
||||
segments = append(segments, NewTextSegment(content))
|
||||
}
|
||||
}
|
||||
|
||||
return segments
|
||||
}
|
||||
|
||||
// HasSegmentType 检查消息链中是否包含指定类型的segment
|
||||
func HasSegmentType(segments model.MessageSegments, segmentType SegmentType) bool {
|
||||
return slices.ContainsFunc(segments, func(segment model.MessageSegment) bool {
|
||||
@@ -363,71 +141,3 @@ func HasSegmentType(segments model.MessageSegments, segmentType SegmentType) boo
|
||||
})
|
||||
}
|
||||
|
||||
// GetSegmentsByType 获取消息链中所有指定类型的segment
|
||||
func GetSegmentsByType(segments model.MessageSegments, segmentType SegmentType) []model.MessageSegment {
|
||||
var result []model.MessageSegment
|
||||
for _, segment := range segments {
|
||||
if segment.Type == string(segmentType) {
|
||||
result = append(result, segment)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// GetFirstImageURL 获取消息链中第一张图片的URL
|
||||
// 如果没有图片,返回空字符串
|
||||
func GetFirstImageURL(segments model.MessageSegments) string {
|
||||
idx := slices.IndexFunc(segments, func(segment model.MessageSegment) bool {
|
||||
return segment.Type == string(SegmentTypeImage)
|
||||
})
|
||||
if idx == -1 {
|
||||
return ""
|
||||
}
|
||||
if url, ok := segments[idx].Data["url"].(string); ok {
|
||||
return url
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// GetFirstMediaURL 获取消息链中第一个媒体文件的URL(图片/视频/语音/文件)
|
||||
// 用于兼容旧版本API
|
||||
func GetFirstMediaURL(segments model.MessageSegments) string {
|
||||
idx := slices.IndexFunc(segments, func(segment model.MessageSegment) bool {
|
||||
switch segment.Type {
|
||||
case string(SegmentTypeImage), string(SegmentTypeVideo), string(SegmentTypeVoice), string(SegmentTypeFile):
|
||||
return true
|
||||
}
|
||||
return false
|
||||
})
|
||||
if idx == -1 {
|
||||
return ""
|
||||
}
|
||||
if url, ok := segments[idx].Data["url"].(string); ok {
|
||||
return url
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// DetermineContentType 从消息链推断消息类型(用于兼容旧版本)
|
||||
func DetermineContentType(segments model.MessageSegments) string {
|
||||
if len(segments) == 0 {
|
||||
return "text"
|
||||
}
|
||||
|
||||
// 优先检查媒体类型
|
||||
for _, segment := range segments {
|
||||
switch segment.Type {
|
||||
case string(SegmentTypeImage):
|
||||
return "image"
|
||||
case string(SegmentTypeVideo):
|
||||
return "video"
|
||||
case string(SegmentTypeVoice):
|
||||
return "voice"
|
||||
case string(SegmentTypeFile):
|
||||
return "file"
|
||||
}
|
||||
}
|
||||
|
||||
// 默认返回text
|
||||
return "text"
|
||||
}
|
||||
|
||||
@@ -66,6 +66,3 @@ func ConvertTradeItemsToResponse(items []*model.TradeItem, favoriteMap map[strin
|
||||
return result
|
||||
}
|
||||
|
||||
func ConvertTradeItemToDetailResponse(item *model.TradeItem, isFavorited bool) *TradeItemResponse {
|
||||
return ConvertTradeItemToResponse(item, isFavorited)
|
||||
}
|
||||
Reference in New Issue
Block a user