videoplayer/dao/im.go

255 lines
8.3 KiB
Go
Raw Normal View History

2024-08-02 09:47:33 +08:00
package dao
2024-08-02 15:02:56 +08:00
import (
"gorm.io/gorm"
"videoplayer/proto"
)
2024-08-02 09:47:33 +08:00
type Message struct {
gorm.Model
FromUserID int `gorm:"column:from_user_id"`
ToUserID int `gorm:"column:to_user_id"`
GroupID int `gorm:"column:group_id"`
Msg string `gorm:"column:msg"`
Status int `gorm:"column:status"` //单聊时才有0,已读2未读
Type int `gorm:"column:type"` //1为单聊2为群聊3为系统消息,4为好友请求,5为加入群聊请求
2024-08-02 09:47:33 +08:00
}
type Group struct {
gorm.Model
AuthID int `gorm:"column:auth_id"`
2024-08-02 09:47:33 +08:00
GroupName string `gorm:"column:group_name"`
2024-08-02 15:02:56 +08:00
GroupInfo string `gorm:"column:group_info"`
GroupType int `gorm:"column:group_type"`
GroupIcon string `gorm:"column:group_icon"`
2024-08-02 09:47:33 +08:00
}
type GroupUser struct {
gorm.Model
2024-08-02 15:02:56 +08:00
GroupID int `gorm:"column:group_id"`
UserID int `gorm:"column:user_id"`
IsMaster bool `gorm:"column:is_master"`
2024-08-02 09:47:33 +08:00
}
type Friend struct {
gorm.Model
UserID int `gorm:"column:user_id"`
FriendID int `gorm:"column:friend_id"`
}
// 创建单聊消息
func CreateSimpleMessage(from_user_id, to_user_id int, message string) (error, uint) {
2024-08-02 15:02:56 +08:00
msg := Message{FromUserID: from_user_id, ToUserID: to_user_id, Msg: message, Type: proto.MSG_TYPE_SIMPLE, Status: proto.MSG_STATUS_UNREAD}
res := DB.Debug().Create(&msg)
return res.Error, msg.ID
2024-08-02 15:02:56 +08:00
}
func CreateGeneralMessage(from_user_id, to_user_id, msg_type, status, group_id int, message string) (error error, id uint) {
msg := Message{FromUserID: from_user_id, ToUserID: to_user_id, Msg: message, Type: msg_type, Status: status, GroupID: group_id}
res := DB.Debug().Create(&msg)
return res.Error, msg.ID
2024-08-02 09:47:33 +08:00
}
// 每20个消息一组请求index*20
func GetMsgUserByIndex(from_user_id, to_user_id, msg_type, index, status int) ([]Message, error) {
2024-08-02 09:47:33 +08:00
var msgs []Message
var res *gorm.DB
if msg_type == 4 {
2024-08-07 20:19:27 +08:00
res = DB.Debug().Where("from_user_id = ? and to_user_id = ? and type = ? and status = ? ", from_user_id, to_user_id, msg_type, status).Order("created_at DESC").Limit(20 * index).Find(&msgs)
} else if msg_type == 1 {
//单聊,只有两个人的消息
2024-08-07 23:17:56 +08:00
res = DB.Debug().Raw("select * from messages where (from_user_id = ? AND to_user_id = ?) and type = ? or (from_user_id = ? AND to_user_id = ?) and type = ? order by created_at desc limit ?", from_user_id, to_user_id, msg_type, to_user_id, from_user_id, msg_type, 20*index).Scan(&msgs)
2024-08-07 20:25:42 +08:00
//res = DB.Debug().Where("(from_user_id = ? AND to_user_id = ?) or (from_user_id = ? AND to_user_id = ?) and type = ? ", from_user_id, to_user_id, to_user_id, from_user_id, msg_type).Order("created_at DESC").Limit(20 * index).Find(&msgs)
} else {
2024-08-07 20:19:27 +08:00
res = DB.Debug().Where("from_user_id = ? and to_user_id = ? and type = ? ", from_user_id, to_user_id, msg_type).Order("created_at DESC").Limit(20 * index).Find(&msgs)
}
return msgs, res.Error
}
type GroupMessage struct {
Message
UserName string `gorm:"column:name" json:"name"`
}
func GetMsgGroupByIndex(group_id, index int) ([]GroupMessage, error) {
var msgs []GroupMessage
res := DB.Debug().Raw("select messages.*,users.name from messages join users on messages.from_user_id = users.id where type = 2 and group_id = ? order by created_at desc limit ?", group_id, 20*index).Scan(&msgs)
return msgs, res.Error
}
// 获取邀请消息
func GetFriendGroupReq(user_id int) ([]Message, error) {
var msgs []Message
res := DB.Debug().Where("to_user_id = ? and type = ?", user_id, proto.MSG_TYPE_FRIEND).Find(&msgs)
2024-08-02 09:47:33 +08:00
return msgs, res.Error
}
// 修改信息
func UpdateMessage() {
}
2024-08-02 15:02:56 +08:00
// 添加好友
func AddFriend(user_id, friend_id int) error {
friend := Friend{UserID: user_id, FriendID: friend_id}
friend2 := Friend{UserID: friend_id, FriendID: user_id}
//开启事务
tx := DB.Begin()
if err := tx.Create(&friend); err.Error != nil {
tx.Rollback()
return err.Error
}
if err := tx.Create(&friend2); err.Error != nil {
tx.Rollback()
return err.Error
}
//提交事务
if err := tx.Commit().Error; err != nil {
return err
}
return error(nil)
}
// 删除好友,删除后双方都不是好友
func DeleteFriend(user_id, friend_id int) error {
//开启事务
tx := DB.Begin()
if err := tx.Delete(&Friend{}, "user_id = ? and friend_id = ?", user_id, friend_id); err.Error != nil {
tx.Rollback()
return err.Error
}
if err := tx.Delete(&Friend{}, "user_id = ? and friend_id = ?", friend_id, user_id); err.Error != nil {
tx.Rollback()
return err.Error
}
//提交事务
if err := tx.Commit().Error; err != nil {
return err
}
return error(nil)
}
// 通过id查找消息
2024-08-02 09:47:33 +08:00
func FindMessageByID(id uint) []Message {
var msgs []Message
DB.Debug().Where("id = ?", id).Find(&msgs)
2024-08-02 09:47:33 +08:00
return msgs
}
2024-08-02 15:02:56 +08:00
// 通过id查找消息包括name)
func FindMessageByID2(id uint) []GroupMessage {
var msgs []GroupMessage
DB.Debug().Raw("select messages.*,users.name from messages join users on messages.from_user_id = users.id where messages.id = ?", id).Scan(&msgs)
return msgs
}
2024-08-02 15:02:56 +08:00
// 更新消息状态
func UpdateMessageStatus(id uint, status int) error {
res := DB.Debug().Model(&Message{}).Where("id = ?", id).Update("status", status)
return res.Error
}
// 创建群聊,需要事务
func CreateGroup(groupName, groupInfo, groupType, groupIcon string, user_id int) (error, uint) {
group := Group{GroupName: groupName, GroupInfo: groupInfo, GroupType: proto.MSG_TYPE_GROUP, GroupIcon: groupIcon, AuthID: user_id}
2024-08-02 15:02:56 +08:00
//开启事务
tx := DB.Begin()
if err := tx.Create(&group); err.Error != nil {
tx.Rollback()
return err.Error, 0
2024-08-02 15:02:56 +08:00
}
groupUser := GroupUser{GroupID: int(group.ID), UserID: user_id, IsMaster: true}
2024-08-02 15:02:56 +08:00
if err := tx.Create(&groupUser); err.Error != nil {
tx.Rollback()
return err.Error, 0
2024-08-02 15:02:56 +08:00
}
//提交事务
if err := tx.Commit().Error; err != nil {
return err, 0
2024-08-02 15:02:56 +08:00
}
return nil, group.ID
}
// 查找用户是否在群聊
func FindGroupUser(user_id, group_id int) []GroupUser {
var groupUsers []GroupUser
DB.Debug().Where("user_id = ? and group_id = ?", user_id, group_id).Find(&groupUsers)
return groupUsers
2024-08-02 15:02:56 +08:00
}
// 加入群聊
func JoinGroup(group_id, user_id int) (error, uint) {
2024-08-02 15:02:56 +08:00
groupUser := GroupUser{GroupID: group_id, UserID: user_id}
res := DB.Debug().Create(&groupUser)
return res.Error, groupUser.ID
2024-08-02 15:02:56 +08:00
}
// 退出群聊
func QuitGroup(group_id, user_id int) error {
res := DB.Debug().Delete(&GroupUser{}, "group_id = ? and user_id = ?", group_id, user_id)
return res.Error
}
func FindFriend(from_user_id, to_user_id int) []Friend {
var friends []Friend
DB.Debug().Where("user_id = ? and friend_id = ?", from_user_id, to_user_id).Find(&friends)
return friends
}
type FriendRet struct {
2024-08-07 18:09:36 +08:00
ID int `json:"id"` //用户id
Name string `json:"name"` //用户名
Email string `json:"email"` //邮箱
}
func FindFriends(user_id int) []FriendRet {
var friends []FriendRet
DB.Debug().Raw("select users.id, users.name, users.email from users join friends on users.id = friends.friend_id where friends.user_id = ? and friends.deleted_at is null", user_id).Scan(&friends)
return friends
}
func GetGroups(user_id int) []Group {
var groups []Group
DB.Debug().Where("auth_id = ?", user_id).Find(&groups)
return groups
}
func FindGroups(user_id int) []Group {
var groups []Group
DB.Debug().Raw("select groups.* from groups join group_users on groups.id = group_users.group_id where group_users.user_id = ? and group_users.deleted_at is null", user_id).Scan(&groups)
return groups
}
func FindGroupByID(group_id int) []Group {
var groups []Group
DB.Debug().Where("id = ?", group_id).Find(&groups)
return groups
}
2024-08-09 20:52:47 +08:00
func UpdateGroup(group_id int, groupName, groupInfo, groupIcon string) error {
res := DB.Debug().Model(&Group{}).Where("id = ?", group_id).Updates(map[string]interface{}{"group_name": groupName, "group_info": groupInfo, "group_icon": groupIcon})
return res.Error
}
2024-08-09 20:52:47 +08:00
type FriendRequest struct {
ID int `json:"id"`
IMID int `json:"im_id"`
Name string `json:"name"`
Email string `json:"email"`
Age int `json:"age"`
}
func GetFriendRequest(user_id int) []FriendRequest {
var users []FriendRequest
DB.Debug().Raw("select users.id,users.name,users.email,users.age,messages.id as im_id from users join messages on users.id = messages.from_user_id where messages.to_user_id = ? and messages.type = ? and status = ?", user_id, proto.MSG_TYPE_FRIEND, 0).Scan(&users)
return users
}
func FindGroupUsers(group_id int) []GroupUser {
var groupUsers []GroupUser
DB.Debug().Where("group_id = ?", group_id).Find(&groupUsers)
return groupUsers
}