Skip to content

Commit 7050268

Browse files
committed
invite user to groups api add
1 parent 5d307c1 commit 7050268

File tree

8 files changed

+494
-214
lines changed

8 files changed

+494
-214
lines changed

cmd/open_im_api/main.go

+2
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ func main() {
111111
groupRouterGroup.POST("/get_group_all_member_list", group.GetGroupAllMemberList) //1
112112
groupRouterGroup.POST("/get_group_members_info", group.GetGroupMembersInfo) //1
113113
groupRouterGroup.POST("/invite_user_to_group", group.InviteUserToGroup) //1
114+
//only for supergroup
115+
groupRouterGroup.POST("/invite_user_to_groups", group.InviteUserToGroups)
114116
groupRouterGroup.POST("/get_joined_group_list", group.GetJoinedGroupList)
115117
groupRouterGroup.POST("/dismiss_group", group.DismissGroup) //
116118
groupRouterGroup.POST("/mute_group_member", group.MuteGroupMember)

internal/api/group/group.go

+41
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,47 @@ func InviteUserToGroup(c *gin.Context) {
370370
log.NewInfo(req.OperationID, "InviteUserToGroup api return ", resp)
371371
c.JSON(http.StatusOK, resp)
372372
}
373+
func InviteUserToGroups(c *gin.Context) {
374+
params := api.InviteUserToGroupsReq{}
375+
if err := c.BindJSON(&params); err != nil {
376+
log.NewError("0", "BindJSON failed ", err.Error())
377+
c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()})
378+
return
379+
}
380+
req := &rpc.InviteUserToGroupsReq{}
381+
utils.CopyStructFields(req, &params)
382+
383+
var ok bool
384+
var errInfo string
385+
ok, req.OpUserID, errInfo = token_verify.GetUserIDFromToken(c.Request.Header.Get("token"), req.OperationID)
386+
if !ok {
387+
errMsg := req.OperationID + " " + "GetUserIDFromToken failed " + errInfo + " token:" + c.Request.Header.Get("token")
388+
log.NewError(req.OperationID, errMsg)
389+
c.JSON(http.StatusBadRequest, gin.H{"errCode": 500, "errMsg": errMsg})
390+
return
391+
}
392+
393+
log.NewInfo(req.OperationID, "InviteUserToGroup args ", req.String())
394+
395+
etcdConn := getcdv3.GetDefaultConn(config.Config.Etcd.EtcdSchema, strings.Join(config.Config.Etcd.EtcdAddr, ","), config.Config.RpcRegisterName.OpenImGroupName, req.OperationID)
396+
if etcdConn == nil {
397+
errMsg := req.OperationID + "getcdv3.GetDefaultConn == nil"
398+
log.NewError(req.OperationID, errMsg)
399+
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": errMsg})
400+
return
401+
}
402+
client := rpc.NewGroupClient(etcdConn)
403+
RpcResp, err := client.InviteUserToGroups(context.Background(), req)
404+
if err != nil {
405+
log.NewError(req.OperationID, "InviteUserToGroup failed ", err.Error(), req.String())
406+
c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()})
407+
return
408+
}
409+
resp := api.InviteUserToGroupResp{CommResp: api.CommResp{ErrCode: RpcResp.ErrCode, ErrMsg: RpcResp.ErrMsg}}
410+
411+
log.NewInfo(req.OperationID, "InviteUserToGroups api return ", resp)
412+
c.JSON(http.StatusOK, resp)
413+
}
373414

374415
// @Summary 创建群组
375416
// @Description 创建群组

internal/rpc/group/group.go

+29
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,35 @@ func (s *groupServer) InviteUserToGroup(ctx context.Context, req *pbGroup.Invite
564564
return &resp, nil
565565
}
566566

