Compare commits

..

15 Commits

Author SHA1 Message Date
junleea 729f333fb0 Merge branch 'refs/heads/master' into release
# Conflicts:
#	dao/im.go
2024-10-07 17:24:07 +08:00
junleea 798dec54f6 Merge branch 'refs/heads/feature-im' 2024-10-07 17:21:48 +08:00
junleea 3e85b9e199 修改返回参数名 2024-10-07 17:21:27 +08:00
junleea b244854f2a Merge branch 'refs/heads/feature-im' 2024-10-07 17:10:19 +08:00
junleea 77357d27cf 拒绝与同意用户加入群聊 2024-10-07 17:10:10 +08:00
junleea e7898bdd9b Merge branch 'refs/heads/feature-im'
# Conflicts:
#	service/imService.go
2024-10-07 17:05:30 +08:00
junleea 6d45baa4bd 拒绝与同意用户加入群聊 2024-10-07 17:03:45 +08:00
junleea c3d802c2d9 Merge branch 'refs/heads/feature-im' 2024-10-07 16:42:52 +08:00
junleea e192954037 修改添加管理员踢群成员功能 2024-10-07 16:42:43 +08:00
junleea bb901e8f40 Merge branch 'refs/heads/feature-im' 2024-10-07 16:35:33 +08:00
junleea 0543b82a8f 修改添加管理员踢群成员功能,修改获取加入群聊请求列表 2024-10-07 16:35:27 +08:00
junleea fa1753389e Merge branch 'refs/heads/feature-im' 2024-10-07 16:23:43 +08:00
junleea 27a8561448 修改添加管理员踢群成员功能 2024-10-07 16:23:35 +08:00
junleea 1e559ac29d Merge branch 'refs/heads/feature-im' 2024-10-07 15:59:06 +08:00
junleea a1247d9ca4 添加获取群成员,添加管理员踢群成员功能 2024-10-07 15:58:58 +08:00
3 changed files with 134 additions and 15 deletions

View File

@ -78,9 +78,9 @@ func GetMsgGroupByIndex(group_id, index int) ([]GroupMessage, 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)
func GetGroupRequestUsers(user_id int) []GroupRequestUsers {
var users []GroupRequestUsers
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)
return users
}
@ -244,7 +244,7 @@ func FindFriendsIDs(user_id int) []Friend {
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)
DB.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 {
@ -278,6 +278,11 @@ type FriendRequest struct {
Age int `json:"age"`
}
type GroupRequestUsers struct {
FriendRequest
GroupID int `json:"group_id"`
}
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)
@ -289,6 +294,11 @@ func FindGroupUsers(group_id int) []GroupUser {
DB.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

View File

@ -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))
@ -134,6 +160,29 @@ 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"})
}
@ -154,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 {
@ -217,28 +265,53 @@ func AcceptInvite(c *gin.Context) {
user_id, _ := c.Get("id")
cid := int(user_id.(float64))
if err := c.ShouldBind(&req); err == nil {
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": 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 {
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": "parameter error", "code": proto.ParameterError, "message": "failed type error"})
}
} else {
c.JSON(http.StatusOK, gin.H{"error": err.Error(), "code": proto.ParameterError, "message": "failed"})
}

View File

@ -317,7 +317,7 @@ func GetGroupByNameLike(name string) []dao.Group {
return groups
}
func GetGroupRequestUsers(user_id int) []dao.FriendRequest {
func GetGroupRequestUsers(user_id int) []dao.GroupRequestUsers {
//获取群聊请求
users := dao.GetGroupRequestUsers(user_id)
return users
@ -370,3 +370,39 @@ func SetRobotMsg(person_id, robot_id int, msg string) {
return
}
}
// 同意用户加入群聊
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
}