group.go 25.3 KB
Newer Older
落凡尘.'s avatar
落凡尘. 已提交
1 2 3
package group

import (
W
wenxu12345 已提交
4
	chat "Open_IM/internal/rpc/msg"
5 6 7 8 9
	"Open_IM/pkg/common/config"
	"Open_IM/pkg/common/constant"
	"Open_IM/pkg/common/db"
	imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
	"Open_IM/pkg/common/log"
W
wenxu12345 已提交
10
	"Open_IM/pkg/common/token_verify"
W
wenxu12345 已提交
11
	cp "Open_IM/pkg/common/utils"
W
wenxu12345 已提交
12
	"Open_IM/pkg/grpc-etcdv3/getcdv3"
13
	pbGroup "Open_IM/pkg/proto/group"
W
wenxu12345 已提交
14
	open_im_sdk "Open_IM/pkg/proto/sdk_ws"
15
	"Open_IM/pkg/utils"
落凡尘.'s avatar
落凡尘. 已提交
16
	"context"
W
wenxu12345 已提交
17 18 19 20 21
	"google.golang.org/grpc"
	"net"
	"strconv"
	"strings"
	"time"
落凡尘.'s avatar
落凡尘. 已提交
22 23
)

W
wenxu12345 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
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,
	}
}
W
wenxu12345 已提交
40

W
wenxu12345 已提交
41
func (s *groupServer) Run() {
W
wenxu12345 已提交
42
	log.NewInfo("0", "group rpc start ")
W
wenxu12345 已提交
43 44 45 46 47
	ip := utils.ServerIP
	registerAddress := ip + ":" + strconv.Itoa(s.rpcPort)
	//listener network
	listener, err := net.Listen("tcp", registerAddress)
	if err != nil {
W
wenxu12345 已提交
48
		log.NewError("0", "Listen failed ", err.Error(), registerAddress)
W
wenxu12345 已提交
49 50
		return
	}
W
wenxu12345 已提交
51
	log.NewInfo("0", "listen network success, ", registerAddress, listener)
W
wenxu12345 已提交
52 53 54 55 56 57 58 59
	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 {
W
wenxu12345 已提交
60
		log.NewError("0", "RegisterEtcd failed ", err.Error())
W
wenxu12345 已提交
61 62 63 64
		return
	}
	err = srv.Serve(listener)
	if err != nil {
W
wenxu12345 已提交
65
		log.NewError("0", "Serve failed ", err.Error())
W
wenxu12345 已提交
66 67
		return
	}
W
wenxu12345 已提交
68
	log.NewInfo("0", "group rpc success")
W
wenxu12345 已提交
69 70 71
}

func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupReq) (*pbGroup.CreateGroupResp, error) {
W
wenxu12345 已提交
72
	log.NewInfo(req.OperationID, "CreateGroup, args ", req.String())
W
wenxu12345 已提交
73 74 75
	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
W
wenxu12345 已提交
76
	}
W
wenxu12345 已提交
77

W
wenxu12345 已提交
78
	//Time stamp + MD5 to generate group chat id
W
wenxu12345 已提交
79
	groupId := utils.Md5(strconv.FormatInt(time.Now().UnixNano(), 10))
W
wenxu12345 已提交
80
	//to group
W
wenxu12345 已提交
81
	groupInfo := db.Group{GroupID: groupId}
W
wenxu12345 已提交
82
	utils.CopyStructFields(&groupInfo, req.GroupInfo)
W
wenxu12345 已提交
83
	groupInfo.CreatorUserID = req.OpUserID
W
wenxu12345 已提交
84
	err := imdb.InsertIntoGroup(groupInfo)
W
wenxu12345 已提交
85
	if err != nil {
W
wenxu12345 已提交
86
		log.NewError(req.OperationID, "InsertIntoGroup failed, ", err.Error(), groupInfo)
W
wenxu12345 已提交
87
		return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
W
wenxu12345 已提交
88 89
	}

W
wenxu12345 已提交
90
	us, err := imdb.GetUserByUserID(req.OwnerUserID)
W
wenxu12345 已提交
91
	if err != nil {
W
wenxu12345 已提交
92
		log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), req.OwnerUserID)
W
wenxu12345 已提交
93
		return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
W
wenxu12345 已提交
94 95
	}

W
wenxu12345 已提交
96
	//to group member
W
wenxu12345 已提交
97
	groupMember := db.GroupMember{GroupID: groupId, RoleLevel: constant.GroupOwner, OperatorUserID: req.OpUserID}
W
wenxu12345 已提交
98
	utils.CopyStructFields(&groupMember, us)
W
wenxu12345 已提交
99
	err = imdb.InsertIntoGroupMember(groupMember)
W
wenxu12345 已提交
100
	if err != nil {
W
wenxu12345 已提交
101
		log.NewError(req.OperationID, "InsertIntoGroupMember failed ", err.Error(), groupMember)
W
wenxu12345 已提交
102
		return &pbGroup.CreateGroupResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
W
wenxu12345 已提交
103 104
	}

W
wenxu12345 已提交
105
	err = db.DB.AddGroupMember(groupId, req.OwnerUserID)
W
wenxu12345 已提交
106
	if err != nil {
W
wenxu12345 已提交
107
		log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), groupId, req.OwnerUserID)
