package dao import ( "gorm.io/gorm" "videoplayer/proto" ) 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为加入群聊请求 } type Group struct { gorm.Model AuthID int `gorm:"column:auth_id"` GroupName string `gorm:"column:group_name"` GroupInfo string `gorm:"column:group_info"` GroupType int `gorm:"column:group_type"` GroupIcon string `gorm:"column:group_icon"` } type GroupUser struct { gorm.Model GroupID int `gorm:"column:group_id"` UserID int `gorm:"column:user_id"` IsMaster bool `gorm:"column:is_master"` } 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) { 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 } 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 } // 每20个消息一组,请求index*20 func GetMsgUserByIndex(from_user_id, to_user_id, msg_type, index, status int) ([]Message, error) { var msgs []Message var res *gorm.DB if msg_type == 4 { 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 { //单聊,只有两个人的消息 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) //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 { 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 GetGroupRequestUsers(user_id int) []GroupRequest { var users []GroupRequest DB.Debug().Raw("select id,im_id,name,email,group_id FROM (SELECT im_id,from_user_id,group_id FROM (( SELECT id as im_id,from_user_id,group_id FROM messages WHERE type=? and status=? ) as m JOIN groups as g on g.id=m.group_id ) where g.auth_id=? ) as e JOIN users as u ON e.from_user_id=u.id", proto.MSG_TYPE_GROUP_ADD, 0, user_id).Scan(&users) return users } func GetMsgUserGroupReq(from_user_id, group_id int) ([]Message, error) { var msgs []Message res := DB.Debug().Where("from_user_id = ? and group_id = ? and type = ? and status = ?", from_user_id, group_id, 5, 0).Find(&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) return msgs, res.Error } // 修改信息 func UpdateMessage() { } // 添加好友 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查找消息 func FindMessageByID(id uint) []Message { var msgs []Message DB.Debug().Where("id = ?", id).Find(&msgs) return msgs } // 通过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 } // 更新消息状态 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} //开启事务 tx := DB.Begin() if err := tx.Create(&group); err.Error != nil { tx.Rollback() return err.Error, 0 } groupUser := GroupUser{GroupID: int(group.ID), UserID: user_id, IsMaster: true} if err := tx.Create(&groupUser); err.Error != nil { tx.Rollback() return err.Error, 0 } //提交事务 if err := tx.Commit().Error; err != nil { return err, 0 } 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 } // 加入群聊 func JoinGroup(group_id, user_id int) (error, uint) { groupUser := GroupUser{GroupID: group_id, UserID: user_id} res := DB.Debug().Create(&groupUser) return res.Error, groupUser.ID } // 退出群聊 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 } // 根据群id查找群 func FindGroup(group_id int) []Group { var groups []Group DB.Debug().Where("id = ?", group_id).Find(&groups) return groups } // 删除群聊 func DeleteGroup(group_id int, auth_id int) error { res := DB.Debug().Delete(&Group{}, "id = ? and auth_id = ?", group_id, auth_id) return res.Error } // 删除群里的用户 func DeleteGroupUsers(group_id int) error { res := DB.Debug().Delete(&GroupUser{}, "group_id = ?", group_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 { ID int `json:"id"` //用户id Name string `json:"name"` //用户名 Email string `json:"email"` //邮箱 } func FindFriendsIDs(user_id int) []Friend { var friends []Friend DB.Debug().Where("user_id = ?", user_id).Find(&friends) return friends } func FindFriends(user_id int) []FriendRet { var friends []FriendRet DB.Debug().Raw("select distinct 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 } 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 } type FriendRequest struct { ID int `json:"id"` IMID int `json:"im_id"` Name string `json:"name"` Email string `json:"email"` Age int `json:"age"` } type GroupRequest struct { FriendRequest GroupID int `json:"group_id"` } 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 } func FindGroupUsersInfo(group_id int) []FriendRet { var groupUsers []FriendRet DB.Debug().Raw("select distinct users.id, users.name, users.email from users join group_users on users.id = group_users.user_id where group_users.group_id = ? and group_users.deleted_at is null", group_id).Scan(&groupUsers) return groupUsers } func FindGroupByNameLike(groupName string) []Group { var groups []Group DB.Debug().Where("group_name like ?", "%"+groupName+"%").Limit(20).Find(&groups) return groups }