You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
4.1 KiB
105 lines
4.1 KiB
2 years ago
|
package relation
|
||
3 years ago
|
|
||
|
import (
|
||
2 years ago
|
"Open_IM/pkg/common/constant"
|
||
2 years ago
|
"Open_IM/pkg/common/db"
|
||
|
pbMsg "Open_IM/pkg/proto/msg"
|
||
|
server_api_params "Open_IM/pkg/proto/sdk_ws"
|
||
|
"Open_IM/pkg/utils"
|
||
3 years ago
|
"fmt"
|
||
2 years ago
|
"github.com/golang/protobuf/jsonpb"
|
||
|
"github.com/golang/protobuf/proto"
|
||
|
"github.com/jinzhu/copier"
|
||
2 years ago
|
"gorm.io/gorm"
|
||
|
"time"
|
||
3 years ago
|
)
|
||
|
|
||
2 years ago
|
var ChatLogDB *gorm.DB
|
||
|
|
||
|
type ChatLog struct {
|
||
|
ServerMsgID string `gorm:"column:server_msg_id;primary_key;type:char(64)" json:"serverMsgID"`
|
||
|
ClientMsgID string `gorm:"column:client_msg_id;type:char(64)" json:"clientMsgID"`
|
||
|
SendID string `gorm:"column:send_id;type:char(64);index:send_id,priority:2" json:"sendID"`
|
||
|
RecvID string `gorm:"column:recv_id;type:char(64);index:recv_id,priority:2" json:"recvID"`
|
||
|
SenderPlatformID int32 `gorm:"column:sender_platform_id" json:"senderPlatformID"`
|
||
|
SenderNickname string `gorm:"column:sender_nick_name;type:varchar(255)" json:"senderNickname"`
|
||
|
SenderFaceURL string `gorm:"column:sender_face_url;type:varchar(255);" json:"senderFaceURL"`
|
||
|
SessionType int32 `gorm:"column:session_type;index:session_type,priority:2;index:session_type_alone" json:"sessionType"`
|
||
|
MsgFrom int32 `gorm:"column:msg_from" json:"msgFrom"`
|
||
|
ContentType int32 `gorm:"column:content_type;index:content_type,priority:2;index:content_type_alone" json:"contentType"`
|
||
|
Content string `gorm:"column:content;type:varchar(3000)" json:"content"`
|
||
|
Status int32 `gorm:"column:status" json:"status"`
|
||
|
SendTime time.Time `gorm:"column:send_time;index:sendTime;index:content_type,priority:1;index:session_type,priority:1;index:recv_id,priority:1;index:send_id,priority:1" json:"sendTime"`
|
||
|
CreateTime time.Time `gorm:"column:create_time" json:"createTime"`
|
||
|
Ex string `gorm:"column:ex;type:varchar(1024)" json:"ex"`
|
||
|
}
|
||
|
|
||
|
func (ChatLog) TableName() string {
|
||
|
return "chat_logs"
|
||
|
}
|
||
|
|
||
2 years ago
|
func InsertMessageToChatLog(msg pbMsg.MsgDataToMQ) error {
|
||
|
chatLog := new(ChatLog)
|
||
|
copier.Copy(chatLog, msg.MsgData)
|
||
|
switch msg.MsgData.SessionType {
|
||
|
case constant.GroupChatType, constant.SuperGroupChatType:
|
||
|
chatLog.RecvID = msg.MsgData.GroupID
|
||
|
case constant.SingleChatType:
|
||
|
chatLog.RecvID = msg.MsgData.RecvID
|
||
|
}
|
||
|
if msg.MsgData.ContentType >= constant.NotificationBegin && msg.MsgData.ContentType <= constant.NotificationEnd {
|
||
|
var tips server_api_params.TipsComm
|
||
|
_ = proto.Unmarshal(msg.MsgData.Content, &tips)
|
||
|
marshaler := jsonpb.Marshaler{
|
||
|
OrigName: true,
|
||
|
EnumsAsInts: false,
|
||
|
EmitDefaults: false,
|
||
|
}
|
||
|
chatLog.Content, _ = marshaler.MarshalToString(&tips)
|
||
|
|
||
|
} else {
|
||
|
chatLog.Content = string(msg.MsgData.Content)
|
||
|
}
|
||
|
chatLog.CreateTime = utils.UnixMillSecondToTime(msg.MsgData.CreateTime)
|
||
|
chatLog.SendTime = utils.UnixMillSecondToTime(msg.MsgData.SendTime)
|
||
|
log.NewDebug("test", "this is ", chatLog)
|
||
|
return db.DB.MysqlDB.DefaultGormDB().Table("chat_logs").Create(chatLog).Error
|
||
|
}
|
||
|
|
||
2 years ago
|
func GetChatLog(chatLog *ChatLog, pageNumber, showNumber int32, contentTypeList []int32) (int64, []ChatLog, error) {
|
||
2 years ago
|
mdb := ChatLogDB.Table("chat_logs")
|
||
2 years ago
|
if chatLog.SendTime.Unix() > 0 {
|
||
2 years ago
|
mdb = mdb.Where("send_time > ? and send_time < ?", chatLog.SendTime, chatLog.SendTime.AddDate(0, 0, 1))
|
||
2 years ago
|
}
|
||
2 years ago
|
if chatLog.Content != "" {
|
||
2 years ago
|
mdb = mdb.Where(" content like ? ", fmt.Sprintf("%%%s%%", chatLog.Content))
|
||
2 years ago
|
}
|
||
|
if chatLog.SessionType == 1 {
|
||
2 years ago
|
mdb = mdb.Where("session_type = ?", chatLog.SessionType)
|
||
2 years ago
|
} else if chatLog.SessionType == 2 {
|
||
2 years ago
|
mdb = mdb.Where("session_type in (?)", []int{constant.GroupChatType, constant.SuperGroupChatType})
|
||
3 years ago
|
}
|
||
2 years ago
|
if chatLog.ContentType != 0 {
|
||
2 years ago
|
mdb = mdb.Where("content_type = ?", chatLog.ContentType)
|
||
3 years ago
|
}
|
||
|
if chatLog.SendID != "" {
|
||
2 years ago
|
mdb = mdb.Where("send_id = ?", chatLog.SendID)
|
||
3 years ago
|
}
|
||
|
if chatLog.RecvID != "" {
|
||
2 years ago
|
mdb = mdb.Where("recv_id = ?", chatLog.RecvID)
|
||
2 years ago
|
}
|
||
2 years ago
|
if len(contentTypeList) > 0 {
|
||
|
mdb = mdb.Where("content_type in (?)", contentTypeList)
|
||
3 years ago
|
}
|
||
2 years ago
|
var count int64
|
||
|
if err := mdb.Count(&count).Error; err != nil {
|
||
|
return 0, nil, err
|
||
3 years ago
|
}
|
||
2 years ago
|
var chatLogs []ChatLog
|
||
2 years ago
|
mdb = mdb.Limit(int(showNumber)).Offset(int(showNumber * (pageNumber - 1)))
|
||
|
if err := mdb.Find(&chatLogs).Error; err != nil {
|
||
|
return 0, nil, err
|
||
3 years ago
|
}
|
||
2 years ago
|
return count, chatLogs, nil
|
||
3 years ago
|
}
|