W
wenxu12345 已提交
108
	}
W
wenxu12345 已提交
109
	var okUserIDList []string
W
wenxu12345 已提交
110
	//to group member
W
wenxu12345 已提交
111
	for _, user := range req.InitMemberList {
W
wenxu12345 已提交
112
		us, err := imdb.GetUserByUserID(user.UserID)
W
wenxu12345 已提交
113
		if err != nil {
W
wenxu12345 已提交
114
			log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), user.UserID)
W
wenxu12345 已提交
115 116
			continue
		}
W
wenxu12345 已提交
117
		if user.RoleLevel == constant.GroupOwner {
W
wenxu12345 已提交
118 119 120
			log.NewError(req.OperationID, "only one owner, failed ", user)
			continue
		}
W
wenxu12345 已提交
121
		groupMember.RoleLevel = user.RoleLevel
W
wenxu12345 已提交
122
		utils.CopyStructFields(&groupMember, us)
W
wenxu12345 已提交
123
		err = imdb.InsertIntoGroupMember(groupMember)
W
wenxu12345 已提交
124
		if err != nil {
W
wenxu12345 已提交
125
			log.NewError(req.OperationID, "InsertIntoGroupMember failed ", err.Error(), groupMember)
W
wenxu12345 已提交
126
			continue
W
wenxu12345 已提交
127
		}
W
wenxu12345 已提交
128

W
wenxu12345 已提交
129
		okUserIDList = append(okUserIDList, user.UserID)
W
wenxu12345 已提交
130
		err = db.DB.AddGroupMember(groupId, user.UserID)
W
wenxu12345 已提交
131
		if err != nil {
W
wenxu12345 已提交
132
			log.NewError(req.OperationID, "add mongo group member failed, db.DB.AddGroupMember failed ", err.Error())
W
wenxu12345 已提交
133 134 135
		}
	}

W
wenxu12345 已提交
136
	resp := &pbGroup.CreateGroupResp{GroupInfo: &open_im_sdk.GroupInfo{}}
W
wenxu12345 已提交
137
	group, err := imdb.GetGroupInfoByGroupID(groupId)
W
wenxu12345 已提交
138
	if err != nil {
W
wenxu12345 已提交
139
		log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), groupId)
W
wenxu12345 已提交
140 141
		resp.ErrCode = constant.ErrDB.ErrCode
		resp.ErrMsg = constant.ErrDB.ErrMsg
W
wenxu12345 已提交
142 143
		return resp, nil
	}
W
wenxu12345 已提交
144
	chat.GroupCreatedNotification(req.OperationID, req.OpUserID, req.OwnerUserID, groupId, okUserIDList)
W
wenxu12345 已提交
145
	utils.CopyStructFields(resp.GroupInfo, group)
W
wenxu12345 已提交
146
	resp.GroupInfo.MemberCount = imdb.GetGroupMemberNumByGroupID(groupId)
W
wenxu12345 已提交
147 148
	resp.GroupInfo.OwnerUserID = req.OwnerUserID

W
wenxu12345 已提交
149 150
	log.NewInfo(req.OperationID, "rpc CreateGroup return ", resp.String())
	return resp, nil
W
wenxu12345 已提交
151 152
}

落凡尘.'s avatar
落凡尘. 已提交
153
func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (*pbGroup.GetJoinedGroupListResp, error) {
W
wenxu12345 已提交
154 155 156
	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)
W
wenxu12345 已提交
157
		return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
落凡尘.'s avatar
落凡尘. 已提交
158
	}
W
wenxu12345 已提交
159
	//group list
W
wenxu12345 已提交
160
	joinedGroupList, err := imdb.GetJoinedGroupIDListByUserID(req.FromUserID)
落凡尘.'s avatar
落凡尘. 已提交
161
	if err != nil {
W
wenxu12345 已提交
162
		log.NewError(req.OperationID, "GetJoinedGroupIDListByUserID failed ", err.Error(), req.FromUserID)
W
wenxu12345 已提交
163
		return &pbGroup.GetJoinedGroupListResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
落凡尘.'s avatar
落凡尘. 已提交
164 165 166 167
	}

	var resp pbGroup.GetJoinedGroupListResp
	for _, v := range joinedGroupList {
W
wenxu12345 已提交
168
		var groupNode open_im_sdk.GroupInfo
W
wenxu12345 已提交
169 170 171
		num := imdb.GetGroupMemberNumByGroupID(v)
		owner, err2 := imdb.GetGroupOwnerInfoByGroupID(v)
		group, err := imdb.GetGroupInfoByGroupID(v)
W
wenxu12345 已提交
172 173
		if num > 0 && owner != nil && err2 == nil && group != nil && err == nil {
			utils.CopyStructFields(&groupNode, group)
W
wenxu12345 已提交
174
			groupNode.CreateTime = uint32(group.CreateTime.Unix())
W
wenxu12345 已提交
175
			groupNode.MemberCount = uint32(num)
W
wenxu12345 已提交
176
			groupNode.OwnerUserID = owner.UserID
落凡尘.'s avatar
落凡尘. 已提交
177
			resp.GroupList = append(resp.GroupList, &groupNode)
W
wenxu12345 已提交
178 179 180
		} else {
			log.NewError(req.OperationID, "check nil ", num, owner, err, group)
			continue
落凡尘.'s avatar
落凡尘. 已提交
181
		}
W
wenxu12345 已提交
182
		log.NewDebug(req.OperationID, "joinedGroup ", groupNode)
落凡尘.'s avatar
落凡尘. 已提交
183
	}
