videoplayer/dao/im.go

298 lines
9.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.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.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.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.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.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.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.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) []FriendRequest {
var users []FriendRequest
DB.Raw("select id,im_id,name,email 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_INVI, 0, user_id).Scan(&users)
return users
}
func GetMsgUserGroupReq(from_user_id, group_id int) ([]Message, error) {
var msgs []Message
res := DB.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.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.Where("id = ?", id).Find(&msgs)
return msgs
}
// 通过id查找消息包括name)
func FindMessageByID2(id uint) []GroupMessage {
var msgs []GroupMessage
DB.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.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.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.Create(&groupUser)
return res.Error, groupUser.ID
}
// 退出群聊
func QuitGroup(group_id, user_id int) error {
res := DB.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.Where("id = ?", group_id).Find(&groups)
return groups
}
// 删除群聊
func DeleteGroup(group_id int, auth_id int) error {
res := DB.Delete(&Group{}, "id = ? and auth_id = ?", group_id, auth_id)
return res.Error
}
// 删除群里的用户
func DeleteGroupUsers(group_id int) error {
res := DB.Delete(&GroupUser{}, "group_id = ?", group_id)
return res.Error
}
func FindFriend(from_user_id, to_user_id int) []Friend {
var friends []Friend
DB.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.Where("user_id = ?", user_id).Find(&friends)
return friends
}
func FindFriends(user_id int) []FriendRet {
var friends []FriendRet
DB.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.Where("auth_id = ?", user_id).Find(&groups)
return groups
}
func FindGroups(user_id int) []Group {
var groups []Group
DB.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.Where("id = ?", group_id).Find(&groups)
return groups
}
func UpdateGroup(group_id int, groupName, groupInfo, groupIcon string) error {
res := DB.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"`
}
func GetFriendRequest(user_id int) []FriendRequest {
var users []FriendRequest
DB.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.Where("group_id = ?", group_id).Find(&groupUsers)
return groupUsers
}
func FindGroupByNameLike(groupName string) []Group {
var groups []Group
DB.Where("group_name like ?", "%"+groupName+"%").Limit(20).Find(&groups)
return groups
}