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
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)
|
|
}
|
|
|