W
wenxu12345 已提交
184
	log.NewInfo(req.OperationID, "GetJoinedGroupList rpc return ", resp.String())
落凡尘.'s avatar
落凡尘. 已提交
185 186 187 188
	return &resp, nil
}

func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.InviteUserToGroupReq) (*pbGroup.InviteUserToGroupResp, error) {
W
wenxu12345 已提交
189 190
	log.NewInfo(req.OperationID, "InviteUserToGroup args ", req.String())

W
wenxu12345 已提交
191
	if !imdb.IsExistGroupMember(req.GroupID, req.OpUserID) && !token_verify.IsMangerUserID(req.OpUserID) {
W
wenxu12345 已提交
192
		log.NewError(req.OperationID, "no permission InviteUserToGroup ", req.GroupID, req.OpUserID)
W
wenxu12345 已提交
193
		return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
落凡尘.'s avatar
落凡尘. 已提交
194 195
	}

W
wenxu12345 已提交
196 197
	_, err := imdb.GetGroupInfoByGroupID(req.GroupID)
	if err != nil {
W
wenxu12345 已提交
198
		log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", req.GroupID, err)
W
wenxu12345 已提交
199
		return &pbGroup.InviteUserToGroupResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
200
	}
落凡尘.'s avatar
落凡尘. 已提交
201 202 203 204
	//
	//from User:  invite: applicant
	//to user:  invite: invited
	var resp pbGroup.InviteUserToGroupResp
W
wenxu12345 已提交
205
	var okUserIDList []string
W
wenxu12345 已提交
206
	for _, v := range req.InvitedUserIDList {
落凡尘.'s avatar
落凡尘. 已提交
207
		var resultNode pbGroup.Id2Result
W
wenxu12345 已提交
208
		resultNode.UserID = v
落凡尘.'s avatar
落凡尘. 已提交
209
		resultNode.Result = 0
W
wenxu12345 已提交
210
		toUserInfo, err := imdb.GetUserByUserID(v)
落凡尘.'s avatar
落凡尘. 已提交
211
		if err != nil {
W
wenxu12345 已提交
212
			log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), v)
落凡尘.'s avatar
落凡尘. 已提交
213
			resultNode.Result = -1
W
wenxu12345 已提交
214
			resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
落凡尘.'s avatar
落凡尘. 已提交
215 216
			continue
		}
落凡尘.'s avatar
落凡尘. 已提交
217 218

		if imdb.IsExistGroupMember(req.GroupID, v) {
W
wenxu12345 已提交
219
			log.NewError(req.OperationID, "IsExistGroupMember ", req.GroupID, v)
落凡尘.'s avatar
落凡尘. 已提交
220
			resultNode.Result = -1
W
wenxu12345 已提交
221
			resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
落凡尘.'s avatar
落凡尘. 已提交
222 223
			continue
		}
W
wenxu12345 已提交
224
		var toInsertInfo db.GroupMember
W
wenxu12345 已提交
225 226
		utils.CopyStructFields(&toInsertInfo, toUserInfo)
		toInsertInfo.GroupID = req.GroupID
W
wenxu12345 已提交
227
		toInsertInfo.RoleLevel = constant.GroupOrdinaryUsers
W
wenxu12345 已提交
228
		toInsertInfo.OperatorUserID = req.OpUserID
W
wenxu12345 已提交
229
		err = imdb.InsertIntoGroupMember(toInsertInfo)
落凡尘.'s avatar
落凡尘. 已提交
230
		if err != nil {
W
wenxu12345 已提交
231
			log.NewError(req.OperationID, "InsertIntoGroupMember failed ", req.GroupID, toUserInfo.UserID, toUserInfo.Nickname, toUserInfo.FaceUrl)
落凡尘.'s avatar
落凡尘. 已提交
232
			resultNode.Result = -1
W
wenxu12345 已提交
233
			resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
落凡尘.'s avatar
落凡尘. 已提交
234 235
			continue
		}
W
wenxu12345 已提交
236
		okUserIDList = append(okUserIDList, v)
W
wenxu12345 已提交
237
		err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UserID)
落凡尘.'s avatar
落凡尘. 已提交
238
		if err != nil {
W
wenxu12345 已提交
239
			log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), req.GroupID, toUserInfo.UserID)
落凡尘.'s avatar
落凡尘. 已提交
240
		}
W
wenxu12345 已提交
241
		resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
落凡尘.'s avatar
落凡尘. 已提交
242 243
	}

W
wenxu12345 已提交
244
	chat.MemberInvitedNotification(req.OperationID, req.GroupID, req.OpUserID, req.Reason, okUserIDList)
W
wenxu12345 已提交
245
	resp.ErrCode = 0
W
wenxu12345 已提交
246
	log.NewInfo(req.OperationID, "InviteUserToGroup rpc return ", resp.String())
落凡尘.'s avatar
落凡尘. 已提交
247 248 249 250
	return &resp, nil
}

