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

import (
Bytecode字节码联盟's avatar
Bytecode字节码联盟 已提交
4 5
	"Open_IM/internal/push/content_struct"
	"Open_IM/internal/push/logic"
6 7 8
	"Open_IM/pkg/common/config"
	"Open_IM/pkg/common/constant"
	"Open_IM/pkg/common/db"
9
	pbChat "Open_IM/pkg/proto/chat"
programor_guo's avatar
programor_guo 已提交
10
	"encoding/json"
落凡尘.'s avatar
落凡尘. 已提交
11

12 13
	imdb "Open_IM/pkg/common/db/mysql_model/im_mysql_model"
	"Open_IM/pkg/common/log"
14
	pbGroup "Open_IM/pkg/proto/group"
15
	"Open_IM/pkg/utils"
落凡尘.'s avatar
落凡尘. 已提交
16
	"context"
落凡尘.'s avatar
落凡尘. 已提交
17

落凡尘.'s avatar
落凡尘. 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
	"fmt"
)

func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (*pbGroup.GetJoinedGroupListResp, error) {
	claims, err := utils.ParseToken(req.Token)
	if err != nil {
		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
		return &pbGroup.GetJoinedGroupListResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
	}
	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())

	joinedGroupList, err := imdb.GetJoinedGroupIdListByMemberId(claims.UID)
	if err != nil {
		log.Error(claims.UID, req.OperationID, "GetJoinedGroupIdListByMemberId failed, err: ", err.Error())
		return &pbGroup.GetJoinedGroupListResp{ErrorCode: config.ErrParam.ErrCode, ErrorMsg: config.ErrParam.ErrMsg}, nil
	}

	var resp pbGroup.GetJoinedGroupListResp

	for _, v := range joinedGroupList {
		var groupNode pbGroup.GroupInfo
		num := imdb.GetGroupMemberNumByGroupId(v.GroupId)
		owner := imdb.GetGroupOwnerByGroupId(v.GroupId)
		group, err := imdb.FindGroupInfoByGroupId(v.GroupId)
		if num > 0 && owner != "" && err == nil {
落凡尘.'s avatar
落凡尘. 已提交
43
			groupNode.GroupId = v.GroupId
落凡尘.'s avatar
落凡尘. 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
			groupNode.FaceUrl = group.FaceUrl
			groupNode.CreateTime = uint64(group.CreateTime.Unix())
			groupNode.GroupName = group.Name
			groupNode.Introduction = group.Introduction
			groupNode.Notification = group.Notification
			groupNode.OwnerId = owner
			groupNode.MemberCount = uint32(int32(num))
			resp.GroupList = append(resp.GroupList, &groupNode)
		}
		log.Info(claims.UID, req.OperationID, "member num: ", num, "owner: ", owner)
	}
	resp.ErrorCode = 0
	return &resp, nil
}

func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.InviteUserToGroupReq) (*pbGroup.InviteUserToGroupResp, error) {
	claims, err := utils.ParseToken(req.Token)
	if err != nil {
		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
		return &pbGroup.InviteUserToGroupResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
	}
	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())
programor_guo's avatar
programor_guo 已提交
66
	//	if !imdb.IsExistGroupMember(req.GroupID, claims.UID) &&  claims.UID != config.Config.AppManagerUid
落凡尘.'s avatar
落凡尘. 已提交
67

programor_guo's avatar
programor_guo 已提交
68
	if !imdb.IsExistGroupMember(req.GroupID, claims.UID) && !utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
落凡尘.'s avatar
落凡尘. 已提交
69 70 71 72
		log.Error(req.Token, req.OperationID, "err= invite user not in group")
		return &pbGroup.InviteUserToGroupResp{ErrorCode: config.ErrAccess.ErrCode, ErrorMsg: config.ErrAccess.ErrMsg}, nil
	}