567+
func (s *groupServer) InviteUserToGroups(ctx context.Context, req *pbGroup.InviteUserToGroupsReq) (*pbGroup.InviteUserToGroupsResp, error) {
568+
if !token_verify.IsManagerUserID(req.OpUserID) {
569+
log.NewError(req.OperationID, "no permission InviteUserToGroup ", req.String())
570+
return &pbGroup.InviteUserToGroupsResp{ErrCode: constant.ErrAccess.ErrCode, ErrMsg: constant.ErrAccess.ErrMsg}, nil
571+
}
572+
for _, v := range req.GroupIDList {
573+
groupInfo, err := imdb.GetGroupInfoByGroupID(v)
574+
if err != nil {
575+
log.NewError(req.OperationID, "GetGroupInfoByGroupID failed ", v, err)
576+
return &pbGroup.InviteUserToGroupsResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error() + v}, nil
577+
}
578+
if groupInfo.Status == constant.GroupStatusDismissed {
579+
errMsg := " group status is dismissed " + v
580+
return &pbGroup.InviteUserToGroupsResp{ErrCode: constant.ErrStatus.ErrCode, ErrMsg: errMsg}, nil
581+
}
582+
}
583+
if err := db.DB.AddUserToSuperGroups(req.GroupIDList, req.InvitedUserID); err != nil {
584+
log.NewError(req.OperationID, "AddUserToSuperGroups failed ", err.Error())
585+
return &pbGroup.InviteUserToGroupsResp{ErrCode: constant.ErrDB.ErrCode, ErrMsg: err.Error()}, nil
586+
}
587+
if err := rocksCache.DelJoinedSuperGroupIDListFromCache(req.InvitedUserID); err != nil {
588+
log.NewError(req.OperationID, utils.GetSelfFuncName(), err.Error())
589+
}
590+
chat.SuperGroupNotification(req.OperationID, req.InvitedUserID, req.InvitedUserID)
591+
592+
log.NewInfo(req.OperationID, "InviteUserToGroups rpc return ")
593+
return nil, nil
594+
}
595+
567596
func (s *groupServer) GetGroupAllMember(ctx context.Context, req *pbGroup.GetGroupAllMemberReq) (*pbGroup.GetGroupAllMemberResp, error) {
568597
log.NewInfo(req.OperationID, "GetGroupAllMember, args ", req.String())
569598
var resp pbGroup.GetGroupAllMemberResp

pkg/base_info/group_api_struct.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,15 @@ type InviteUserToGroupResp struct {
4747
CommResp
4848
UserIDResultList []*UserIDResult `json:"data"`
4949
}
50-
50+
type InviteUserToGroupsReq struct {
51+
GroupIDList string `json:"groupIDList" binding:"required"`
52+
InvitedUserID string `json:"invitedUserID" binding:"required"`
53+
Reason string `json:"reason"`
54+
OperationID string `json:"operationID" binding:"required"`
55+
}
56+
type InviteUserToGroupsResp struct {
57+
CommResp
58+
}
5159
type GetJoinedGroupListReq struct {
5260
OperationID string `json:"operationID" binding:"required"`
5361
FromUserID string `json:"fromUserID" binding:"required"`

pkg/common/db/model.go

+4
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ func init() {
112112
if err := createMongoIndex(mongoClient, cTag, true, "tag_id"); err != nil {
113113
panic(err.Error() + "index create failed " + cTag + " tag_id")
114114
}
115+
if err := createMongoIndex(mongoClient, cUserToSuperGroup, true, "user_id"); err != nil {
116+
panic(err.Error() + "index create failed " + cUserToSuperGroup + " user_id")
117+
}
118+
115119
DB.mongoClient = mongoClient
116120

117121
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)

pkg/common/db/mongoModel.go

+30
Original file line numberDiff line numberDiff line change
@@ -1233,6 +1233,36 @@ func (d *DataBases) AddUserToSuperGroup(groupID string, userIDList []string) err
12331233
_ = session.CommitTransaction(ctx)
12341234
return err
12351235
}
1236+
func (d *DataBases) AddUserToSuperGroups(groupIDList []string, userID string) error {
1237+
ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second)
1238+
c := d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cSuperGroup)
1239+
session, err := d.mongoClient.StartSession()
1240+
if err != nil {
1241+
return utils.Wrap(err, "start session failed")
1242+
}
1243+
defer session.EndSession(ctx)
1244+
sCtx := mongo.NewSessionContext(ctx, session)
1245+
if err != nil {
1246+
return utils.Wrap(err, "start transaction failed")
1247+
}
1248+
_, err = c.UpdateMany(sCtx, bson.M{"group_id": bson.M{"$in": groupIDList}}, bson.M{"$addToSet": bson.M{"member_id_list": userID}})
1249+
if err != nil {
1250+
_ = session.AbortTransaction(ctx)
1251+
return utils.Wrap(err, "transaction failed")
1252+
}
1253+
c = d.mongoClient.Database(config.Config.Mongo.DBDatabase).Collection(cUserToSuperGroup)
1254+
upsert := true
1255+
opts := &options.UpdateOptions{
1256+
Upsert: &upsert,
1257+
}
1258+
_, err = c.UpdateOne(sCtx, bson.M{"user_id": userID}, bson.M{"$addToSet": bson.M{"group_id_list": bson.M{"$each": groupIDList}}}, opts)
1259+
if err != nil {
1260+
_ = session.AbortTransaction(ctx)
1261+
return utils.Wrap(err, "transaction failed")
1262+
}
1263+
_ = session.CommitTransaction(ctx)
1264+
return err
1265+
}
12361266

12371267
func (d *DataBases) RemoverUserFromSuperGroup(groupID string, userIDList []string) error {
12381268
ctx, _ := context.WithTimeout(context.Background(), time.Duration(config.Config.Mongo.DBTimeout)*time.Second)

0 commit comments

Comments
 (0)