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未读
2024-08-04 21:01:06 +08:00
Type int ` gorm:"column:type" ` //1为单聊, 2为群聊, 3为系统消息,4为好友请求,5为加入群聊请求
2024-08-02 09:47:33 +08:00
}
type Group struct {
gorm . Model
2024-08-16 15:25:10 +08:00
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" `
}
// 创建单聊消息
2024-08-04 21:01:06 +08:00
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 }
2024-10-04 11:37:25 +08:00
res := DB . Create ( & msg )
2024-08-04 21:01:06 +08:00
return res . Error , msg . ID
2024-08-02 15:02:56 +08:00
}
2024-08-04 21:01:06 +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 }
2024-10-04 11:37:25 +08:00
res := DB . Create ( & msg )
2024-08-04 21:01:06 +08:00
return res . Error , msg . ID
2024-08-02 09:47:33 +08:00
}
// 每20个消息一组, 请求index*20
2024-08-04 21:01:06 +08:00
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
2024-08-04 21:01:06 +08:00
var res * gorm . DB
if msg_type == 4 {
2024-10-04 11:37:25 +08:00
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 )
2024-08-04 21:01:06 +08:00
} else if msg_type == 1 {
//单聊,只有两个人的消息
2024-10-04 11:37:25 +08:00
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)
2024-08-04 21:01:06 +08:00
} else {
2024-10-04 11:37:25 +08:00
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 )
2024-08-04 21:01:06 +08:00
}
return msgs , res . Error
}
2024-08-16 15:25:10 +08:00
type GroupMessage struct {
Message
UserName string ` gorm:"column:name" json:"name" `
}
func GetMsgGroupByIndex ( group_id , index int ) ( [ ] GroupMessage , error ) {
var msgs [ ] GroupMessage
2024-10-04 11:37:25 +08:00
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 )
2024-08-16 15:25:10 +08:00
return msgs , res . Error
}
2024-10-07 17:21:27 +08:00
func GetGroupRequestUsers ( user_id int ) [ ] GroupRequestUsers {
var users [ ] GroupRequestUsers
2024-10-07 17:24:07 +08:00
DB . 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 )
2024-08-20 15:25:13 +08:00
return users
}
func GetMsgUserGroupReq ( from_user_id , group_id int ) ( [ ] Message , error ) {
var msgs [ ] Message
2024-10-04 11:37:25 +08:00
res := DB . Where ( "from_user_id = ? and group_id = ? and type = ? and status = ?" , from_user_id , group_id , 5 , 0 ) . Find ( & msgs )
2024-08-20 15:25:13 +08:00
return msgs , res . Error
}
2024-08-04 21:01:06 +08:00
// 获取邀请消息
func GetFriendGroupReq ( user_id int ) ( [ ] Message , error ) {
var msgs [ ] Message
2024-10-04 11:37:25 +08:00
res := DB . 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
2024-10-04 11:37:25 +08:00
DB . Where ( "id = ?" , id ) . Find ( & msgs )
2024-08-02 09:47:33 +08:00
return msgs
}
2024-08-02 15:02:56 +08:00
2024-08-16 15:25:10 +08:00
// 通过id查找消息( 包括name)
func FindMessageByID2 ( id uint ) [ ] GroupMessage {
var msgs [ ] GroupMessage
2024-10-04 11:37:25 +08:00
DB . Raw ( "select messages.*,users.name from messages join users on messages.from_user_id = users.id where messages.id = ?" , id ) . Scan ( & msgs )
2024-08-16 15:25:10 +08:00
return msgs
}
2024-08-02 15:02:56 +08:00
// 更新消息状态
func UpdateMessageStatus ( id uint , status int ) error {
2024-10-04 11:37:25 +08:00
res := DB . Model ( & Message { } ) . Where ( "id = ?" , id ) . Update ( "status" , status )
2024-08-02 15:02:56 +08:00
return res . Error
}
// 创建群聊,需要事务
2024-08-04 21:01:06 +08:00
func CreateGroup ( groupName , groupInfo , groupType , groupIcon string , user_id int ) ( error , uint ) {
2024-08-16 15:25:10 +08:00
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 ( )
2024-08-04 21:01:06 +08:00
return err . Error , 0
2024-08-02 15:02:56 +08:00
}
2024-08-04 21:01:06 +08:00
groupUser := GroupUser { GroupID : int ( group . ID ) , UserID : user_id , IsMaster : true }
2024-08-02 15:02:56 +08:00
if e rr := tx . Create ( & groupUser ) ; err . Error != nil {
tx . Rollback ( )
2024-08-04 21:01:06 +08:00
return err . Error , 0
2024-08-02 15:02:56 +08:00
}
//提交事务
if err := tx . Commit ( ) . Error ; err != nil {
2024-08-04 21:01:06 +08:00
return err , 0
2024-08-02 15:02:56 +08:00
}
2024-08-04 21:01:06 +08:00
return nil , group . ID
}
// 查找用户是否在群聊
func FindGroupUser ( user_id , group_id int ) [ ] GroupUser {
var groupUsers [ ] GroupUser
2024-10-04 11:37:25 +08:00
DB . Where ( "user_id = ? and group_id = ?" , user_id , group_id ) . Find ( & groupUsers )
2024-08-04 21:01:06 +08:00
return groupUsers
2024-08-02 15:02:56 +08:00
}
// 加入群聊
2024-08-16 15:25:10 +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 }
2024-10-04 11:37:25 +08:00
res := DB . Create ( & groupUser )
2024-08-16 15:25:10 +08:00
return res . Error , groupUser . ID
2024-08-02 15:02:56 +08:00
}
// 退出群聊
func QuitGroup ( group_id , user_id int ) error {
2024-10-04 11:37:25 +08:00
res := DB . Delete ( & GroupUser { } , "group_id = ? and user_id = ?" , group_id , user_id )
2024-08-02 15:02:56 +08:00
return res . Error
}
2024-08-04 21:01:06 +08:00
2024-08-20 10:27:42 +08:00
// 根据群id查找群
func FindGroup ( group_id int ) [ ] Group {
var groups [ ] Group
2024-10-04 11:37:25 +08:00
DB . Where ( "id = ?" , group_id ) . Find ( & groups )
2024-08-20 10:27:42 +08:00
return groups
}
// 删除群聊
func DeleteGroup ( group_id int , auth_id int ) error {
2024-10-04 11:37:25 +08:00
res := DB . Delete ( & Group { } , "id = ? and auth_id = ?" , group_id , auth_id )
2024-08-20 10:27:42 +08:00
return res . Error
}
// 删除群里的用户
func DeleteGroupUsers ( group_id int ) error {
2024-10-04 11:37:25 +08:00
res := DB . Delete ( & GroupUser { } , "group_id = ?" , group_id )
2024-08-20 10:27:42 +08:00
return res . Error
}
2024-08-04 21:01:06 +08:00
func FindFriend ( from_user_id , to_user_id int ) [ ] Friend {
var friends [ ] Friend
2024-10-04 11:37:25 +08:00
DB . Where ( "user_id = ? and friend_id = ?" , from_user_id , to_user_id ) . Find ( & friends )
2024-08-04 21:01:06 +08:00
return friends
}
2024-08-07 15:31:25 +08:00
type FriendRet struct {
2025-01-01 14:08:37 +08:00
ID int ` json:"id" ` //用户id
Name string ` json:"name" ` //用户名
Email string ` json:"email" ` //邮箱
Avatar string ` json:"avatar" ` //头像
2024-08-07 15:31:25 +08:00
}
2024-09-21 13:27:08 +08:00
func FindFriendsIDs ( user_id int ) [ ] Friend {
var friends [ ] Friend
2024-10-04 11:37:25 +08:00
DB . Where ( "user_id = ?" , user_id ) . Find ( & friends )
2024-09-21 13:27:08 +08:00
return friends
}
2024-08-07 15:31:25 +08:00
func FindFriends ( user_id int ) [ ] FriendRet {
var friends [ ] FriendRet
2025-01-01 14:21:15 +08:00
DB . Raw ( "select distinct users.id, users.name, users.email,users.avatar from users join friends on users.id = friends.friend_id where friends.user_id = ? and friends.deleted_at is null" , user_id ) . Scan ( & friends )
2024-08-07 15:31:25 +08:00
return friends
}
2024-08-16 15:25:10 +08:00
func GetGroups ( user_id int ) [ ] Group {
var groups [ ] Group
2024-10-04 11:37:25 +08:00
DB . Where ( "auth_id = ?" , user_id ) . Find ( & groups )
2024-08-16 15:25:10 +08:00
return groups
}
2024-08-07 15:31:25 +08:00
func FindGroups ( user_id int ) [ ] Group {
var groups [ ] Group
2024-10-04 11:37:25 +08:00
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 )
2024-08-16 15:25:10 +08:00
return groups
}
func FindGroupByID ( group_id int ) [ ] Group {
var groups [ ] Group
2024-10-04 11:37:25 +08:00
DB . Where ( "id = ?" , group_id ) . Find ( & groups )
2024-08-07 15:31:25 +08:00
return groups
}
2024-08-09 20:52:47 +08:00
2024-10-25 18:23:58 +08:00
func UpdateGroup ( group_id int , groupName , groupInfo , groupType , groupIcon string , user_id int ) error {
2024-10-25 18:32:13 +08:00
res := DB . Model ( & Group { } ) . Where ( "id = ? and auth_id = ? " , group_id , user_id ) . Updates ( map [ string ] interface { } { "group_name" : groupName , "group_info" : groupInfo , "group_icon" : groupIcon , "group_type" : groupType } )
2024-08-16 15:25:10 +08:00
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" `
}
2024-10-07 17:21:27 +08:00
type GroupRequestUsers struct {
2024-10-07 17:10:10 +08:00
FriendRequest
GroupID int ` json:"group_id" `
2024-08-09 20:52:47 +08:00
}
func GetFriendRequest ( user_id int ) [ ] FriendRequest {
var users [ ] FriendRequest
2024-10-04 11:37:25 +08:00
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 )
2024-08-09 20:52:47 +08:00
return users
}
2024-08-16 15:25:10 +08:00
func FindGroupUsers ( group_id int ) [ ] GroupUser {
var groupUsers [ ] GroupUser
2024-10-04 11:37:25 +08:00
DB . Where ( "group_id = ?" , group_id ) . Find ( & groupUsers )
2024-08-16 15:25:10 +08:00
return groupUsers
}
2024-10-07 15:58:58 +08:00
func FindGroupUsersInfo ( group_id int ) [ ] FriendRet {
var groupUsers [ ] FriendRet
2024-11-30 11:19:16 +08:00
DB . 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 )
2024-10-07 15:58:58 +08:00
return groupUsers
}
2024-08-20 10:27:42 +08:00
func FindGroupByNameLike ( groupName string ) [ ] Group {
var groups [ ] Group
2024-10-04 11:37:25 +08:00
DB . Where ( "group_name like ?" , "%" + groupName + "%" ) . Limit ( 20 ) . Find ( & groups )
2024-08-20 10:27:42 +08:00
return groups
}