落凡尘.'s avatar
落凡尘. 已提交
73 74 75 76 77
	//
	//from User:  invite: applicant
	//to user:  invite: invited
	//to application
	var resp pbGroup.InviteUserToGroupResp
落凡尘.'s avatar
落凡尘. 已提交
78 79 80 81 82 83
	/*
		fromUserInfo, err := imdb.FindUserByUID(claims.UID)
		if err != nil {
			log.Error(claims.UID, req.OperationID, "FindUserByUID failed, err: ", err.Error())
			return &pbGroup.InviteUserToGroupResp{ErrorCode: config.ErrParam.ErrCode, ErrorMsg: config.ErrParam.ErrMsg}, nil
		}*/
落凡尘.'s avatar
落凡尘. 已提交
84 85 86 87 88 89 90 91 92 93 94 95

	for _, v := range req.UidList {
		var resultNode pbGroup.Id2Result
		resultNode.UId = v
		resultNode.Result = 0
		toUserInfo, err := imdb.FindUserByUID(v)
		if err != nil {
			log.Error(v, req.OperationID, "FindUserByUID failed, err: ", err.Error())
			resultNode.Result = -1
			resp.Id2Result = append(resp.Id2Result, &resultNode)
			continue
		}
落凡尘.'s avatar
落凡尘. 已提交
96 97 98

		if imdb.IsExistGroupMember(req.GroupID, v) {
			log.Error(v, req.OperationID, "user has already in group")
落凡尘.'s avatar
落凡尘. 已提交
99 100 101 102
			resultNode.Result = -1
			resp.Id2Result = append(resp.Id2Result, &resultNode)
			continue
		}
落凡尘.'s avatar
落凡尘. 已提交
103

落凡尘.'s avatar
落凡尘. 已提交
104 105 106 107 108 109 110 111
		err = imdb.InsertGroupMember(req.GroupID, toUserInfo.UID, toUserInfo.Name, toUserInfo.Icon, 0)
		if err != nil {
			log.Error(v, req.OperationID, "InsertGroupMember failed, ", err.Error(), "params: ",
				req.GroupID, toUserInfo.UID, toUserInfo.Name, toUserInfo.Icon)
			resultNode.Result = -1
			resp.Id2Result = append(resp.Id2Result, &resultNode)
			continue
		}
落凡尘.'s avatar
落凡尘. 已提交
112 113 114 115 116
		err = db.DB.AddGroupMember(req.GroupID, toUserInfo.UID)
		if err != nil {
			log.Error("", "", "add mongo group member failed, db.DB.AddGroupMember fail [err: %s]", err.Error())
		}

落凡尘.'s avatar
落凡尘. 已提交
117 118 119 120
		resp.Id2Result = append(resp.Id2Result, &resultNode)
	}
	resp.ErrorCode = 0
	resp.ErrorMsg = "ok"
programor_guo's avatar
programor_guo 已提交
121

programor_guo's avatar
programor_guo 已提交
122 123
	//if claims.UID == config.Config.AppManagerUid
	if utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
programor_guo's avatar
programor_guo 已提交
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
		var iu inviteUserToGroupReq
		iu.GroupID = req.GroupID
		iu.OperationID = req.OperationID
		iu.Reason = req.Reason
		iu.UidList = req.UidList
		n := content_struct.NotificationContent{1, req.GroupID, iu.ContentToString()}
		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
			SendID:      claims.UID,
			RecvID:      req.GroupID,
			Content:     n.ContentToString(),
			SendTime:    utils.GetCurrentTimestampByNano(),
			MsgFrom:     constant.UserMsgType,
			ContentType: constant.InviteUserToGroupTip,
			SessionType: constant.GroupChatType,
			OperationID: req.OperationID,
		})
	}
落凡尘.'s avatar
落凡尘. 已提交
141 142 143 144

	return &resp, nil
}

programor_guo's avatar
programor_guo 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157
type inviteUserToGroupReq struct {
	GroupID     string   `json:"groupID"`
	UidList     []string `json:"uidList"`
	Reason      string   `json:"reason"`
	OperationID string   `json:"operationID"`
}

