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.
 
 
 

117 lines
3.2 KiB

package service
import (
"chat-room/internal/dao/pool"
"chat-room/pkg/common/constant"
"chat-room/pkg/common/response"
"chat-room/pkg/errors"
"chat-room/pkg/global/log"
"chat-room/pkg/protocol"
"chat-room/internal/model"
"chat-room/pkg/common/request"
"gorm.io/gorm"
)
const NULL_ID int32 = 0
type messageService struct {
}
var MessageService = new(messageService)
func (m *messageService) GetMessages(message request.MessageRequest) ([]response.MessageResponse, error) {
db := pool.GetDB()
migrate := &model.Message{}
pool.GetDB().AutoMigrate(&migrate)
if message.MessageType == constant.MESSAGE_TYPE_USER {
var queryUser *model.User
db.First(&queryUser, "uuid = ?", message.Uuid)
if NULL_ID == queryUser.Id {
return nil, errors.New("用户不存在")
}
var friend *model.User
db.First(&friend, "username = ?", message.FriendUsername)
if NULL_ID == friend.Id {
return nil, errors.New("用户不存在")
}
var messages []response.MessageResponse
db.Raw("SELECT m.id, m.from_user_id, m.to_user_id, m.content, m.content_type, m.url, m.created_at, u.username AS from_username, u.avatar, to_user.username AS to_username FROM messages AS m LEFT JOIN users AS u ON m.from_user_id = u.id LEFT JOIN users AS to_user ON m.to_user_id = to_user.id WHERE m.message_type = 1 AND from_user_id IN (?, ?) AND to_user_id IN (?, ?) ORDER BY m.created_at ASC",
queryUser.Id, friend.Id, queryUser.Id, friend.Id).Scan(&messages)
return messages, nil
}
if message.MessageType == constant.MESSAGE_TYPE_GROUP {
messages, err := fetchGroupMessage(db, message.Uuid)
if err != nil {
return nil, err
}
return messages, nil
}
return nil, errors.New("不支持查询类型")
}
func fetchGroupMessage(db *gorm.DB, toUuid string) ([]response.MessageResponse, error) {
var group model.Group
db.First(&group, "uuid = ?", toUuid)
if group.ID <= 0 {
return nil, errors.New("群组不存在")
}
var messages []response.MessageResponse
db.Raw("SELECT m.id, m.from_user_id, m.to_user_id, m.content, m.content_type, m.url, m.created_at, u.username AS from_username, u.avatar FROM messages AS m LEFT JOIN users AS u ON m.from_user_id = u.id WHERE m.message_type = 2 AND m.to_user_id = ? ORDER BY m.created_at ASC",
group.ID).Scan(&messages)
return messages, nil
}
func (m *messageService) SaveMessage(message protocol.Message) {
db := pool.GetDB()
var fromUser model.User
db.Find(&fromUser, "uuid = ?", message.From)
if NULL_ID == fromUser.Id {
log.Logger.Error("SaveMessage not find from user", log.Any("SaveMessage not find from user", fromUser.Id))
return
}
var toUserId int32 = 0
if message.MessageType == constant.MESSAGE_TYPE_USER {
var toUser model.User
db.Find(&toUser, "uuid = ?", message.To)
if NULL_ID == toUser.Id {
return
}
toUserId = toUser.Id
}
if message.MessageType == constant.MESSAGE_TYPE_GROUP {
var group model.Group
db.Find(&group, "uuid = ?", message.To)
if NULL_ID == group.ID {
return
}
toUserId = group.ID
}
saveMessage := model.Message{
FromUserId: fromUser.Id,
ToUserId: toUserId,
Content: message.Content,
ContentType: int16(message.ContentType),
MessageType: int16(message.MessageType),
Url: message.Url,
}
db.Save(&saveMessage)
}