func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGroupAllMemberReq) (*pbGroup.GetGroupAllMemberResp, error) {
W
wenxu12345 已提交
251
	log.NewInfo(req.OperationID, "GetGroupAllMember, args ", req.String())
落凡尘.'s avatar
落凡尘. 已提交
252
	var resp pbGroup.GetGroupAllMemberResp
W
wenxu12345 已提交
253
	memberList, err := imdb.GetGroupMemberListByGroupID(req.GroupID)
落凡尘.'s avatar
落凡尘. 已提交
254
	if err != nil {
W
wenxu12345 已提交
255 256
		resp.ErrCode = constant.ErrDB.ErrCode
		resp.ErrMsg = constant.ErrDB.ErrMsg
W
wenxu12345 已提交
257
		log.NewError(req.OperationID, "GetGroupMemberListByGroupID failed,", err.Error(), req.GroupID)
落凡尘.'s avatar
落凡尘. 已提交
258 259
		return &resp, nil
	}
W
wenxu12345 已提交
260

落凡尘.'s avatar
落凡尘. 已提交
261
	for _, v := range memberList {
W
wenxu12345 已提交
262
		var node open_im_sdk.GroupMemberFullInfo
W
wenxu12345 已提交
263
		utils.CopyStructFields(&node, &v)
落凡尘.'s avatar
落凡尘. 已提交
264
		resp.MemberList = append(resp.MemberList, &node)
W
wenxu12345 已提交
265
	}
W
wenxu12345 已提交
266
	log.NewInfo(req.OperationID, "GetGroupAllMember rpc return ", resp.String())
落凡尘.'s avatar
落凡尘. 已提交
267 268 269 270
	return &resp, nil
}

func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGroupMemberListReq) (*pbGroup.GetGroupMemberListResp, error) {
W
wenxu12345 已提交
271
	log.NewInfo(req.OperationID, "GetGroupMemberList args ", req.String())
落凡尘.'s avatar
落凡尘. 已提交
272
	var resp pbGroup.GetGroupMemberListResp
W
wenxu12345 已提交
273
	memberList, err := imdb.GetGroupMemberByGroupID(req.GroupID, req.Filter, req.NextSeq, 30)
落凡尘.'s avatar
落凡尘. 已提交
274
	if err != nil {
W
wenxu12345 已提交
275
		resp.ErrCode = constant.ErrDB.ErrCode
W
wenxu12345 已提交
276
		resp.ErrMsg = constant.ErrDB.ErrMsg
W
wenxu12345 已提交
277
		log.NewError(req.OperationID, "GetGroupMemberByGroupId failed,", req.GroupID, req.Filter, req.NextSeq, 30)
落凡尘.'s avatar
落凡尘. 已提交
278 279 280 281
		return &resp, nil
	}

	for _, v := range memberList {
W
wenxu12345 已提交
282
		var node open_im_sdk.GroupMemberFullInfo
W
wenxu12345 已提交
283
		utils.CopyStructFields(&node, &v)
落凡尘.'s avatar
落凡尘. 已提交
284 285 286 287 288 289 290 291 292
		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))
	}

W
wenxu12345 已提交
293
	resp.ErrCode = 0
W
wenxu12345 已提交
294
	log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp.String())
落凡尘.'s avatar
落凡尘. 已提交
295 296 297 298
	return &resp, nil
}

func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGroupMemberReq) (*pbGroup.KickGroupMemberResp, error) {
W
wenxu12345 已提交
299
	log.NewInfo(req.OperationID, "KickGroupMember args ", req.String())
W
wenxu12345 已提交
300
	ownerList, err := imdb.GetOwnerManagerByGroupID(req.GroupID)
落凡尘.'s avatar
落凡尘. 已提交
301
	if err != nil {
W
wenxu12345 已提交
302
		log.NewError(req.OperationID, "GetOwnerManagerByGroupId failed ", err.Error(), req.GroupID)
W
wenxu12345 已提交
303
		return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}, nil
落凡尘.'s avatar
落凡尘. 已提交
304 305 306 307
	}
	//op is group owner?
	var flag = 0
	for _, v := range ownerList {
W
wenxu12345 已提交
308
		if v.UserID == req.OpUserID {
落凡尘.'s avatar
落凡尘. 已提交
309
			flag = 1
W
wenxu12345 已提交
310
			log.NewDebug(req.OperationID, "is group owner ", req.OpUserID, req.GroupID)
落凡尘.'s avatar
落凡尘. 已提交
311 312 313
			break
		}
	}
W
wenxu12345 已提交
314

W
wenxu12345 已提交
315
	//op is app manager
programor_guo's avatar
programor_guo 已提交
316
	if flag != 1 {
W
wenxu12345 已提交
317
		if token_verify.IsMangerUserID(req.OpUserID) {
programor_guo's avatar
programor_guo 已提交
318
			flag = 1
W
wenxu12345 已提交
319
			log.NewDebug(req.OperationID, "is app manager ", req.OpUserID)
programor_guo's avatar
programor_guo 已提交
320 321 322
		}
	}

落凡尘.'s avatar
落凡尘. 已提交
323
	if flag != 1 {
W
wenxu12345 已提交
324
		log.NewError(req.OperationID, "failed, no access kick ", req.OpUserID)
W
wenxu12345 已提交
325
		return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
落凡尘.'s avatar
落凡尘. 已提交
326 327
	}