func (c *inviteUserToGroupReq) ContentToString() string {
	data, _ := json.Marshal(c)
	dataString := string(data)
	return dataString
}

落凡尘.'s avatar
落凡尘. 已提交
158 159 160 161
func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGroupAllMemberReq) (*pbGroup.GetGroupAllMemberResp, error) {
	claims, err := utils.ParseToken(req.Token)
	if err != nil {
		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
落凡尘.'s avatar
落凡尘. 已提交
162 163 164
		if req.Token != config.Config.Secret {
			return &pbGroup.GetGroupAllMemberResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
		}
落凡尘.'s avatar
落凡尘. 已提交
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
	}

	var resp pbGroup.GetGroupAllMemberResp
	resp.ErrorCode = 0
	memberList, err := imdb.FindGroupMemberListByGroupId(req.GroupID)
	if err != nil {
		resp.ErrorCode = config.ErrDb.ErrCode
		resp.ErrorMsg = err.Error()
		log.Error(claims.UID, req.OperationID, "FindGroupMemberListByGroupId failed, ", err.Error(), "params: ", req.GroupID)
		return &resp, nil
	}

	for _, v := range memberList {
		var node pbGroup.GroupMemberFullInfo
		node.Role = v.AdministratorLevel
		node.NickName = v.NickName
		node.UserId = v.Uid
落凡尘.'s avatar
落凡尘. 已提交
182
		node.FaceUrl = v.UserGroupFaceUrl
落凡尘.'s avatar
落凡尘. 已提交
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
		node.JoinTime = uint64(v.JoinTime.Unix())
		resp.MemberList = append(resp.MemberList, &node)
	}

	resp.ErrorCode = 0
	return &resp, nil
}

func (s *groupServer) GetGroupMemberList(ctx context.Context, req *pbGroup.GetGroupMemberListReq) (*pbGroup.GetGroupMemberListResp, error) {
	claims, err := utils.ParseToken(req.Token)
	if err != nil {
		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
		return &pbGroup.GetGroupMemberListResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
	}
	//	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())
	fmt.Println("req: ", req.GroupID)
	var resp pbGroup.GetGroupMemberListResp
	resp.ErrorCode = 0
	memberList, err := imdb.GetGroupMemberByGroupId(req.GroupID, req.Filter, req.NextSeq, 30)
	if err != nil {
		resp.ErrorCode = config.ErrDb.ErrCode
		resp.ErrorMsg = err.Error()
		log.Error(claims.UID, req.OperationID, "GetGroupMemberByGroupId failed, ", err.Error(), "params: ", req.GroupID, req.Filter, req.NextSeq)
		return &resp, nil
	}

	for _, v := range memberList {
		var node pbGroup.GroupMemberFullInfo
		node.Role = v.AdministratorLevel
		node.NickName = v.NickName
		node.UserId = v.Uid
		//	node.FaceUrl =
		node.JoinTime = uint64(v.JoinTime.Unix())
		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))
	}

	resp.ErrorCode = 0
	return &resp, nil
}

programor_guo's avatar
programor_guo 已提交
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
type groupMemberFullInfo struct {
	GroupId  string `json:"groupID"`
	UserId   string `json:"userId"`
	Role     int    `json:"role"`
	JoinTime uint64 `json:"joinTime"`
	NickName string `json:"nickName"`
	FaceUrl  string `json:"faceUrl"`
}

type kickGroupMemberApiReq struct {
	GroupID     string                `json:"groupID"`
	UidListInfo []groupMemberFullInfo `json:"uidListInfo"`
	Reason      string                `json:"reason"`
	OperationID string                `json:"operationID"`
}

func (c *kickGroupMemberApiReq) ContentToString() string {
	data, _ := json.Marshal(c)
	dataString := string(data)
	return dataString
}

