You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Open-IM-Server/internal/rpc/group/group.go

593 lines
24 KiB

package group
import (
3 years ago
chat "Open_IM/internal/rpc/msg"
"Open_IM/pkg/common/config"
"Open_IM/pkg/common/constant"
"Open_IM/pkg/common/db"
3 years ago
"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
"Open_IM/pkg/common/log"
3 years ago
"Open_IM/pkg/common/token_verify"
3 years ago
cp "Open_IM/pkg/common/utils"
3 years ago
"Open_IM/pkg/grpc-etcdv3/getcdv3"
pbGroup "Open_IM/pkg/proto/group"
3 years ago
open_im_sdk "Open_IM/pkg/proto/sdk_ws"
"Open_IM/pkg/utils"
"context"
3 years ago
"google.golang.org/grpc"
"net"
"strconv"
"strings"
"time"
)
3 years ago
type groupServer struct {
rpcPort int
rpcRegisterName string
etcdSchema string
etcdAddr []string
}
func NewGroupServer(port int) *groupServer {
log.NewPrivateLog("group")
return &groupServer{
rpcPort: port,
rpcRegisterName: config.Config.RpcRegisterName.OpenImGroupName,
etcdSchema: config.Config.Etcd.EtcdSchema,
etcdAddr: config.Config.Etcd.EtcdAddr,
}
}
3 years ago
3 years ago
func (s *groupServer) Run() {
3 years ago
log.NewInfo("0", "group rpc start ")
3 years ago
ip := utils.ServerIP
registerAddress := ip + ":" + strconv.Itoa(s.rpcPort)
//listener network
listener, err := net.Listen("tcp", registerAddress)
if err != nil {
3 years ago
log.NewError("0", "Listen failed ", err.Error(), registerAddress)
3 years ago
return
}
3 years ago
log.NewInfo("0", "listen network success, ", registerAddress, listener)
3 years ago
defer listener.Close()
//grpc server
srv := grpc.NewServer()
defer srv.GracefulStop()
//Service registers with etcd
pbGroup.RegisterGroupServer(srv, s)
err = getcdv3.RegisterEtcd(s.etcdSchema, strings.Join(s.etcdAddr, ","), ip, s.rpcPort, s.rpcRegisterName, 10)
if err != nil {
3 years ago
log.NewError("0", "RegisterEtcd failed ", err.Error())
3 years ago
return
}
err = srv.Serve(listener)
if err != nil {
3 years ago
log.NewError("0", "Serve failed ", err.Error())
3 years ago
return
}
3 years ago
log.NewInfo("0", "group rpc success")
3 years ago
}
func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupReq) (*pbGroup.CreateGroupResp, error) {
3 years ago
log.NewInfo(req.OperationID, "CreateGroup, args ", req.String())
3 years ago
if !token_verify.CheckAccess(req.OpUserID, req.OwnerUserID) {
log.NewError(req.OperationID, "CheckAccess false ", req.OpUserID, req.OwnerUserID)
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
3 years ago
}
3 years ago
3 years ago
//Time stamp + MD5 to generate group chat id
3 years ago
groupId := utils.Md5(strconv.FormatInt(time.Now().UnixNano(), 10))
3 years ago
//to group
3 years ago
groupInfo := imdb.Group{GroupID: groupId}
3 years ago
utils.CopyStructFields(&groupInfo, req.GroupInfo)
3 years ago
groupInfo.CreatorUserID = req.OpUserID
3 years ago
err := im_mysql_model.InsertIntoGroup(groupInfo)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "InsertIntoGroup failed, ", err.Error(), groupInfo)
3 years ago
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
3 years ago
}
3 years ago
us, err := imdb.GetUserByUserID(req.OwnerUserID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), req.OwnerUserID)
3 years ago
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
3 years ago
}
3 years ago
//to group member
3 years ago
groupMember := imdb.GroupMember{GroupID: groupId, RoleLevel: constant.GroupOwner}
3 years ago
utils.CopyStructFields(&groupMember, us)
3 years ago
err = im_mysql_model.InsertIntoGroupMember(groupMember)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "InsertIntoGroupMember failed ", err.Error(), groupMember)
3 years ago
return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
3 years ago
}
3 years ago
err = db.DB.AddGroupMember(groupId, req.OwnerUserID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), groupId, req.OwnerUserID)
3 years ago
}
3 years ago
var okUserIDList []string
3 years ago
//to group member
3 years ago
for _, user := range req.InitMemberList {
3 years ago
us, err := im_mysql_model.GetUserByUserID(user.UserID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), user.UserID)
3 years ago
continue
}
3 years ago
if user.RoleLevel == constant.GroupOwner {
3 years ago
log.NewError(req.OperationID, "only one owner, failed ", user)
continue
}
3 years ago
groupMember.RoleLevel = user.RoleLevel
3 years ago
utils.CopyStructFields(&groupMember, us)
err = im_mysql_model.InsertIntoGroupMember(groupMember)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "InsertIntoGroupMember failed ", err.Error(), groupMember)
3 years ago
continue
3 years ago
}
3 years ago
3 years ago
okUserIDList = append(okUserIDList, user.UserID)
3 years ago
err = db.DB.AddGroupMember(groupId, user.UserID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "add mongo group member failed, db.DB.AddGroupMember failed ", err.Error())
3 years ago
}
}
3 years ago
resp := &pbGroup.CreateGroupResp{GroupInfo: &open_im_sdk.GroupInfo{}}
3 years ago
group, err := im_mysql_model.GetGroupInfoByGroupID(groupId)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), groupId)
3 years ago
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = constant.ErrDB.ErrMsg
3 years ago
return resp, nil
}
3 years ago
chat.GroupCreatedNotification(req.OperationID, req.OpUserID, req.OwnerUserID, groupId, okUserIDList)
3 years ago
utils.CopyStructFields(resp.GroupInfo, group)
3 years ago
resp.GroupInfo.MemberCount = imdb.GetGroupMemberNumByGroupID(groupId)
3 years ago
resp.GroupInfo.OwnerUserID = req.OwnerUserID
3 years ago
log.NewInfo(req.OperationID, "rpc CreateGroup return ", resp.String())
return resp, nil
3 years ago
}
func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (*pbGroup.GetJoinedGroupListResp, error) {
3 years ago
log.NewInfo(req.OperationID, "GetJoinedGroupList, args ", req.String())
if !token_verify.CheckAccess(req.OpUserID, req.FromUserID) {
log.NewError(req.OperationID, "CheckAccess false ", req.OpUserID, req.FromUserID)
3 years ago
return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
}
3 years ago
//group list
3 years ago
joinedGroupList, err := imdb.GetJoinedGroupIDListByUserID(req.FromUserID)
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetJoinedGroupIDListByUserID failed ", err.Error(), req.FromUserID)
3 years ago
return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
}
var resp pbGroup.GetJoinedGroupListResp
for _, v := range joinedGroupList {
3 years ago
var groupNode open_im_sdk.GroupInfo
3 years ago
num := imdb.GetGroupMemberNumByGroupID(v)
owner, err2 := imdb.GetGroupOwnerInfoByGroupID(v)
group, err := imdb.GetGroupInfoByGroupID(v)
3 years ago
if num > 0 && owner != nil && err2 == nil && group != nil && err == nil {
utils.CopyStructFields(&groupNode, group)
3 years ago
groupNode.CreateTime = group.CreateTime.Unix()
3 years ago
groupNode.MemberCount = uint32(num)
3 years ago
groupNode.OwnerUserID = owner.UserID
resp.GroupList = append(resp.GroupList, &groupNode)
3 years ago
} else {
log.NewError(req.OperationID, "check nil ", num, owner, err, group)
continue
}
3 years ago
log.NewDebug(req.OperationID, "joinedGroup ", groupNode)
}
3 years ago
log.NewInfo(req.OperationID, "GetJoinedGroupList rpc return ", resp.String())
return &resp, nil
}
func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.InviteUserToGroupReq) (*pbGroup.InviteUserToGroupResp, error) {
3 years ago
log.NewInfo(req.OperationID, "InviteUserToGroup args ", req.String())
3 years ago
if !imdb.IsExistGroupMember(req.GroupID, req.OpUserID) && !token_verify.IsMangerUserID(req.OpUserID) {
3 years ago
log.NewError(req.OperationID, "no permission InviteUserToGroup ", req.GroupID, req.OpUserID)
3 years ago
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
}
3 years ago
_, err := imdb.GetGroupInfoByGroupID(req.GroupID)
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", req.GroupID, err)
3 years ago
return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
}
//
//from User: invite: applicant
//to user: invite: invited
var resp pbGroup.InviteUserToGroupResp
3 years ago
var okUserIDList []string
3 years ago
for _, v := range req.InvitedUserIDList {
var resultNode pbGroup.Id2Result
3 years ago
resultNode.UserID = v
resultNode.Result = 0
3 years ago
toUserInfo, err := imdb.GetUserByUserID(v)
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), v)
resultNode.Result = -1
3 years ago
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
continue
}
if imdb.IsExistGroupMember(req.GroupID, v) {
3 years ago
log.NewError(req.OperationID, "IsExistGroupMember ", req.GroupID, v)
resultNode.Result = -1
3 years ago
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
continue
}
3 years ago
var toInsertInfo imdb.GroupMember
utils.CopyStructFields(&toInsertInfo, toUserInfo)
toInsertInfo.GroupID = req.GroupID
3 years ago
toInsertInfo.RoleLevel = constant.GroupOrdinaryUsers
3 years ago
err = imdb.InsertIntoGroupMember(toInsertInfo)
if err != nil {
3 years ago
log.NewError(req.OperationID, "InsertIntoGroupMember failed ", req.GroupID, toUserInfo.UserID, toUserInfo.Nickname, toUserInfo.FaceUrl)
resultNode.Result = -1
3 years ago
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
continue
}
3 years ago
okUserIDList = append(okUserIDList, v)
3 years ago
err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UserID)
if err != nil {
3 years ago
log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), req.GroupID, toUserInfo.UserID)
}
3 years ago
resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
}
3 years ago
chat.MemberInvitedNotification(req.OperationID, req.GroupID, req.OpUserID, req.Reason, okUserIDList)
3 years ago
resp.ErrCode = 0
3 years ago
log.NewInfo(req.OperationID, "InviteUserToGroup rpc return ", resp.String())
return &resp, nil
}
func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGroupAllMemberReq) (*pbGroup.GetGroupAllMemberResp, error) {
3 years ago
log.NewInfo(req.OperationID, "GetGroupAllMember, args ", req.String())
var resp pbGroup.GetGroupAllMemberResp
3 years ago
memberList, err := imdb.GetGroupMemberListByGroupID(req.GroupID)
if err != nil {
3 years ago
resp.ErrCode = constant.ErrDB.ErrCode
resp.ErrMsg = constant.ErrDB.ErrMsg
3 years ago
log.NewError(req.OperationID, "GetGroupMemberListByGroupID failed,", err.Error(), req.GroupID)
return &resp, nil
}
3 years ago
for _, v := range memberList {
3 years ago
var node open_im_sdk.GroupMemberFullInfo
utils.CopyStructFields(node, v)
resp.MemberList = append(resp.MemberList, &node)
3 years ago
}
3 years ago
log.NewInfo(req.OperationID, "GetGroupAllMember rpc return ", resp.String())
return &resp, nil
}
func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGroupMemberListReq) (*pbGroup.GetGroupMemberListResp, error) {
3 years ago
log.NewInfo(req.OperationID, "GetGroupMemberList, args ", req.String())
var resp pbGroup.GetGroupMemberListResp
3 years ago
memberList, err := imdb.GetGroupMemberByGroupID(req.GroupID, req.Filter, req.NextSeq, 30)
if err != nil {
3 years ago
resp.ErrCode = constant.ErrDB.ErrCode
3 years ago
resp.ErrMsg = constant.ErrDB.ErrMsg
3 years ago
log.NewError(req.OperationID, "GetGroupMemberByGroupId failed,", req.GroupID, req.Filter, req.NextSeq, 30)
return &resp, nil
}
for _, v := range memberList {
3 years ago
var node open_im_sdk.GroupMemberFullInfo
utils.CopyStructFields(&node, v)
resp.MemberList = append(resp.MemberList, &node)
}
//db operate get db sorted by join time
if int32(len(memberList)) < 30 {
resp.NextSeq = 0
} else {
resp.NextSeq = req.NextSeq + int32(len(memberList))
}
3 years ago
resp.ErrCode = 0
3 years ago
log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp.String())
return &resp, nil
}
func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGroupMemberReq) (*pbGroup.KickGroupMemberResp, error) {
3 years ago
log.NewInfo(req.OperationID, "KickGroupMember args ", req.String())
3 years ago
ownerList, err := imdb.GetOwnerManagerByGroupID(req.GroupID)
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetOwnerManagerByGroupId failed ", err.Error(), req.GroupID)
3 years ago
return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
}
//op is group owner?
var flag = 0
for _, v := range ownerList {
3 years ago
if v.UserID == req.OpUserID {
flag = 1
3 years ago
log.NewDebug(req.OperationID, "is group owner ", req.OpUserID, req.GroupID)
break
}
}
3 years ago
3 years ago
//op is app manager
if flag != 1 {
3 years ago
if token_verify.IsMangerUserID(req.OpUserID) {
flag = 1
3 years ago
log.NewDebug(req.OperationID, "is app manager ", req.OpUserID)
}
}
if flag != 1 {
3 years ago
log.NewError(req.OperationID, "failed, no access kick ", req.OpUserID)
3 years ago
return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
}
3 years ago
if len(req.KickedUserIDList) == 0 {
3 years ago
log.NewError(req.OperationID, "failed, kick list 0")
3 years ago
return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrArgs.ErrCode, ErrMsg: constant.ErrArgs.ErrMsg}, nil
}
3 years ago
3 years ago
groupOwnerUserID := ""
for _, v := range ownerList {
3 years ago
if v.RoleLevel == constant.GroupOwner {
3 years ago
groupOwnerUserID = v.UserID
}
}
3 years ago
var okUserIDList []string
//remove
var resp pbGroup.KickGroupMemberResp
3 years ago
for _, v := range req.KickedUserIDList {
//owner cant kicked
3 years ago
if v == groupOwnerUserID {
log.NewError(req.OperationID, "failed, can't kick owner ", v)
resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
continue
}
3 years ago
err := imdb.RemoveGroupMember(req.GroupID, v)
if err != nil {
3 years ago
log.NewError(req.OperationID, "RemoveGroupMember failed ", err.Error(), req.GroupID, v)
resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
} else {
3 years ago
resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: 0})
3 years ago
okUserIDList = append(okUserIDList, v)
}
3 years ago
3 years ago
err = db.DB.DelGroupMember(req.GroupID, v)
if err != nil {
3 years ago
log.NewError(req.OperationID, "DelGroupMember failed ", err.Error(), req.GroupID, v)
}
}
3 years ago
chat.MemberKickedNotification(req, okUserIDList)
log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp.String())
return &resp, nil
}
func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetGroupMembersInfoReq) (*pbGroup.GetGroupMembersInfoResp, error) {
3 years ago
log.NewInfo(req.OperationID, "GetGroupMembersInfo args ", req.String())
var resp pbGroup.GetGroupMembersInfoResp
for _, v := range req.MemberList {
3 years ago
var memberNode open_im_sdk.GroupMemberFullInfo
3 years ago
memberInfo, err := imdb.GetMemberInfoByID(req.GroupID, v)
3 years ago
memberNode.UserID = v
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetMemberInfoById failed ", err.Error(), req.GroupID, v)
continue
3 years ago
} else {
utils.CopyStructFields(&memberNode, memberInfo)
3 years ago
memberNode.JoinTime = memberInfo.JoinTime.Unix()
3 years ago
resp.MemberList = append(resp.MemberList, &memberNode)
}
}
3 years ago
resp.ErrCode = 0
3 years ago
log.NewInfo(req.OperationID, "GetGroupMembersInfo rpc return ", resp.String())
return &resp, nil
}
3 years ago
3 years ago
func (s *groupServer) GetGroupApplicationList(_ context.Context, req *pbGroup.GetGroupApplicationListReq) (*pbGroup.GetGroupApplicationListResp, error) {
log.NewInfo(req.OperationID, "GetGroupMembersInfo args ", req.String())
3 years ago
reply, err := im_mysql_model.GetGroupApplicationList(req.FromUserID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetGroupApplicationList failed ", err.Error(), req.FromUserID)
3 years ago
return &pbGroup.GetGroupApplicationListResp{ErrCode: 701, ErrMsg: "GetGroupApplicationList failed"}, nil
}
3 years ago
3 years ago
log.NewDebug(req.OperationID, "GetGroupApplicationList reply ", reply)
3 years ago
resp := pbGroup.GetGroupApplicationListResp{}
for _, v := range reply {
var node open_im_sdk.GroupRequest
3 years ago
cp.GroupRequestDBCopyOpenIM(&node, &v)
3 years ago
log.NewDebug(req.OperationID, "node ", node, "v ", v)
3 years ago
}
log.NewInfo(req.OperationID, "GetGroupMembersInfo rpc return ", resp)
return &resp, nil
3 years ago
}
func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsInfoReq) (*pbGroup.GetGroupsInfoResp, error) {
3 years ago
log.NewInfo(req.OperationID, "GetGroupsInfo args ", req.String())
groupsInfoList := make([]*open_im_sdk.GroupInfo, 0)
3 years ago
for _, groupID := range req.GroupIDList {
3 years ago
groupInfoFromMysql, err := im_mysql_model.GetGroupInfoByGroupID(groupID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), groupID)
3 years ago
continue
}
3 years ago
var groupInfo open_im_sdk.GroupInfo
utils.CopyStructFields(&groupInfo, groupInfoFromMysql)
3 years ago
groupInfo.CreateTime = groupInfoFromMysql.CreateTime.Unix()
3 years ago
groupsInfoList = append(groupsInfoList, &groupInfo)
}
3 years ago
resp := pbGroup.GetGroupsInfoResp{GroupInfoList: groupsInfoList}
log.NewInfo(req.OperationID, "GetGroupsInfo rpc return ", resp)
return &resp, nil
3 years ago
}
3 years ago
func (s *groupServer) GroupApplicationResponse(_ context.Context, req *pbGroup.GroupApplicationResponseReq) (*pbGroup.GroupApplicationResponseResp, error) {
3 years ago
log.NewInfo(req.OperationID, "GroupApplicationResponse args ", req.String())
3 years ago
groupRequest := imdb.GroupRequest{}
groupRequest.UserID = req.FromUserID
groupRequest.GroupID = req.GroupID
groupRequest.HandledTime = time.Now()
groupRequest.HandleResult = req.HandleResult
groupRequest.HandleUserID = req.OpUserID
groupRequest.HandledMsg = req.HandledMsg
err := imdb.UpdateGroupRequest(groupRequest)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GroupApplicationResponse failed ", err.Error(), req.String())
3 years ago
return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
3 years ago
}
3 years ago
chat.ApplicationProcessedNotification(req)
3 years ago
if req.HandleResult == 1 {
3 years ago
chat.MemberEnterNotification(req)
3 years ago
}
3 years ago
log.NewInfo(req.OperationID, "rpc GroupApplicationResponse return ")
return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{}}, nil
3 years ago
}
3 years ago
func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (*pbGroup.JoinGroupResp, error) {
3 years ago
log.NewInfo(req.OperationID, "JoinGroup args ", req.String())
3 years ago
_, err := imdb.GetUserByUserID(req.OpUserID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), req.OpUserID)
3 years ago
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
3 years ago
}
3 years ago
var groupRequest imdb.GroupRequest
3 years ago
groupRequest.UserID = req.OpUserID
groupRequest.ReqMsg = req.ReqMessage
groupRequest.GroupID = req.GroupID
3 years ago
err = imdb.UpdateGroupRequest(groupRequest)
if err != nil {
log.NewError(req.OperationID, "UpdateGroupRequest ", err.Error(), groupRequest)
3 years ago
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
3 years ago
}
3 years ago
_, err = imdb.GetGroupMemberListByGroupIDAndRoleLevel(req.GroupID, constant.GroupOwner)
if err != nil {
log.NewError(req.OperationID, "GetGroupMemberListByGroupIDAndRoleLevel failed ", err.Error(), req.GroupID, constant.GroupOwner)
3 years ago
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
3 years ago
}
3 years ago
3 years ago
chat.JoinApplicationNotification(req)
3 years ago
3 years ago
log.NewInfo(req.OperationID, "ReceiveJoinApplicationNotification rpc return ")
3 years ago
return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
3 years ago
}
3 years ago
func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq) (*pbGroup.QuitGroupResp, error) {
3 years ago
log.NewError(req.OperationID, "QuitGroup args ", req.String())
3 years ago
_, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupID, req.OpUserID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetGroupMemberInfoByGroupIDAndUserID failed ", err.Error(), req.GroupID, req.OpUserID)
3 years ago
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
3 years ago
}
3 years ago
err = imdb.DeleteGroupMemberByGroupIDAndUserID(req.GroupID, req.OpUserID)
3 years ago
if err != nil {
log.NewError(req.OperationID, "DeleteGroupMemberByGroupIdAndUserId failed ", err.Error(), req.GroupID, req.OpUserID)
3 years ago
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
3 years ago
}
err = db.DB.DelGroupMember(req.GroupID, req.OpUserID)
if err != nil {
log.NewError(req.OperationID, "DelGroupMember failed ", req.GroupID, req.OpUserID)
// return &pbGroup.CommonResp{ErrorCode: constant.ErrQuitGroup.ErrCode, ErrorMsg: constant.ErrQuitGroup.ErrMsg}, nil
}
3 years ago
chat.MemberLeaveNotification(req)
3 years ago
log.NewInfo(req.OperationID, "rpc QuitGroup return ", pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}})
3 years ago
return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
3 years ago
}
func hasAccess(req *pbGroup.SetGroupInfoReq) bool {
if utils.IsContain(req.OpUserID, config.Config.Manager.AppManagerUid) {
return true
}
3 years ago
groupUserInfo, err := im_mysql_model.GetGroupMemberInfoByGroupIDAndUserID(req.GroupInfo.GroupID, req.OpUserID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetGroupMemberInfoByGroupIDAndUserID failed, ", err.Error(), req.GroupInfo.GroupID, req.OpUserID)
3 years ago
return false
}
3 years ago
if groupUserInfo.RoleLevel == constant.GroupOwner || groupUserInfo.RoleLevel == constant.GroupAdmin {
3 years ago
return true
}
3 years ago
return false
3 years ago
}
3 years ago
func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInfoReq) (*pbGroup.SetGroupInfoResp, error) {
3 years ago
log.NewInfo(req.OperationID, "SetGroupInfo args ", req.String())
if !hasAccess(req) {
3 years ago
log.NewError(req.OperationID, "no access ", req)
3 years ago
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
3 years ago
}
3 years ago
group, err := im_mysql_model.GetGroupInfoByGroupID(req.GroupInfo.GroupID)
3 years ago
if err != nil {
3 years ago
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), req.GroupInfo.GroupID)
3 years ago
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
3 years ago
}
3 years ago
////bitwise operators: 0001:groupName; 0010:Notification 0100:Introduction; 1000:FaceUrl; 10000:owner
3 years ago
var changedType int32
3 years ago
if group.GroupName != req.GroupInfo.GroupName && req.GroupInfo.GroupName != "" {
3 years ago
changedType = 1
}
3 years ago
if group.Notification != req.GroupInfo.Notification && req.GroupInfo.Notification != "" {
3 years ago
changedType = changedType | (1 << 1)
}
3 years ago
if group.Introduction != req.GroupInfo.Introduction && req.GroupInfo.Introduction != "" {
3 years ago
changedType = changedType | (1 << 2)
}
3 years ago
if group.FaceUrl != req.GroupInfo.FaceUrl && req.GroupInfo.FaceUrl != "" {
3 years ago
changedType = changedType | (1 << 3)
}
//only administrators can set group information
3 years ago
var groupInfo imdb.Group
utils.CopyStructFields(&groupInfo, req.GroupInfo)
err = imdb.SetGroupInfo(groupInfo)
if err != nil {
3 years ago
log.NewError(req.OperationID, "SetGroupInfo failed ", err.Error(), groupInfo)
3 years ago
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
3 years ago
}
if changedType != 0 {
3 years ago
chat.GroupInfoChangedNotification(req.OperationID, req.OpUserID, req.GroupInfo.GroupID, changedType)
3 years ago
}
3 years ago
log.NewInfo(req.OperationID, "SetGroupInfo rpc return ", pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}})
3 years ago
return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}}, nil
3 years ago
}
3 years ago
func (s *groupServer) TransferGroupOwner(_ context.Context, req *pbGroup.TransferGroupOwnerReq) (*pbGroup.TransferGroupOwnerResp, error) {
3 years ago
log.NewInfo(req.OperationID, "TransferGroupOwner ", req.String())
3 years ago
3 years ago
if req.OldOwnerUserID == req.NewOwnerUserID {
log.NewError(req.OperationID, "same owner ", req.String())
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrArgs.ErrCode, ErrMsg: constant.ErrArgs.ErrMsg}}, nil
}
groupMemberInfo := imdb.GroupMember{GroupID: req.GroupID, UserID: req.OldOwnerUserID, RoleLevel: 0}
err := imdb.UpdateGroupMemberInfo(groupMemberInfo)
if err != nil {
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
}
groupMemberInfo = imdb.GroupMember{GroupID: req.GroupID, UserID: req.NewOwnerUserID, RoleLevel: 1}
err = imdb.UpdateGroupMemberInfo(groupMemberInfo)
3 years ago
if err != nil {
3 years ago
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
3 years ago
}
3 years ago
changedType := int32(1) << 4
chat.GroupInfoChangedNotification(req.OperationID, req.OpUserID, req.GroupID, changedType)
3 years ago
return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
3 years ago
}