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

import (
W
wenxu12345 已提交
4
	chat "Open_IM/internal/rpc/msg"
5 6 7
	"Open_IM/pkg/common/config"
	"Open_IM/pkg/common/constant"
	"Open_IM/pkg/common/db"
W
wenxu12345 已提交
8
	"Open_IM/pkg/common/db/mysql_model/im_mysql_model"
9 10
	imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
	"Open_IM/pkg/common/log"
W
wenxu12345 已提交
11 12
	"Open_IM/pkg/common/token_verify"
	"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 := imdb.Group{GroupID: groupId}
W
wenxu12345 已提交
82
	utils.CopyStructFields(&groupInfo, req.GroupInfo)
W
wenxu12345 已提交
83
	groupInfo.CreatorUserID = req.OpUserID
W
wenxu12345 已提交
84
	err := im_mysql_model.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 98 99
	groupMember := imdb.GroupMember{GroupID: groupId, RoleLevel: 1}
	utils.CopyStructFields(&groupMember, us)
	err = im_mysql_model.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 := im_mysql_model.GetUserByUserID(user.UserID)
W
wenxu12345 已提交
113
		if err != nil {
W
wenxu12345 已提交
114
			log.NewError(req.OperationID, "FindUserByUID failed ", err.Error(), user.UserID)
W
wenxu12345 已提交
115 116
			continue
		}
W
wenxu12345 已提交
117
		if user.RoleLevel == 1 {
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 123
		utils.CopyStructFields(&groupMember, us)
		err = im_mysql_model.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{}
W
wenxu12345 已提交
137
	group, err := im_mysql_model.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 147 148
	resp.GroupInfo.MemberCount = uint32(imdb.GetGroupMemberNumByGroupID(groupId))
	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 = group.CreateTime
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, "FindGroupInfoByGroupId 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, "FindUserByUID 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 225 226 227 228
		var toInsertInfo imdb.GroupMember
		utils.CopyStructFields(&toInsertInfo, toUserInfo)
		toInsertInfo.GroupID = req.GroupID
		toInsertInfo.RoleLevel = 0
		err = imdb.InsertIntoGroupMember(toInsertInfo)
落凡尘.'s avatar
落凡尘. 已提交
229
		if err != nil {
W
wenxu12345 已提交
230
			log.NewError(req.OperationID, "InsertIntoGroupMember failed ", req.GroupID, toUserInfo.UserID, toUserInfo.Nickname, toUserInfo.FaceUrl)
落凡尘.'s avatar
落凡尘. 已提交
231
			resultNode.Result = -1
W
wenxu12345 已提交
232
			resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
落凡尘.'s avatar
落凡尘. 已提交
233 234
			continue
		}
W
wenxu12345 已提交
235
		okUserIDList = append(okUserIDList, v)
W
wenxu12345 已提交
236
		err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UserID)
落凡尘.'s avatar
落凡尘. 已提交
237
		if err != nil {
W
wenxu12345 已提交
238
			log.NewError(req.OperationID, "AddGroupMember failed ", err.Error(), req.GroupID, toUserInfo.UserID)
落凡尘.'s avatar
落凡尘. 已提交
239
		}
W
wenxu12345 已提交
240
		resp.Id2ResultList = append(resp.Id2ResultList, &resultNode)
落凡尘.'s avatar
落凡尘. 已提交
241 242
	}

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

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

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

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

	for _, v := range memberList {
W
wenxu12345 已提交
281 282
		var node open_im_sdk.GroupMemberFullInfo
		utils.CopyStructFields(&node, v)
落凡尘.'s avatar
落凡尘. 已提交
283 284 285 286 287 288 289 290 291
		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 已提交
292
	resp.ErrCode = 0
W
wenxu12345 已提交
293
	log.NewInfo(req.OperationID, "GetGroupMemberList rpc return ", resp.String())
落凡尘.'s avatar
落凡尘. 已提交
294 295 296 297
	return &resp, nil
}

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

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

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

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

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

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

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

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

落凡尘.'s avatar
落凡尘. 已提交
371 372 373
	var resp pbGroup.GetGroupMembersInfoResp

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

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

	resp := pbGroup.GetGroupApplicationListResp{}
	for _, v := range reply {
		var node open_im_sdk.GroupRequest
		utils.CopyStructFields(&node, v)
	}
	log.NewInfo(req.OperationID, "GetGroupMembersInfo rpc return ", resp)
	return &resp, nil
W
wenxu12345 已提交
406 407 408
}

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

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

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

	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)