落凡尘.'s avatar
落凡尘. 已提交
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
func (s *groupServer) KickGroupMember(ctx context.Context, req *pbGroup.KickGroupMemberReq) (*pbGroup.KickGroupMemberResp, error) {
	claims, err := utils.ParseToken(req.Token)
	if err != nil {
		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
		return &pbGroup.KickGroupMemberResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
	}
	log.Info(claims.UID, req.OperationID, "recv req: ", req.String())

	ownerList, err := imdb.GetOwnerManagerByGroupId(req.GroupID)
	if err != nil {
		log.Error(claims.UID, req.OperationID, req.GroupID, "GetOwnerManagerByGroupId, ", err.Error())
		return &pbGroup.KickGroupMemberResp{ErrorCode: config.ErrParam.ErrCode, ErrorMsg: config.ErrParam.ErrMsg}, nil
	}
	//op is group owner?
	var flag = 0
	for _, v := range ownerList {
		if v.Uid == claims.UID {
			flag = 1
			break
		}
	}
programor_guo's avatar
programor_guo 已提交
272
	if flag != 1 {
programor_guo's avatar
programor_guo 已提交
273 274
		//	if claims.UID == config.Config.AppManagerUid {
		if utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
programor_guo's avatar
programor_guo 已提交
275 276 277 278
			flag = 1
		}
	}

落凡尘.'s avatar
落凡尘. 已提交
279 280 281 282 283
	if flag != 1 {
		log.Error(claims.UID, req.OperationID, "no access kick")
		return &pbGroup.KickGroupMemberResp{ErrorCode: config.ErrAccess.ErrCode, ErrorMsg: config.ErrAccess.ErrMsg}, nil
	}

落凡尘.'s avatar
落凡尘. 已提交
284
	if len(req.UidListInfo) == 0 {
落凡尘.'s avatar
落凡尘. 已提交
285 286 287 288 289
		log.Error(claims.UID, req.OperationID, "kick list 0")
		return &pbGroup.KickGroupMemberResp{ErrorCode: config.ErrParam.ErrCode, ErrorMsg: config.ErrParam.ErrMsg}, nil
	}
	//remove
	var resp pbGroup.KickGroupMemberResp
落凡尘.'s avatar
落凡尘. 已提交
290
	for _, v := range req.UidListInfo {
落凡尘.'s avatar
落凡尘. 已提交
291
		//owner cant kicked
落凡尘.'s avatar
落凡尘. 已提交
292 293 294
		if v.UserId == claims.UID {
			log.Error(claims.UID, req.OperationID, v.UserId, "cant kick owner")
			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: -1})
落凡尘.'s avatar
落凡尘. 已提交
295 296
			continue
		}
落凡尘.'s avatar
落凡尘. 已提交
297
		err := imdb.RemoveGroupMember(req.GroupID, v.UserId)
落凡尘.'s avatar
落凡尘. 已提交
298
		if err != nil {
落凡尘.'s avatar
落凡尘. 已提交
299 300
			log.Error(claims.UID, req.OperationID, v.UserId, req.GroupID, "RemoveGroupMember failed ", err.Error())
			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: -1})
落凡尘.'s avatar
落凡尘. 已提交
301
		} else {
落凡尘.'s avatar
落凡尘. 已提交
302
			resp.Id2Result = append(resp.Id2Result, &pbGroup.Id2Result{UId: v.UserId, Result: 0})
落凡尘.'s avatar
落凡尘. 已提交
303 304
		}

落凡尘.'s avatar
落凡尘. 已提交
305 306 307 308
		err = db.DB.DelGroupMember(req.GroupID, v.UserId)
		if err != nil {
			log.Error("", "", "delete mongo group member failed, db.DB.DelGroupMember fail [err: %s]", err.Error())
		}
落凡尘.'s avatar
落凡尘. 已提交
309 310

	}
programor_guo's avatar
programor_guo 已提交
311
	var kq kickGroupMemberApiReq