W
wenxu12345 已提交
328
	if len(req.KickedUserIDList) == 0 {
W
wenxu12345 已提交
329
		log.NewError(req.OperationID, "failed, kick list 0")
W
wenxu12345 已提交
330
		return &pbGroup.KickGroupMemberResp{ErrCode: constant.ErrArgs.ErrCode, ErrMsg: constant.ErrArgs.ErrMsg}, nil
落凡尘.'s avatar
落凡尘. 已提交
331
	}
W
wenxu12345 已提交
332

W
wenxu12345 已提交
333 334
	groupOwnerUserID := ""
	for _, v := range ownerList {
W
wenxu12345 已提交
335
		if v.RoleLevel == constant.GroupOwner {
W
wenxu12345 已提交
336 337 338 339
			groupOwnerUserID = v.UserID
		}
	}

W
wenxu12345 已提交
340
	var okUserIDList []string
落凡尘.'s avatar
落凡尘. 已提交
341 342
	//remove
	var resp pbGroup.KickGroupMemberResp
W
wenxu12345 已提交
343
	for _, v := range req.KickedUserIDList {
落凡尘.'s avatar
落凡尘. 已提交
344
		//owner cant kicked
W
wenxu12345 已提交
345 346 347
		if v == groupOwnerUserID {
			log.NewError(req.OperationID, "failed, can't kick owner ", v)
			resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
落凡尘.'s avatar
落凡尘. 已提交
348 349
			continue
		}
W
wenxu12345 已提交
350
		err := imdb.RemoveGroupMember(req.GroupID, v)
落凡尘.'s avatar
落凡尘. 已提交
351
		if err != nil {
W
wenxu12345 已提交
352 353
			log.NewError(req.OperationID, "RemoveGroupMember failed ", err.Error(), req.GroupID, v)
			resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: -1})
落凡尘.'s avatar
落凡尘. 已提交
354
		} else {
W
wenxu12345 已提交
355
			log.NewDebug(req.OperationID, "kicked ", v)
W
wenxu12345 已提交
356
			resp.Id2ResultList = append(resp.Id2ResultList, &pbGroup.Id2Result{UserID: v, Result: 0})
W
wenxu12345 已提交
357
			okUserIDList = append(okUserIDList, v)
落凡尘.'s avatar
落凡尘. 已提交
358
		}
W
wenxu12345 已提交
359

W
wenxu12345 已提交
360
		err = db.DB.DelGroupMember(req.GroupID, v)
落凡尘.'s avatar
落凡尘. 已提交
361
		if err != nil {
W
wenxu12345 已提交
362
			log.NewError(req.OperationID, "DelGroupMember failed ", err.Error(), req.GroupID, v)
落凡尘.'s avatar
落凡尘. 已提交
363
		}
落凡尘.'s avatar
落凡尘. 已提交
364
	}
W
wenxu12345 已提交
365 366
	chat.MemberKickedNotification(req, okUserIDList)
	log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp.String())
落凡尘.'s avatar
落凡尘. 已提交
367 368 369 370
	return &resp, nil
}

func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetGroupMembersInfoReq) (*pbGroup.GetGroupMembersInfoResp, error) {
W
wenxu12345 已提交
371 372
	log.NewInfo(req.OperationID, "GetGroupMembersInfo args ", req.String())

落凡尘.'s avatar
落凡尘. 已提交
373 374 375
	var resp pbGroup.GetGroupMembersInfoResp

	for _, v := range req.MemberList {
W
wenxu12345 已提交
376
		var memberNode open_im_sdk.GroupMemberFullInfo
W
wenxu12345 已提交
377
		memberInfo, err := imdb.GetMemberInfoByID(req.GroupID, v)
W
wenxu12345 已提交
378
		memberNode.UserID = v
落凡尘.'s avatar
落凡尘. 已提交
379
		if err != nil {
W
wenxu12345 已提交
380
			log.NewError(req.OperationID, "GetMemberInfoById failed ", err.Error(), req.GroupID, v)
落凡尘.'s avatar
落凡尘. 已提交
381
			continue
W
wenxu12345 已提交
382 383
		} else {
			utils.CopyStructFields(&memberNode, memberInfo)
W
wenxu12345 已提交
384
			memberNode.JoinTime = memberInfo.JoinTime.Unix()
W
wenxu12345 已提交
385
			resp.MemberList = append(resp.MemberList, &memberNode)
落凡尘.'s avatar
落凡尘. 已提交
386 387
		}
	}
W
wenxu12345 已提交
388
	resp.ErrCode = 0
W
wenxu12345 已提交
389
	log.NewInfo(req.OperationID, "GetGroupMembersInfo rpc return ", resp.String())
落凡尘.'s avatar
落凡尘. 已提交
390 391
	return &resp, nil
}
W
wenxu12345 已提交
392