W
wenxu12345 已提交
439
	if err != nil {
W
wenxu12345 已提交
440
		log.NewError(req.OperationID, "GroupApplicationResponse failed ", err.Error(), req.String())
W
wenxu12345 已提交
441
		return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
442
	}
W
wenxu12345 已提交
443
	chat.ApplicationProcessedNotification(req)
W
wenxu12345 已提交
444
	if req.HandleResult == 1 {
W
wenxu12345 已提交
445
		chat.MemberEnterNotification(req)
W
wenxu12345 已提交
446 447
	}

W
wenxu12345 已提交
448 449
	log.NewInfo(req.OperationID, "rpc GroupApplicationResponse return ")
	return &pbGroup.GroupApplicationResponseResp{CommonResp: &pbGroup.CommonResp{}}, nil
W
wenxu12345 已提交
450 451
}

W
wenxu12345 已提交
452
func (s *groupServer) JoinGroup(ctx context.Context, req *pbGroup.JoinGroupReq) (*pbGroup.JoinGroupResp, error) {
W
wenxu12345 已提交
453
	log.NewInfo(req.OperationID, "JoinGroup args ", req.String())
W
wenxu12345 已提交
454
	applicationUserInfo, err := imdb.GetUserByUserID(req.OpUserID)
W
wenxu12345 已提交
455
	if err != nil {
W
wenxu12345 已提交
456
		log.NewError(req.OperationID, "FindUserByUID failed ", err.Error(), req.OpUserID)
W
wenxu12345 已提交
457
		return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
458 459
	}

W
wenxu12345 已提交
460 461 462 463 464
	var groupRequest imdb.GroupRequest
	utils.CopyStructFields(&groupRequest, req)
	err = imdb.UpdateGroupRequest(groupRequest)
	if err != nil {
		log.NewError(req.OperationID, "UpdateGroupRequest ", err.Error(), groupRequest)
W
wenxu12345 已提交
465
		return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
466 467
	}

W
wenxu12345 已提交
468 469 470
	_, err = imdb.GetGroupMemberListByGroupIDAndRoleLevel(req.GroupID, constant.GroupOwner)
	if err != nil {
		log.NewError(req.OperationID, "GetGroupMemberListByGroupIDAndRoleLevel failed ", err.Error(), req.GroupID, constant.GroupOwner)
W
wenxu12345 已提交
471
		return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
W
wenxu12345 已提交
472
	}
W
wenxu12345 已提交
473

W
wenxu12345 已提交
474
	chat.JoinApplicationNotification(req)
W
wenxu12345 已提交
475

W
wenxu12345 已提交
476
	log.NewInfo(req.OperationID, "ReceiveJoinApplicationNotification rpc return ")
W
wenxu12345 已提交
477
	return &pbGroup.JoinGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
W
wenxu12345 已提交
478 479
}

