From a1247d9ca450d547164592159895781bc1f45b65 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Mon, 7 Oct 2024 15:58:58 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=BE=A4=E6=88=90=E5=91=98=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=E8=B8=A2=E7=BE=A4=E6=88=90=E5=91=98=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/im.go | 7 ++++++- handler/im.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/dao/im.go b/dao/im.go index d06b52d..deed105 100644 --- a/dao/im.go +++ b/dao/im.go @@ -244,7 +244,7 @@ func FindFriendsIDs(user_id int) []Friend { 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) + 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 { @@ -289,6 +289,11 @@ func FindGroupUsers(group_id int) []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 = ?", group_id).Scan(&groupUsers) + return groupUsers +} func FindGroupByNameLike(groupName string) []Group { var groups []Group diff --git a/handler/im.go b/handler/im.go index 74ed1a9..4db633d 100644 --- a/handler/im.go +++ b/handler/im.go @@ -77,6 +77,7 @@ func SetUpIMGroup(router *gin.Engine) { //获取好友请求 imGroup.POST("/get_friend_request", GetFriendRequest) imGroup.POST("/del_friend_or_group", DelFriendOrGroup) + imGroup.POST("/get_group_users_info", GetGroupUsersInfo) } func generateRandomHexString(length int) (string, error) { bytes := make([]byte, length/2) // 16字节的字符串需要32个十六进制字符,即16个字节 @@ -86,6 +87,31 @@ func generateRandomHexString(length int) (string, error) { return hex.EncodeToString(bytes), nil } +func GetGroupUsersInfo(c *gin.Context) { + var req Message + id, _ := c.Get("id") + user_id := int(id.(float64)) + if err := c.ShouldBind(&req); err == nil { + if req.GroupID == 0 { + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) + return + } + group := dao.FindGroupByID(req.GroupID) + if len(group) == 0 { + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) + return + } + if group[0].AuthID != user_id { + c.JSON(http.StatusOK, gin.H{"error": "no permission", "code": proto.ParameterError, "message": "不是群主"}) + return + } + data := dao.FindGroupUsersInfo(req.GroupID) + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "data": data, "message": "success"}) + } else { + c.JSON(http.StatusOK, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) + } +} + func GetGroups(c *gin.Context) { id, _ := c.Get("id") user_id := int(id.(float64)) @@ -137,6 +163,29 @@ func DelFriendOrGroup(c *gin.Context) { } else { c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) } + } else if req.Type == 4 { + //群管理员删除群成员 + if req.GroupID == 0 { + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) + return + } + //获取群 + group := dao.FindGroupByID(req.GroupID) + if len(group) == 0 { + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) + return + } + //判断是否是群主 + if group[0].AuthID != cid { + c.JSON(http.StatusOK, gin.H{"error": "no permission", "code": proto.ParameterError, "message": "不是群主"}) + return + } + err2 := service.QuitGroupService(req.To_user_id, req.GroupID) + if err2 == nil { + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + } else { + c.JSON(http.StatusOK, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) + } } else { c.JSON(http.StatusOK, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) } From 27a85614485a44773022dbced82c3d76ff4b2e9a Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Mon, 7 Oct 2024 16:23:35 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E8=B8=A2=E7=BE=A4=E6=88=90=E5=91=98?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/im.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/handler/im.go b/handler/im.go index 4db633d..31bc8f4 100644 --- a/handler/im.go +++ b/handler/im.go @@ -166,13 +166,13 @@ func DelFriendOrGroup(c *gin.Context) { } else if req.Type == 4 { //群管理员删除群成员 if req.GroupID == 0 { - c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed,group_id is null"}) return } //获取群 group := dao.FindGroupByID(req.GroupID) if len(group) == 0 { - c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed group not found"}) return } //判断是否是群主 From 0543b82a8fb94d2744d37f93d5fe0bee47251928 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Mon, 7 Oct 2024 16:35:27 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E8=B8=A2=E7=BE=A4=E6=88=90=E5=91=98?= =?UTF-8?q?=E5=8A=9F=E8=83=BD,=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=8A=A0=E5=85=A5=E7=BE=A4=E8=81=8A=E8=AF=B7=E6=B1=82=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/im.go | 2 +- handler/im.go | 46 +++++++++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/dao/im.go b/dao/im.go index deed105..799664a 100644 --- a/dao/im.go +++ b/dao/im.go @@ -80,7 +80,7 @@ func GetMsgGroupByIndex(group_id, index int) ([]GroupMessage, error) { func GetGroupRequestUsers(user_id int) []FriendRequest { var users []FriendRequest - DB.Debug().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) + DB.Debug().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_ADD, 0, user_id).Scan(&users) return users } diff --git a/handler/im.go b/handler/im.go index 31bc8f4..bb31805 100644 --- a/handler/im.go +++ b/handler/im.go @@ -160,32 +160,32 @@ func DelFriendOrGroup(c *gin.Context) { } else { c.JSON(http.StatusOK, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) } + } else if req.Type == 4 { + //群管理员删除群成员 + if req.GroupID == 0 { + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed,group_id is null"}) + return + } + //获取群 + group := dao.FindGroupByID(req.GroupID) + if len(group) == 0 { + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed group not found"}) + return + } + //判断是否是群主 + if group[0].AuthID != cid { + c.JSON(http.StatusOK, gin.H{"error": "no permission", "code": proto.ParameterError, "message": "不是群主"}) + return + } + err2 := service.QuitGroupService(req.To_user_id, req.GroupID) + if err2 == nil { + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + } else { + c.JSON(http.StatusOK, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) + } } else { c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed"}) } - } else if req.Type == 4 { - //群管理员删除群成员 - if req.GroupID == 0 { - c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed,group_id is null"}) - return - } - //获取群 - group := dao.FindGroupByID(req.GroupID) - if len(group) == 0 { - c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed group not found"}) - return - } - //判断是否是群主 - if group[0].AuthID != cid { - c.JSON(http.StatusOK, gin.H{"error": "no permission", "code": proto.ParameterError, "message": "不是群主"}) - return - } - err2 := service.QuitGroupService(req.To_user_id, req.GroupID) - if err2 == nil { - c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) - } else { - c.JSON(http.StatusOK, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) - } } else { c.JSON(http.StatusOK, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) } From e192954037f3fc3be2675289ba693bf2b179cae7 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Mon, 7 Oct 2024 16:42:43 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E8=B8=A2=E7=BE=A4=E6=88=90=E5=91=98?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/im.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dao/im.go b/dao/im.go index 799664a..1ea6064 100644 --- a/dao/im.go +++ b/dao/im.go @@ -291,7 +291,7 @@ func FindGroupUsers(group_id int) []GroupUser { } 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 = ?", group_id).Scan(&groupUsers) + 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 } From 6d45baa4bdfa45e66479c274d7fc59e48e36a41e Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Mon, 7 Oct 2024 17:03:45 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=8B=92=E7=BB=9D=E4=B8=8E=E5=90=8C?= =?UTF-8?q?=E6=84=8F=E7=94=A8=E6=88=B7=E5=8A=A0=E5=85=A5=E7=BE=A4=E8=81=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/im.go | 44 ++++++++++++++++++++++++++++++++++---------- service/imService.go | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/handler/im.go b/handler/im.go index bb31805..cb3cd7b 100644 --- a/handler/im.go +++ b/handler/im.go @@ -203,7 +203,6 @@ func GetMessage(c *gin.Context) { id := int(user_id.(float64)) //解析参数 if err := c.ShouldBind(&req); err == nil { - if req.Type == 2 { msgs, err2 := dao.GetMsgGroupByIndex(req.GroupID, req.Index) if err2 == nil { @@ -266,27 +265,52 @@ func AcceptInvite(c *gin.Context) { user_id, _ := c.Get("id") cid := int(user_id.(float64)) if err := c.ShouldBind(&req); err == nil { - err2 := service.AddFriendService(req.ID, cid, req.To_user_id) - if err2 == nil { - c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + if req.Type == 1 { + //同意添加好友 + err2 := service.AddFriendService(req.ID, cid, req.To_user_id) + if err2 == nil { + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + } else { + c.JSON(http.StatusOK, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) + } + } else if req.Type == 2 { + //同意加入群聊 + err3 := service.JoinGroupService(req.ID, cid, req.To_user_id, req.GroupID) + if err3 == nil { + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + } else { + c.JSON(http.StatusOK, gin.H{"error": err3.Error(), "code": proto.OperationFailed, "message": "failed"}) + } } else { - c.JSON(http.StatusOK, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) + c.JSON(http.StatusOK, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) } } else { c.JSON(http.StatusOK, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) } } - func RejectInvite(c *gin.Context) { var req Message user_id, _ := c.Get("id") cid := int(user_id.(float64)) if err := c.ShouldBind(&req); err == nil { - err2 := service.RejectFriendService(req.ID, cid, req.To_user_id) - if err2 == nil { - c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + if req.Type == 1 { + //拒绝添加好友 + err2 := service.RejectFriendService(req.ID, cid, req.To_user_id) + if err2 == nil { + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + } else { + c.JSON(http.StatusOK, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) + } + } else if req.Type == 2 { + //拒绝加入群聊 + err3 := service.RejectGroupService(req.ID, cid, req.To_user_id, req.GroupID) + if err3 == nil { + c.JSON(http.StatusOK, gin.H{"code": proto.SuccessCode, "message": "success"}) + } else { + c.JSON(http.StatusOK, gin.H{"error": err3.Error(), "code": proto.OperationFailed, "message": "failed"}) + } } else { - c.JSON(http.StatusOK, gin.H{"error": err2.Error(), "code": proto.OperationFailed, "message": "failed"}) + c.JSON(http.StatusOK, gin.H{"error": "parameter error", "code": proto.ParameterError, "message": "failed type error"}) } } else { c.JSON(http.StatusOK, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"}) diff --git a/service/imService.go b/service/imService.go index 4a3f9d6..8eedb88 100644 --- a/service/imService.go +++ b/service/imService.go @@ -340,3 +340,39 @@ func SetGroupCache(group_id int) bool { res := worker.SetRedisSet("group_"+strconv.Itoa(group_id)+"_users", ids, time.Hour*12) return res } + +// 同意用户加入群聊 +func JoinGroupService(im_id, cid, user_id, group_id int) error { + + group := dao.FindGroup(group_id) + if len(group) == 0 { + return errors.New("no such group") + } + if group[0].AuthID != cid { + return errors.New("no permission") + } + + //判断是否在群里 + groupUser := dao.FindGroupUser(user_id, group_id) + if len(groupUser) > 0 { + return errors.New("已在群里") + } + err, _ := dao.JoinGroup(group_id, user_id) + if err != nil { + return err + } + err = dao.UpdateMessageStatus(uint(im_id), 1) + return err +} + +func RejectGroupService(im_id, cid, user_id, group_id int) error { + group := dao.FindGroup(group_id) + if len(group) == 0 { + return errors.New("no such group") + } + if group[0].AuthID != cid { + return errors.New("no permission") + } + err := dao.UpdateMessageStatus(uint(im_id), 1) // 拒绝,设为已读 + return err +} From 77357d27cf7bcc60ccace070920d1dc7e26b7e8c Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Mon, 7 Oct 2024 17:10:10 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E6=8B=92=E7=BB=9D=E4=B8=8E=E5=90=8C?= =?UTF-8?q?=E6=84=8F=E7=94=A8=E6=88=B7=E5=8A=A0=E5=85=A5=E7=BE=A4=E8=81=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/im.go | 11 ++++++++--- service/imService.go | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/dao/im.go b/dao/im.go index 1ea6064..6fd636b 100644 --- a/dao/im.go +++ b/dao/im.go @@ -78,9 +78,9 @@ func GetMsgGroupByIndex(group_id, index int) ([]GroupMessage, error) { } -func GetGroupRequestUsers(user_id int) []FriendRequest { - var users []FriendRequest - DB.Debug().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_ADD, 0, user_id).Scan(&users) +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 } @@ -278,6 +278,11 @@ type FriendRequest struct { 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) diff --git a/service/imService.go b/service/imService.go index 8eedb88..08d1147 100644 --- a/service/imService.go +++ b/service/imService.go @@ -311,7 +311,7 @@ func GetGroupByNameLike(name string) []dao.Group { return groups } -func GetGroupRequestUsers(user_id int) []dao.FriendRequest { +func GetGroupRequestUsers(user_id int) []dao.GroupRequest { //获取群聊请求 users := dao.GetGroupRequestUsers(user_id) return users From 3e85b9e199705adea11fddd1daf7b36255bbc9b8 Mon Sep 17 00:00:00 2001 From: junleea <354425203@qq.com> Date: Mon, 7 Oct 2024 17:21:27 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/im.go | 6 +++--- service/imService.go | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dao/im.go b/dao/im.go index 6fd636b..f5848a5 100644 --- a/dao/im.go +++ b/dao/im.go @@ -78,8 +78,8 @@ func GetMsgGroupByIndex(group_id, index int) ([]GroupMessage, error) { } -func GetGroupRequestUsers(user_id int) []GroupRequest { - var users []GroupRequest +func GetGroupRequestUsers(user_id int) []GroupRequestUsers { + var users []GroupRequestUsers 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 } @@ -278,7 +278,7 @@ type FriendRequest struct { Age int `json:"age"` } -type GroupRequest struct { +type GroupRequestUsers struct { FriendRequest GroupID int `json:"group_id"` } diff --git a/service/imService.go b/service/imService.go index 08d1147..b50a192 100644 --- a/service/imService.go +++ b/service/imService.go @@ -311,7 +311,7 @@ func GetGroupByNameLike(name string) []dao.Group { return groups } -func GetGroupRequestUsers(user_id int) []dao.GroupRequest { +func GetGroupRequestUsers(user_id int) []dao.GroupRequestUsers { //获取群聊请求 users := dao.GetGroupRequestUsers(user_id) return users