@ -267,58 +267,80 @@ func (m *MsgMgo) MarkSingleChatMsgsAsRead(ctx context.Context, userID string, do
}
func ( m * MsgMgo ) SearchMessage ( ctx context . Context , req * msg . SearchMessageReq ) ( int32 , [ ] * relation . MsgInfoModel , error ) {
var pipe mongo . Pipeline
condition := bson . A { }
if req . SendTime != "" {
// Changed to keyed fields for bson.M to avoid govet errors
condition = append ( condition , bson . M { "$eq" : bson . A { bson . M { "$dateToString" : bson . M { "format" : "%Y-%m-%d" , "date" : bson . M { "$toDate" : "$$item.msg.send_time" } } } , req . SendTime } } )
where := make ( bson . A , 0 , 6 )
if req . RecvID != "" {
where = append ( where , bson . M { "msgs.msg.recv_id" : req . RecvID } )
}
if req . SendID != "" {
where = append ( where , bson . M { "msgs.msg.send_id" : req . SendID } )
}
if req . ContentType != 0 {
condition = append ( condition , bson . M { "$eq" : bson . A { "$$item.msg.content_type" , req . ContentType } } )
where = append ( where , bson . M { "msgs.msg.content_type" : req . ContentType } )
}
if req . SessionType != 0 {
condition = append ( condition , bson . M { "$eq" : bson . A { "$$item.msg.session_type" , req . SessionType } } )
where = append ( where , bson . M { "msgs.msg.session_type" : req . SessionType } )
}
if req . RecvID != "" {
condition = append ( condition , bson . M { "$regexFind" : bson . M { "input" : "$$item.msg.recv_id" , "regex" : req . RecvID } } )
if req . SendTime != "" {
sendTime , err := time . Parse ( time . DateOnly , req . SendTime )
if err != nil {
return 0 , nil , errs . ErrArgs . WrapMsg ( "invalid sendTime" , "req" , req . SendTime , "format" , time . DateOnly , "cause" , err . Error ( ) )
}
where = append ( where ,
bson . M {
"msgs.msg.send_time" : bson . M {
"$gte" : sendTime . UnixMilli ( ) ,
} ,
} ,
bson . M {
"msgs.msg.send_time" : bson . M {
"$lt" : sendTime . Add ( time . Hour * 24 ) . UnixMilli ( ) ,
} ,
} ,
)
}
if req . SendID != "" {
condition = append ( condition , bson . M { "$regexFind" : bson . M { "input" : "$$item.msg.send_id" , "regex" : req . SendID } } )
pipeline := bson . A {
bson . M {
"$unwind" : "$msgs" ,
} ,
}
or := bson . A {
bson . M { "doc_id" : bson . M { "$regex" : "^si_" , "$options" : "i" } } ,
bson . M { "doc_id" : bson . M { "$regex" : "^g_" , "$options" : "i" } } ,
bson . M { "doc_id" : bson . M { "$regex" : "^sg_" , "$options" : "i" } } ,
if len ( where ) > 0 {
pipeline = append ( pipeline , bson . M {
"$match" : bson . M { "$and" : where } ,
} )
}
// Use bson.D with keyed fields to specify the order explicitly
pipe = mongo . Pipeline {
{ { "$match" , bson . D { { Key : "$or" , Value : or } } } } ,
{ { "$project" , bson . D {
{ Key : "msgs" , Value : bson . D {
{ Key : "$filter" , Value : bson . D {
{ Key : "input" , Value : "$msgs" } ,
{ Key : "as" , Value : "item" } ,
{ Key : "cond" , Value : bson . D { { Key : "$and" , Value : condition } } } ,
} } ,
} } ,
{ Key : "doc_id" , Value : 1 } ,
} } } ,
{ { "$unwind" , bson . M { "path" : "$msgs" } } } ,
{ { "$sort" , bson . M { "msgs.msg.send_time" : - 1 } } } ,
pipeline = append ( pipeline ,
bson . M {
"$project" : bson . M {
"_id" : 0 ,
"msg" : "$msgs.msg" ,
} ,
} ,
bson . M {
"$count" : "count" ,
} ,
)
count , err := mongoutil . Aggregate [ int32 ] ( ctx , m . coll , pipeline )
if err != nil {
return 0 , nil , err
}
type docModel struct {
DocID string ` bson:"doc_id" `
Msg * relation . MsgInfoModel ` bson:"msgs" `
if len ( count ) == 0 || count [ 0 ] == 0 {
return 0 , nil , nil
}
msgsDocs , err := mongoutil . Aggregate [ * docModel ] ( ctx , m . coll , pipe )
pipeline = pipeline [ : len ( pipeline ) - 1 ]
pipeline = append ( pipeline ,
bson . M {
"$skip" : ( req . Pagination . GetPageNumber ( ) - 1 ) * req . Pagination . GetShowNumber ( ) ,
} ,
bson . M {
"$limit" : req . Pagination . GetShowNumber ( ) ,
} ,
)
msgs , err := mongoutil . Aggregate [ * relation . MsgInfoModel ] ( ctx , m . coll , pipeline )
if err != nil {
return 0 , nil , err
}
msgs := make ( [ ] * relation . MsgInfoModel , 0 )
for _ , doc := range msgsDocs {
msgInfo := doc . Msg
for i := range msgs {
msgInfo := msgs [ i ]
if msgInfo == nil || msgInfo . Msg == nil {
continue
}
@ -350,17 +372,17 @@ func (m *MsgMgo) SearchMessage(ctx context.Context, req *msg.SearchMessageReq) (
}
msgs = append ( msgs , msgInfo )
}
start := ( req . Pagination . PageNumber - 1 ) * req . Pagination . ShowNumber
n := int32 ( len ( msgs ) )
if start >= n {
return n , [ ] * relation . MsgInfoModel { } , nil
}
if start + req . Pagination . ShowNumber < n {
msgs = msgs [ start : start + req . Pagination . ShowNumber ]
} else {
msgs = msgs [ start : ]
}
return n, msgs , nil
//start := (req.Pagination.PageNumber - 1) * req.Pagination.ShowNumber
//n := int32(len(msgs))
//if start >= n {
// return n, []*relation.MsgInfoModel{}, nil
//}
//if start+req.Pagination.ShowNumber < n {
// msgs = msgs[start : start+req.Pagination.ShowNumber]
//} else {
// msgs = msgs[start:]
//}
return cou nt[ 0 ] , msgs , nil
}
func ( m * MsgMgo ) RangeUserSendCount ( ctx context . Context , start time . Time , end time . Time , group bool , ase bool , pageNumber int32 , showNumber int32 ) ( msgCount int64 , userCount int64 , users [ ] * relation . UserCount , dateCount map [ string ] int64 , err error ) {