W
wenxu12345 已提交
393 394
func (s *groupServer) GetGroupApplicationList(_ context.Context, req *pbGroup.GetGroupApplicationListReq) (*pbGroup.GetGroupApplicationListResp, error) {
	log.NewInfo(req.OperationID, "GetGroupMembersInfo args ", req.String())
W
wenxu12345 已提交
395
	reply, err := imdb.GetGroupApplicationList(req.FromUserID)
W
wenxu12345 已提交
396
	if err != nil {
W
wenxu12345 已提交
397
		log.NewError(req.OperationID, "GetGroupApplicationList failed ", err.Error(), req.FromUserID)
W
wenxu12345 已提交
398 399
		return &pbGroup.GetGroupApplicationListResp{ErrCode: 701, ErrMsg: "GetGroupApplicationList failed"}, nil
	}
W
wenxu12345 已提交
400

W
wenxu12345 已提交
401
	log.NewDebug(req.OperationID, "GetGroupApplicationList reply ", reply)
W
wenxu12345 已提交
402 403 404
	resp := pbGroup.GetGroupApplicationListResp{}
	for _, v := range reply {
		var node open_im_sdk.GroupRequest
W
wenxu12345 已提交
405
		cp.GroupRequestDBCopyOpenIM(&node, &v)
W
wenxu12345 已提交
406
		log.NewDebug(req.OperationID, "node ", node, "v ", v)
W
wenxu12345 已提交
407
		resp.GroupRequestList = append(resp.GroupRequestList, &node)
W
wenxu12345 已提交
408 409 410
	}
	log.NewInfo(req.OperationID, "GetGroupMembersInfo rpc return ", resp)
	return &resp, nil
W
wenxu12345 已提交
411 412 413
}

func (s *groupServer) GetGroupsInfo(ctx context.Context, req *pbGroup.GetGroupsInfoReq) (*pbGroup.GetGroupsInfoResp, error) {
W
wenxu12345 已提交
414 415
	log.NewInfo(req.OperationID, "GetGroupsInfo args ", req.String())
	groupsInfoList := make([]*open_im_sdk.GroupInfo, 0)
W
wenxu12345 已提交
416
	for _, groupID := range req.GroupIDList {
W
wenxu12345 已提交
417
		groupInfoFromMysql, err := imdb.GetGroupInfoByGroupID(groupID)
W
wenxu12345 已提交
418
		if err != nil {
W
wenxu12345 已提交
419
			log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), groupID)
W
wenxu12345 已提交
420 421
			continue
		}
W
wenxu12345 已提交
422
		var groupInfo open_im_sdk.GroupInfo
W
wenxu12345 已提交
423
		cp.GroupDBCopyOpenIM(&groupInfo, groupInfoFromMysql)
W
wenxu12345 已提交
424 425
		groupsInfoList = append(groupsInfoList, &groupInfo)
	}
W
wenxu12345 已提交
426 427 428 429

	resp := pbGroup.GetGroupsInfoResp{GroupInfoList: groupsInfoList}
	log.NewInfo(req.OperationID, "GetGroupsInfo rpc return ", resp)
	return &resp, nil
W
wenxu12345 已提交
430 431
}

W
wenxu12345 已提交
432
func (s *groupServer) GroupApplicationResponse(_ context.Context, req *pbGroup.GroupApplicationResponseReq) (*pbGroup.GroupApplicationResponseResp, error) {
W
wenxu12345 已提交
433
	log.NewInfo(req.OperationID, "GroupApplicationResponse args ", req.String())
W
wenxu12345 已提交
434

W
wenxu12345 已提交
435
	groupRequest := db.GroupRequest{}
W
wenxu12345 已提交
436
	utils.CopyStructFields(&groupRequest, req)
W
wenxu12345 已提交
437 438
	groupRequest.UserID = req.FromUserID
	groupRequest.HandleUserID = req.OpUserID
W
wenxu12345 已提交
439
	groupRequest.HandledTime = time.Now()
W
wenxu12345 已提交
440 441 442 443
	if !token_verify.IsMangerUserID(req.OpUserID) && !imdb.IsGroupOwnerAdmin(req.GroupID, req.OpUserID) {
		log.NewError(req.OperationID, "IsMangerUserID IsGroupOwnerAdmin false ", req.GroupID, req.OpUserID)
		return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
	}
W
wenxu12345 已提交
444
	err := imdb.UpdateGroupRequest(groupRequest)
W
wenxu12345 已提交
445
	if err != nil {
W
wenxu12345 已提交
446
		//{openIM002 7836e478bc43ce1d3b8889cac983f59b 1  ok 0001-01-01 00:00:00 +0000 UTC openIM001 0001-01-01 00:00:00 +0000 UTC }
W
wenxu12345 已提交
447
		log.NewError(req.OperationID, "GroupApplicationResponse failed ", err.Error(), groupRequest)
W
wenxu12345 已提交
448
		return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
449
	}
W
wenxu12345 已提交
450
	chat.ApplicationProcessedNotification(req)
W
wenxu12345 已提交
451
	if req.HandleResult == constant.GroupResponseAgree {
W
wenxu12345 已提交
452 453 454 455 456 457 458

		if req.HandleResult == constant.GroupResponseAgree {
			user, err := imdb.GetUserByUserID(req.FromUserID)
			if err != nil {
				log.NewError(req.OperationID, "GroupApplicationResponse failed ", err.Error(), req.FromUserID)
				return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
			}
W
wenxu12345 已提交
459
			member := db.GroupMember{}
W
wenxu12345 已提交
460 461 462 463 464 465 466 467 468
			member.GroupID = req.GroupID
			member.UserID = req.FromUserID
			member.RoleLevel = constant.GroupOrdinaryUsers
			member.OperatorUserID = req.OpUserID
			member.FaceUrl = user.FaceUrl
			member.Nickname = user.Nickname

			err = imdb.InsertIntoGroupMember(member)
			if err != nil {
W
wenxu12345 已提交
469
				log.NewError(req.OperationID, "GroupApplicationResponse failed ", err.Error(), member)
W
wenxu12345 已提交
470 471 472
				return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
			}
		}
W
wenxu12345 已提交
473
		chat.MemberEnterNotification(req)
W
wenxu12345 已提交
474 475
	}

W
wenxu12345 已提交
476
	log.NewInfo(req.OperationID, "rpc GroupApplicationResponse return ", pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{}})
