mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-04-25 19:22:46 +08:00
CreateGroup
This commit is contained in:
parent
90cc7937e6
commit
90fddd34d2
@ -122,11 +122,47 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
|
|||||||
trace_log.SetContextInfo(ctx, utils.GetFuncName(1), nil, "req", req.String(), "resp", resp.String())
|
trace_log.SetContextInfo(ctx, utils.GetFuncName(1), nil, "req", req.String(), "resp", resp.String())
|
||||||
trace_log.ShowLog(ctx)
|
trace_log.ShowLog(ctx)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if err := token_verify.CheckAccessV2(ctx, req.OpUserID, req.OwnerUserID); err != nil {
|
if err := token_verify.CheckAccessV2(ctx, req.OpUserID, req.OwnerUserID); err != nil {
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
var groupOwnerNum int
|
||||||
|
var userIDs []string
|
||||||
|
for _, info := range req.InitMemberList {
|
||||||
|
if info.RoleLevel == constant.GroupOwner {
|
||||||
|
groupOwnerNum++
|
||||||
|
}
|
||||||
|
userIDs = append(userIDs, info.UserID)
|
||||||
|
}
|
||||||
|
if req.OwnerUserID != "" {
|
||||||
|
groupOwnerNum++
|
||||||
|
userIDs = append(userIDs, req.OwnerUserID)
|
||||||
|
}
|
||||||
|
if groupOwnerNum != 1 {
|
||||||
|
SetErrorForResp(constant.ErrArgs, resp.CommonResp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if utils.IsRepeatStringSlice(userIDs) {
|
||||||
|
SetErrorForResp(constant.ErrArgs, resp.CommonResp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
users, err := rocksCache.GetUserInfoFromCacheBatch(userIDs)
|
||||||
|
if err != nil {
|
||||||
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(users) != len(userIDs) {
|
||||||
|
SetErrorForResp(constant.ErrArgs, resp.CommonResp)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
userMap := make(map[string]*imdb.User)
|
||||||
|
for i, user := range users {
|
||||||
|
userMap[user.UserID] = users[i]
|
||||||
|
}
|
||||||
|
if err := s.DelGroupAndUserCache(req.OperationID, "", userIDs); err != nil {
|
||||||
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
|
return
|
||||||
|
}
|
||||||
if err := callbackBeforeCreateGroup(ctx, req); err != nil {
|
if err := callbackBeforeCreateGroup(ctx, req); err != nil {
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
return
|
return
|
||||||
@ -138,7 +174,6 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
|
|||||||
bi.SetString(groupId[0:8], 16)
|
bi.SetString(groupId[0:8], 16)
|
||||||
groupId = bi.String()
|
groupId = bi.String()
|
||||||
}
|
}
|
||||||
//to group
|
|
||||||
groupInfo := imdb.Group{}
|
groupInfo := imdb.Group{}
|
||||||
utils.CopyStructFields(&groupInfo, req.GroupInfo)
|
utils.CopyStructFields(&groupInfo, req.GroupInfo)
|
||||||
groupInfo.CreatorUserID = req.OpUserID
|
groupInfo.CreatorUserID = req.OpUserID
|
||||||
@ -147,125 +182,69 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
|
|||||||
if groupInfo.NotificationUpdateTime.Unix() < 0 {
|
if groupInfo.NotificationUpdateTime.Unix() < 0 {
|
||||||
groupInfo.NotificationUpdateTime = utils.UnixSecondToTime(0)
|
groupInfo.NotificationUpdateTime = utils.UnixSecondToTime(0)
|
||||||
}
|
}
|
||||||
if err := (*imdb.Group)(nil).Create(ctx, []*imdb.Group{&groupInfo}); err != nil {
|
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
groupMember := imdb.GroupMember{}
|
|
||||||
us := &imdb.User{}
|
|
||||||
if req.OwnerUserID != "" {
|
|
||||||
var userIDList []string
|
|
||||||
for _, v := range req.InitMemberList {
|
|
||||||
userIDList = append(userIDList, v.UserID)
|
|
||||||
}
|
|
||||||
userIDList = append(userIDList, req.OwnerUserID)
|
|
||||||
if err := s.DelGroupAndUserCache(req.OperationID, "", userIDList); err != nil {
|
|
||||||
SetErr(ctx, "DelGroupAndUserCache", err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var err error
|
|
||||||
us, err = imdb.GetUserByUserID(req.OwnerUserID)
|
|
||||||
if err != nil {
|
|
||||||
SetErr(ctx, "GetUserByUserID", err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg, "userID", req.OwnerUserID)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
//to group member
|
|
||||||
groupMember = imdb.GroupMember{GroupID: groupId, RoleLevel: constant.GroupOwner, OperatorUserID: req.OpUserID, JoinSource: constant.JoinByInvitation, InviterUserID: req.OpUserID}
|
|
||||||
utils.CopyStructFields(&groupMember, us)
|
|
||||||
if err := CallbackBeforeMemberJoinGroup(ctx, req.OperationID, &groupMember, groupInfo.Ex); err != nil {
|
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err := (*imdb.GroupMember)(nil).Create(ctx, []*imdb.GroupMember{&groupMember}); err != nil {
|
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var okUserIDList []string
|
|
||||||
if req.GroupInfo.GroupType != constant.SuperGroup {
|
if req.GroupInfo.GroupType != constant.SuperGroup {
|
||||||
//to group member
|
|
||||||
var groupMembers []*imdb.GroupMember
|
var groupMembers []*imdb.GroupMember
|
||||||
for _, user := range req.InitMemberList {
|
joinGroup := func(userID string, roleLevel int32) error {
|
||||||
us, err := rocksCache.GetUserInfoFromCache(user.UserID)
|
groupMember := &imdb.GroupMember{GroupID: groupId, RoleLevel: roleLevel, OperatorUserID: req.OpUserID, JoinSource: constant.JoinByInvitation, InviterUserID: req.OpUserID}
|
||||||
if err != nil {
|
user := userMap[userID]
|
||||||
trace_log.SetContextInfo(ctx, "GetUserInfoFromCache", err, "userID", user.UserID)
|
utils.CopyStructFields(&groupMember, user)
|
||||||
continue
|
if err := CallbackBeforeMemberJoinGroup(ctx, req.OperationID, groupMember, groupInfo.Ex); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
if user.RoleLevel == constant.GroupOwner {
|
groupMembers = append(groupMembers, groupMember)
|
||||||
trace_log.SetContextInfo(ctx, "GetUserInfoFromCache", nil, "userID", user.UserID, "msg", "only one owner, failed ")
|
return nil
|
||||||
continue
|
}
|
||||||
}
|
if req.OwnerUserID == "" {
|
||||||
groupMember.RoleLevel = user.RoleLevel
|
if err := joinGroup(req.OwnerUserID, constant.GroupOwner); err != nil {
|
||||||
groupMember.JoinSource = constant.JoinByInvitation
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
groupMember.InviterUserID = req.OpUserID
|
return
|
||||||
utils.CopyStructFields(&groupMember, us)
|
}
|
||||||
if err := CallbackBeforeMemberJoinGroup(ctx, req.OperationID, &groupMember, groupInfo.Ex); err != nil {
|
}
|
||||||
|
for _, info := range req.InitMemberList {
|
||||||
|
if err := joinGroup(info.UserID, info.RoleLevel); err != nil {
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
groupMembers = append(groupMembers, &groupMember)
|
|
||||||
okUserIDList = append(okUserIDList, user.UserID)
|
|
||||||
}
|
}
|
||||||
if err := (*imdb.GroupMember)(nil).Create(ctx, groupMembers); err != nil {
|
if err := (*imdb.GroupMember)(nil).Create(ctx, groupMembers); err != nil {
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
group, err := rocksCache.GetGroupInfoFromCache(ctx, groupId)
|
|
||||||
if err != nil {
|
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
utils.CopyStructFields(resp.GroupInfo, group)
|
|
||||||
memberCount, err := rocksCache.GetGroupMemberNumFromCache(groupId)
|
|
||||||
if err != nil {
|
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp.GroupInfo.MemberCount = uint32(memberCount)
|
|
||||||
if req.OwnerUserID != "" {
|
|
||||||
resp.GroupInfo.OwnerUserID = req.OwnerUserID
|
|
||||||
okUserIDList = append(okUserIDList, req.OwnerUserID)
|
|
||||||
}
|
|
||||||
// superGroup stored in mongodb
|
|
||||||
} else {
|
} else {
|
||||||
for _, v := range req.InitMemberList {
|
if err := db.DB.CreateSuperGroup(groupId, userIDs, len(userIDs)); err != nil {
|
||||||
okUserIDList = append(okUserIDList, v.UserID)
|
|
||||||
}
|
|
||||||
if err := db.DB.CreateSuperGroup(groupId, okUserIDList, len(okUserIDList)); err != nil {
|
|
||||||
SetErrorForResp(err, resp.CommonResp)
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if err := (*imdb.Group)(nil).Create(ctx, []*imdb.Group{&groupInfo}); err != nil {
|
||||||
if len(okUserIDList) != 0 {
|
SetErrorForResp(err, resp.CommonResp)
|
||||||
if req.GroupInfo.GroupType != constant.SuperGroup {
|
return
|
||||||
chat.GroupCreatedNotification(req.OperationID, req.OpUserID, groupId, okUserIDList)
|
}
|
||||||
} else {
|
utils.CopyStructFields(resp.GroupInfo, groupInfo)
|
||||||
for _, userID := range okUserIDList {
|
resp.GroupInfo.MemberCount = uint32(len(userIDs))
|
||||||
if err := rocksCache.DelJoinedSuperGroupIDListFromCache(userID); err != nil {
|
if req.GroupInfo.GroupType != constant.SuperGroup {
|
||||||
trace_log.SetContextInfo(ctx, "DelJoinedSuperGroupIDListFromCache", err, "userID", userID)
|
chat.GroupCreatedNotification(req.OperationID, req.OpUserID, groupId, userIDs)
|
||||||
//log.NewWarn(req.OperationID, utils.GetSelfFuncName(), userID, err.Error())
|
} else {
|
||||||
}
|
for _, userID := range userIDs {
|
||||||
|
if err := rocksCache.DelJoinedSuperGroupIDListFromCache(userID); err != nil {
|
||||||
|
trace_log.SetContextInfo(ctx, "DelJoinedSuperGroupIDListFromCache", err, "userID", userID)
|
||||||
}
|
}
|
||||||
go func() {
|
|
||||||
for _, v := range okUserIDList {
|
|
||||||
chat.SuperGroupNotification(req.OperationID, v, v)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
}
|
||||||
return
|
go func() {
|
||||||
} else {
|
for _, v := range userIDs {
|
||||||
//log.NewInfo(req.OperationID, "rpc CreateGroup return ", resp.String())
|
chat.SuperGroupNotification(req.OperationID, v, v)
|
||||||
return
|
}
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (resp *pbGroup.GetJoinedGroupListResp,_ error) {
|
func (s *groupServer) GetJoinedGroupList(ctx context.Context, req *pbGroup.GetJoinedGroupListReq) (resp *pbGroup.GetJoinedGroupListResp, _ error) {
|
||||||
resp = &pbGroup.GetJoinedGroupListResp{CommonResp: &open_im_sdk.CommonResp{}}
|
resp = &pbGroup.GetJoinedGroupListResp{CommonResp: &open_im_sdk.CommonResp{}}
|
||||||
ctx = trace_log.NewRpcCtx(ctx, utils.GetSelfFuncName(), req.OperationID)
|
ctx = trace_log.NewRpcCtx(ctx, utils.GetSelfFuncName(), req.OperationID)
|
||||||
trace_log.SetContextInfo(ctx, utils.GetSelfFuncName(), nil, "req", req, "resp", resp)
|
trace_log.SetContextInfo(ctx, utils.GetSelfFuncName(), nil, "req", req, "resp", resp)
|
||||||
defer trace_log.ShowLog(ctx)
|
defer trace_log.ShowLog(ctx)
|
||||||
if err := token_verify.CheckAccessV2(ctx, req.OpUserID, req.FromUserID);err != nil {
|
if err := token_verify.CheckAccessV2(ctx, req.OpUserID, req.FromUserID); err != nil {
|
||||||
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
|
SetErrorForResp(err, &resp.CommonResp.ErrCode, &resp.CommonResp.ErrMsg)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -205,6 +205,18 @@ func GetUserInfoFromCache(userID string) (*imdb.User, error) {
|
|||||||
return userInfo, utils.Wrap(err, "")
|
return userInfo, utils.Wrap(err, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetUserInfoFromCacheBatch(userIDs []string) ([]*imdb.User, error) {
|
||||||
|
var users []*imdb.User
|
||||||
|
for _, userID := range userIDs {
|
||||||
|
user, err := GetUserInfoFromCache(userID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
users = append(users, user)
|
||||||
|
}
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|
||||||
func DelUserInfoFromCache(userID string) error {
|
func DelUserInfoFromCache(userID string) error {
|
||||||
return db.DB.Rc.TagAsDeleted(userInfoCache + userID)
|
return db.DB.Rc.TagAsDeleted(userInfoCache + userID)
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ func Uint32ToString(i uint32) string {
|
|||||||
return strconv.FormatInt(int64(i), 10)
|
return strconv.FormatInt(int64(i), 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
//judge a string whether in the string list
|
// judge a string whether in the string list
|
||||||
func IsContain(target string, List []string) bool {
|
func IsContain(target string, List []string) bool {
|
||||||
for _, element := range List {
|
for _, element := range List {
|
||||||
|
|
||||||
@ -80,7 +80,7 @@ func StructToJsonBytes(param interface{}) []byte {
|
|||||||
return dataType
|
return dataType
|
||||||
}
|
}
|
||||||
|
|
||||||
//The incoming parameter must be a pointer
|
// The incoming parameter must be a pointer
|
||||||
func JsonStringToStruct(s string, args interface{}) error {
|
func JsonStringToStruct(s string, args interface{}) error {
|
||||||
err := json.Unmarshal([]byte(s), args)
|
err := json.Unmarshal([]byte(s), args)
|
||||||
return err
|
return err
|
||||||
@ -121,3 +121,14 @@ func RemoveDuplicateElement(idList []string) []string {
|
|||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsRepeatStringSlice(arr []string) bool {
|
||||||
|
t := make(map[string]struct{})
|
||||||
|
for _, s := range arr {
|
||||||
|
if _, ok := t[s]; ok {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
t[s] = struct{}{}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user