W
wenxu12345 已提交
480
func (s *groupServer) QuitGroup(ctx context.Context, req *pbGroup.QuitGroupReq) (*pbGroup.QuitGroupResp, error) {
W
wenxu12345 已提交
481 482
	log.NewError("QuitGroup args ", req.String())

W
wenxu12345 已提交
483
	_, err := imdb.GetGroupMemberInfoByGroupIDAndUserID(req.GroupID, req.OpUserID)
W
wenxu12345 已提交
484 485
	if err != nil {
		log.NewError(req.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed", err.Error(), req.GroupID, req.OpUserID)
W
wenxu12345 已提交
486
		return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
487 488
	}

W
wenxu12345 已提交
489
	err = imdb.DeleteGroupMemberByGroupIDAndUserID(req.GroupID, req.OpUserID)
W
wenxu12345 已提交
490 491
	if err != nil {
		log.NewError(req.OperationID, "DeleteGroupMemberByGroupIdAndUserId failed ", err.Error(), req.GroupID, req.OpUserID)
W
wenxu12345 已提交
492
		return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
493 494 495 496 497 498 499 500
	}

	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 已提交
501
	chat.MemberLeaveNotification(req)
W
wenxu12345 已提交
502
	log.NewInfo(req.OperationID, "rpc QuitGroup return ")
W
wenxu12345 已提交
503
	return &pbGroup.QuitGroupResp{CommonResp: &pbGroup.CommonResp{ErrCode: 0, ErrMsg: ""}}, nil
W
wenxu12345 已提交
504 505 506 507 508 509
}

func hasAccess(req *pbGroup.SetGroupInfoReq) bool {
	if utils.IsContain(req.OpUserID, config.Config.Manager.AppManagerUid) {
		return true
	}
W
wenxu12345 已提交
510
	groupUserInfo, err := im_mysql_model.GetGroupMemberInfoByGroupIDAndUserID(req.GroupInfo.GroupID, req.OpUserID)
W
wenxu12345 已提交
511
	if err != nil {
W
wenxu12345 已提交
512
		log.NewError(req.OperationID, "FindGroupMemberInfoByGroupIdAndUserId failed, ", err.Error(), req.GroupInfo.GroupID, req.OpUserID)
W
wenxu12345 已提交
513 514 515
		return false

	}
W
wenxu12345 已提交
516
	if groupUserInfo.RoleLevel == constant.OrdinaryMember {
W
wenxu12345 已提交
517 518 519 520
		return true
	}
}

W
wenxu12345 已提交
521
func (s *groupServer) SetGroupInfo(ctx context.Context, req *pbGroup.SetGroupInfoReq) (*pbGroup.SetGroupInfoResp, error) {
W
wenxu12345 已提交
522 523 524
	log.NewInfo(req.OperationID, "SetGroupInfo args ", req.String())
	if !hasAccess(req) {
		log.NewError(req.OperationID, "no access ")
W
wenxu12345 已提交
525
		return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
W
wenxu12345 已提交
526 527
	}

W
wenxu12345 已提交
528
	group, err := im_mysql_model.GetGroupInfoByGroupID(req.GroupInfo.GroupID)
W
wenxu12345 已提交
529
	if err != nil {
W
wenxu12345 已提交
530
		log.NewError(req.OperationID, "FindGroupInfoByGroupId failed ", err.Error(), req.GroupInfo.GroupID)
W
wenxu12345 已提交
531
		return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
W
wenxu12345 已提交
532 533
	}

W
wenxu12345 已提交
534
	////bitwise operators: 0001:groupName; 0010:Notification  0100:Introduction; 1000:FaceUrl; 10000:owner
W
wenxu12345 已提交
535
	var changedType int32
W
wenxu12345 已提交
536
	if group.GroupName != req.GroupInfo.GroupName && req.GroupInfo.GroupName != "" {
W
wenxu12345 已提交
537 538
		changedType = 1
	}
W
wenxu12345 已提交
539
	if group.Notification != req.GroupInfo.Notification && req.GroupInfo.Notification != "" {
W
wenxu12345 已提交
540 541
		changedType = changedType | (1 << 1)
	}
W
wenxu12345 已提交
542
	if group.Introduction != req.GroupInfo.Introduction && req.GroupInfo.Introduction != "" {
W
wenxu12345 已提交
543 544
		changedType = changedType | (1 << 2)
	}
W
wenxu12345 已提交
545
	if group.FaceUrl != req.GroupInfo.FaceUrl && req.GroupInfo.FaceUrl != "" {
W
wenxu12345 已提交
546 547 548
		changedType = changedType | (1 << 3)
	}
	//only administrators can set group information
W
wenxu12345 已提交
549 550 551 552 553
	var groupInfo imdb.Group
	utils.CopyStructFields(&groupInfo, req.GroupInfo)
	err = imdb.SetGroupInfo(groupInfo)
	if err != nil {
		return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}}, nil
W
wenxu12345 已提交
554 555 556
	}

	if changedType != 0 {
W
wenxu12345 已提交
557
		chat.GroupInfoChangedNotification(req.OperationID, req.OpUserID, req.GroupInfo.GroupID, changedType)
W
wenxu12345 已提交
558
	}
W
wenxu12345 已提交
559 560
	log.NewInfo("SetGroupInfo rpc return ", pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}})
	return &pbGroup.SetGroupInfoResp{CommonResp: &pbGroup.CommonResp{}}, nil
W
wenxu12345 已提交
561 562
}

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

W
wenxu12345 已提交
566 567 568 569 570 571 572 573 574 575 576
	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)
W
wenxu12345 已提交
577
	if err != nil {
W
wenxu12345 已提交
578
		return &pbGroup.TransferGroupOwnerResp{CommonResp: &pbGroup.CommonResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: constant.ErrDB.ErrMsg}}, nil
W
wenxu12345 已提交
579
	}
W
wenxu12345 已提交
580 581
	changedType := int32(1) << 4
	chat.GroupInfoChangedNotification(req.OperationID, req.OpUserID, req.GroupID, changedType)
W
wenxu12345 已提交
582 583 584

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

W
wenxu12345 已提交
585
}