W
wenxu12345 已提交
477
	return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{}}, nil
W
wenxu12345 已提交
478 479
}

W
wenxu12345 已提交
480
func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (*pbGroup.JoinGroupResp, error) {
W
wenxu12345 已提交
481
	log.NewInfo(req.OperationID, "JoinGroup args ", req.String())
W
wenxu12345 已提交
482
	_, err := imdb.GetUserByUserID(req.OpUserID)
W
wenxu12345 已提交
483
	if err != nil {
W
wenxu12345 已提交
484
		log.NewError(req.OperationID, "GetUserByUserID failed ", err.Error(), req.OpUserID)
W
wenxu12345 已提交
485
		return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
486 487
	}

W
wenxu12345 已提交
488
	var groupRequest db.GroupRequest
W
wenxu12345 已提交
489 490 491 492
	groupRequest.UserID = req.OpUserID
	groupRequest.ReqMsg = req.ReqMessage
	groupRequest.GroupID = req.GroupID

W
wenxu12345 已提交
493
	err = imdb.InsertIntoGroupRequest(groupRequest)
W
wenxu12345 已提交
494 495
	if err != nil {
		log.NewError(req.OperationID, "UpdateGroupRequest ", err.Error(), groupRequest)
W
wenxu12345 已提交
496
		return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
497 498
	}

W
wenxu12345 已提交
499 500 501
	_, err = imdb.GetGroupMemberListByGroupIDAndRoleLevel(req.GroupID, constant.GroupOwner)
	if err != nil {
		log.NewError(req.OperationID, "GetGroupMemberListByGroupIDAndRoleLevel failed ", err.Error(), req.GroupID, constant.GroupOwner)
W
wenxu12345 已提交
502
		return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
W
wenxu12345 已提交
503
	}
W
wenxu12345 已提交
504

W
wenxu12345 已提交
505
	chat.JoinApplicationNotification(req)
W
wenxu12345 已提交
506

W
wenxu12345 已提交
507
	log.NewInfo(req.OperationID, "ReceiveJoinApplicationNotification rpc return ")
W
wenxu12345 已提交
508
	return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
W
wenxu12345 已提交
509 510
}

W
wenxu12345 已提交
511
func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq) (*pbGroup.QuitGroupResp, error) {
W
wenxu12345 已提交
512
	log.NewError(req.OperationID, "QuitGroup args ", req.String())
W
wenxu12345 已提交
513
	_, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupID, req.OpUserID)
W
wenxu12345 已提交
514
	if err != nil {
W
wenxu12345 已提交
515
		log.NewError(req.OperationID, "GetGroupMemberInfoByGroupIDAndUserID failed ", err.Error(), req.GroupID, req.OpUserID)
W
wenxu12345 已提交
516
		return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
517 518
	}

W
wenxu12345 已提交
519
	err = imdb.DeleteGroupMemberByGroupIDAndUserID(req.GroupID, req.OpUserID)
W
wenxu12345 已提交
520 521
	if err != nil {
		log.NewError(req.OperationID, "DeleteGroupMemberByGroupIdAndUserId failed ", err.Error(), req.GroupID, req.OpUserID)
W
wenxu12345 已提交
522
		return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
523 524 525 526 527 528 529 530
	}

	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
	}

W
wenxu12345 已提交
531
	chat.MemberLeaveNotification(req)
W
wenxu12345 已提交
532
	log.NewInfo(req.OperationID, "rpc QuitGroup return ", pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}})
W
wenxu12345 已提交
533
	return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
W
wenxu12345 已提交
534 535 536 537 538 539
}

func hasAccess(req *pbGroup.SetGroupInfoReq) bool {
	if utils.IsContain(req.OpUserID, config.Config.Manager.AppManagerUid) {
		return true
	}
W
wenxu12345 已提交
540
	groupUserInfo, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupInfo.GroupID, req.OpUserID)
W
wenxu12345 已提交
541
	if err != nil {
W
wenxu12345 已提交
542
		log.NewError(req.OperationID, "GetGroupMemberInfoByGroupIDAndUserID failed, ", err.Error(), req.GroupInfo.GroupID, req.OpUserID)
W
wenxu12345 已提交
543 544 545
		return false

	}
W
wenxu12345 已提交
546
	if groupUserInfo.RoleLevel == constant.GroupOwner || groupUserInfo.RoleLevel == constant.GroupAdmin {
W
wenxu12345 已提交
547 548
		return true
	}
