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.
Open-IM-Server/pkg/common/db/relation/chat_log_model.go

86 lines
2.6 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/table"
2 years ago
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"
3 years ago
)
2 years ago
type ChatLogGorm struct {
DB *gorm.DB
2 years ago
}
2 years ago
func NewChatLog(db *gorm.DB) *ChatLogGorm {
return &ChatLogGorm{DB: db}
2 years ago
}
2 years ago
func (c *ChatLogGorm) Create(msg pbMsg.MsgDataToMQ) error {
chatLog := new(table.ChatLogModel)
2 years ago
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)
2 years ago
return c.DB.Create(chatLog).Error
2 years ago
}
2 years ago
func (c *ChatLogGorm) GetChatLog(chatLog *table.ChatLogModel, pageNumber, showNumber int32, contentTypeList []int32) (int64, []ChatLogModel, error) {
2 years ago
mdb := c.DB.Model(chatLog)
2 years ago
if chatLog.SendTime.Unix() > 0 {
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 != "" {
mdb = mdb.Where(" content like ? ", fmt.Sprintf("%%%s%%", chatLog.Content))
2 years ago
}
if chatLog.SessionType == 1 {
mdb = mdb.Where("session_type = ?", chatLog.SessionType)
2 years ago
} else if chatLog.SessionType == 2 {
mdb = mdb.Where("session_type in (?)", []int{constant.GroupChatType, constant.SuperGroupChatType})
3 years ago
}
2 years ago
if chatLog.ContentType != 0 {
mdb = mdb.Where("content_type = ?", chatLog.ContentType)
3 years ago
}
if chatLog.SendID != "" {
mdb = mdb.Where("send_id = ?", chatLog.SendID)
3 years ago
}
if chatLog.RecvID != "" {
mdb = mdb.Where("recv_id = ?", chatLog.RecvID)
2 years ago
}
if len(contentTypeList) > 0 {
mdb = mdb.Where("content_type in (?)", contentTypeList)
3 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 []table.ChatLogModel
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
}
return count, chatLogs, nil
3 years ago
}