落凡尘.'s avatar
落凡尘. 已提交
312

programor_guo's avatar
programor_guo 已提交
313 314 315
	kq.GroupID = req.GroupID
	kq.OperationID = req.OperationID
	kq.Reason = req.Reason
落凡尘.'s avatar
落凡尘. 已提交
316

programor_guo's avatar
programor_guo 已提交
317 318 319 320 321 322
	var gf groupMemberFullInfo
	for _, v := range req.UidListInfo {
		gf.UserId = v.UserId
		gf.GroupId = req.GroupID
		kq.UidListInfo = append(kq.UidListInfo, gf)
	}
落凡尘.'s avatar
落凡尘. 已提交
323

programor_guo's avatar
programor_guo 已提交
324 325
	n := content_struct.NotificationContent{1, req.GroupID, kq.ContentToString()}

programor_guo's avatar
programor_guo 已提交
326
	if utils.IsContain(claims.UID, config.Config.Manager.AppManagerUid) {
programor_guo's avatar
programor_guo 已提交
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
		log.Info("", req.OperationID, claims.UID, req.GroupID)
		logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
			SendID:      claims.UID,
			RecvID:      req.GroupID,
			Content:     n.ContentToString(),
			SendTime:    utils.GetCurrentTimestampByNano(),
			MsgFrom:     constant.UserMsgType,
			ContentType: constant.KickGroupMemberTip,
			SessionType: constant.GroupChatType,
			OperationID: req.OperationID,
		})

		for _, v := range req.UidListInfo {
			log.Info("", req.OperationID, claims.UID, v.UserId)
			logic.SendMsgByWS(&pbChat.WSToMsgSvrChatMsg{
				SendID:      claims.UID,
				RecvID:      v.UserId,
				Content:     n.ContentToString(),
				SendTime:    utils.GetCurrentTimestampBySecond(),
				MsgFrom:     constant.UserMsgType,
				ContentType: constant.KickGroupMemberTip,
				SessionType: constant.SingleChatType,
				OperationID: req.OperationID,
			})
		}
	}
落凡尘.'s avatar
落凡尘. 已提交
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
	resp.ErrorCode = 0
	return &resp, nil
}

func (s *groupServer) GetGroupMembersInfo(ctx context.Context, req *pbGroup.GetGroupMembersInfoReq) (*pbGroup.GetGroupMembersInfoResp, error) {
	claims, err := utils.ParseToken(req.Token)
	if err != nil {
		log.Error(req.Token, req.OperationID, "err=%s,parse token failed", err.Error())
		return &pbGroup.GetGroupMembersInfoResp{ErrorCode: config.ErrParseToken.ErrCode, ErrorMsg: config.ErrParseToken.ErrMsg}, nil
	}
	log.InfoByKv(claims.UID, req.OperationID, "param: ", req.MemberList)
	var resp pbGroup.GetGroupMembersInfoResp

	for _, v := range req.MemberList {
		var memberNode pbGroup.GroupMemberFullInfo
		memberInfo, err := imdb.GetMemberInfoById(req.GroupID, v)
		memberNode.UserId = v
		fmt.Println("id : ", memberNode.UserId)
		if err != nil {
			log.Error(claims.UID, req.OperationID, req.GroupID, v, "GetMemberInfoById failed, ", err.Error())
			//error occurs, only id is valid
			resp.MemberList = append(resp.MemberList, &memberNode)
			continue
		}
		user, err := imdb.FindUserByUID(v)
		if err == nil && user != nil {
			memberNode.FaceUrl = user.Icon
			memberNode.JoinTime = uint64(memberInfo.JoinTime.Unix())
			memberNode.UserId = user.UID
			memberNode.NickName = memberInfo.NickName
			memberNode.Role = memberInfo.AdministratorLevel
		}
		resp.MemberList = append(resp.MemberList, &memberNode)
	}
	resp.ErrorCode = 0
	return &resp, nil
}