W
wenxu12345 已提交
549
	return false
W
wenxu12345 已提交
550 551
}

W
wenxu12345 已提交
552
func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInfoReq) (*pbGroup.SetGroupInfoResp, error) {
W
wenxu12345 已提交
553 554
	log.NewInfo(req.OperationID, "SetGroupInfo args ", req.String())
	if !hasAccess(req) {
W
wenxu12345 已提交
555
		log.NewError(req.OperationID, "no access ", req)
W
wenxu12345 已提交
556
		return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
W
wenxu12345 已提交
557 558
	}

W
wenxu12345 已提交
559
	group, err := imdb.GetGroupInfoByGroupID(req.GroupInfo.GroupID)
W
wenxu12345 已提交
560
	if err != nil {
W
wenxu12345 已提交
561
		log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", err.Error(), req.GroupInfo.GroupID)
W
wenxu12345 已提交
562
		return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
W
wenxu12345 已提交
563 564
	}

W
wenxu12345 已提交
565
	////bitwise operators: 0001:groupName; 0010:Notification  0100:Introduction; 1000:FaceUrl; 10000:owner
W
wenxu12345 已提交
566
	var changedType int32
W
wenxu12345 已提交
567
	if group.GroupName != req.GroupInfo.GroupName && req.GroupInfo.GroupName != "" {
W
wenxu12345 已提交
568 569
		changedType = 1
	}
W
wenxu12345 已提交
570
	if group.Notification != req.GroupInfo.Notification && req.GroupInfo.Notification != "" {
W
wenxu12345 已提交
571 572
		changedType = changedType | (1 << 1)
	}
W
wenxu12345 已提交
573
	if group.Introduction != req.GroupInfo.Introduction && req.GroupInfo.Introduction != "" {
W
wenxu12345 已提交
574 575
		changedType = changedType | (1 << 2)
	}
W
wenxu12345 已提交
576
	if group.FaceUrl != req.GroupInfo.FaceUrl && req.GroupInfo.FaceUrl != "" {
W
wenxu12345 已提交
577 578 579
		changedType = changedType | (1 << 3)
	}
	//only administrators can set group information
W
wenxu12345 已提交
580
	var groupInfo db.Group
W
wenxu12345 已提交
581 582 583
	utils.CopyStructFields(&groupInfo, req.GroupInfo)
	err = imdb.SetGroupInfo(groupInfo)
	if err != nil {
W
wenxu12345 已提交
584
		log.NewError(req.OperationID, "SetGroupInfo failed ", err.Error(), groupInfo)
W
wenxu12345 已提交
585
		return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
586 587 588
	}

	if changedType != 0 {
W
wenxu12345 已提交
589
		chat.GroupInfoChangedNotification(req.OperationID, req.OpUserID, req.GroupInfo.GroupID, changedType)
W
wenxu12345 已提交
590
	}
W
wenxu12345 已提交
591
	log.NewInfo(req.OperationID, "SetGroupInfo rpc return ", pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}})
W
wenxu12345 已提交
592
	return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}}, nil
W
wenxu12345 已提交
593 594
}

W
wenxu12345 已提交
595
func (s *groupServer) TransferGroupOwner(_ context.Context, req *pbGroup.TransferGroupOwnerReq) (*pbGroup.TransferGroupOwnerResp, error) {
W
wenxu12345 已提交
596
	log.NewInfo(req.OperationID, "TransferGroupOwner ", req.String())
W
wenxu12345 已提交
597

W
wenxu12345 已提交
598
	if req.OldOwnerUserID == req.NewOwnerUserID {
W
wenxu12345 已提交
599
		log.NewError(req.OperationID, "same owner ", req.OldOwnerUserID, req.NewOwnerUserID)
W
wenxu12345 已提交
600 601
		return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrArgs.ErrCode, ErrMsg: constant.ErrArgs.ErrMsg}}, nil
	}
W
wenxu12345 已提交
602
	groupMemberInfo := db.GroupMember{GroupID: req.GroupID, UserID: req.OldOwnerUserID, RoleLevel: constant.GroupOrdinaryUsers}
W
wenxu12345 已提交
603 604
	err := imdb.UpdateGroupMemberInfo(groupMemberInfo)
	if err != nil {
W
wenxu12345 已提交
605
		log.NewError(req.OperationID, "UpdateGroupMemberInfo failed ", groupMemberInfo)
W
wenxu12345 已提交
606 607
		return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
	}
W
wenxu12345 已提交
608
	groupMemberInfo = db.GroupMember{GroupID: req.GroupID, UserID: req.NewOwnerUserID, RoleLevel: constant.GroupOwner}
W
wenxu12345 已提交
609
	err = imdb.UpdateGroupMemberInfo(groupMemberInfo)
W
wenxu12345 已提交
610
	if err != nil {
W
wenxu12345 已提交
611
		log.NewError(req.OperationID, "UpdateGroupMemberInfo failed ", groupMemberInfo)
W
wenxu12345 已提交
612
		return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
613
	}
W
wenxu12345 已提交
614 615
	changedType := int32(1) << 4
	chat.GroupInfoChangedNotification(req.OperationID, req.OpUserID, req.GroupID, changedType)
W
wenxu12345 已提交
616 617 618

	return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil

W
wenxu12345 已提交
619
}