Files
open-im-server/pkg/common/db/controller/group.go
T

286 lines
10 KiB
Go
Raw Normal View History

2023-01-28 13:19:36 +08:00
package controller
import (
"Open_IM/pkg/common/db/cache"
"Open_IM/pkg/common/db/relation"
"Open_IM/pkg/common/db/unrelation"
"context"
"github.com/dtm-labs/rockscache"
_ "github.com/dtm-labs/rockscache"
"github.com/go-redis/redis/v8"
"go.mongodb.org/mongo-driver/mongo"
"gorm.io/gorm"
)
type GroupInterface interface {
FindGroupsByID(ctx context.Context, groupIDs []string) (groups []*relation.Group, err error)
2023-01-29 14:51:59 +08:00
CreateGroup(ctx context.Context, groups []*relation.Group, groupMember []*relation.GroupMember) error
2023-01-28 13:19:36 +08:00
DeleteGroupByIDs(ctx context.Context, groupIDs []string) error
TakeGroupByID(ctx context.Context, groupID string) (group *relation.Group, err error)
2023-02-01 12:00:29 +08:00
TakeGroupMemberByID(ctx context.Context, groupID string, userID string) (groupMember *relation.GroupMember, err error)
2023-01-29 15:23:14 +08:00
GetJoinedGroupList(ctx context.Context, userID string) ([]*relation.Group, error)
2023-01-29 18:13:02 +08:00
GetGroupMemberList(ctx context.Context, groupID string) ([]*relation.GroupMember, error)
2023-01-29 18:37:38 +08:00
GetGroupMemberListByUserID(ctx context.Context, groupID string, userIDs []string) ([]*relation.GroupMember, error)
GetGroupMemberFilterList(ctx context.Context, groupID string, filter int32, begin int32, maxNumber int32) ([]*relation.GroupMember, error) // relation.GetGroupMemberByGroupID(req.GroupID, req.Filter, req.NextSeq, 30)
2023-02-01 12:00:29 +08:00
FindGroupMembersByID(ctx context.Context, groupID string, userIDs []string) (groups []*relation.GroupMember, err error)
DelGroupMember(ctx context.Context, groupID string, userIDs []string) error
2023-01-29 15:23:14 +08:00
GetGroupMemberNum(ctx context.Context, groupIDs []string) (map[string]int, error)
GetGroupOwnerUserID(ctx context.Context, groupIDs []string) (map[string]string, error)
2023-02-01 12:00:29 +08:00
GetGroupRecvApplicationList(ctx context.Context, userID string) ([]*relation.GroupRequest, error)
2023-01-29 18:13:02 +08:00
CreateGroupMember(ctx context.Context, groupMember []*relation.GroupMember) error
CreateGroupRequest(ctx context.Context, requests []*relation.GroupRequest) error
2023-01-28 13:19:36 +08:00
//mongo
2023-01-29 14:51:59 +08:00
CreateSuperGroup(ctx context.Context, groupID string, initMemberIDList []string) error
2023-02-01 12:00:29 +08:00
DelSuperGroupMember(ctx context.Context, groupID string, userIDs []string) error
2023-01-29 18:13:02 +08:00
AddUserToSuperGroup(ctx context.Context, groupID string, userIDs []string) error
2023-01-28 13:19:36 +08:00
GetSuperGroupByID(ctx context.Context, groupID string) (superGroup *unrelation.SuperGroup, err error)
}
2023-01-29 18:37:38 +08:00
var _ GroupInterface = (*GroupController)(nil)
2023-01-28 13:19:36 +08:00
type GroupController struct {
2023-01-29 17:20:31 +08:00
database GroupDataBaseInterface
2023-01-28 13:19:36 +08:00
}
2023-02-01 12:00:29 +08:00
func (g *GroupController) TakeGroupMemberByID(ctx context.Context, groupID string, userID string) (groupMember *relation.GroupMember, err error) {
//TODO implement me
panic("implement me")
}
func (g *GroupController) FindGroupMembersByID(ctx context.Context, groupID string, userIDs []string) (groups []*relation.GroupMember, err error) {
//TODO implement me
panic("implement me")
}
func (g *GroupController) DelGroupMember(ctx context.Context, groupID string, userIDs []string) error {
//TODO implement me
panic("implement me")
}
func (g *GroupController) GetGroupRecvApplicationList(ctx context.Context, userID string) ([]*relation.GroupRequest, error) {
/*
var groupRequestList []db.GroupRequest
memberList, err := GetGroupMemberListByUserID(userID)
if err != nil {
return nil, err
}
for _, v := range memberList {
if v.RoleLevel > constant.GroupOrdinaryUsers {
list, err := GetGroupRequestByGroupID(v.GroupID)
if err != nil {
// fmt.Println("111 GetGroupRequestByGroupID failed ", err.Error())
continue
}
// fmt.Println("222 GetGroupRequestByGroupID ok ", list)
groupRequestList = append(groupRequestList, list...)
// fmt.Println("333 GetGroupRequestByGroupID ok ", groupRequestList)
}
}
return groupRequestList, nil
*/
//TODO implement me
panic("implement me")
}
func (g *GroupController) DelSuperGroupMember(ctx context.Context, groupID string, userIDs []string) error {
//TODO implement me
panic("implement me")
}
2023-01-29 18:37:38 +08:00
func (g *GroupController) GetJoinedGroupList(ctx context.Context, userID string) ([]*relation.Group, error) {
//TODO implement me
panic("implement me")
}
func (g *GroupController) GetGroupMemberList(ctx context.Context, groupID string) ([]*relation.GroupMember, error) {
//TODO implement me
panic("implement me")
}
func (g *GroupController) GetGroupMemberListByUserID(ctx context.Context, groupID string, userIDs []string) ([]*relation.GroupMember, error) {
//TODO implement me
panic("implement me")
}
func (g *GroupController) GetGroupMemberFilterList(ctx context.Context, groupID string, filter int32, begin int32, maxNumber int32) ([]*relation.GroupMember, error) {
//TODO implement me
panic("implement me")
}
func (g *GroupController) GetGroupMemberNum(ctx context.Context, groupIDs []string) (map[string]int, error) {
//TODO implement me
panic("implement me")
}
func (g *GroupController) GetGroupOwnerUserID(ctx context.Context, groupIDs []string) (map[string]string, error) {
//TODO implement me
panic("implement me")
}
func (g *GroupController) CreateGroupMember(ctx context.Context, groupMember []*relation.GroupMember) error {
//TODO implement me
panic("implement me")
}
func (g *GroupController) CreateGroupRequest(ctx context.Context, requests []*relation.GroupRequest) error {
//TODO implement me
panic("implement me")
}
func (g *GroupController) AddUserToSuperGroup(ctx context.Context, groupID string, userIDs []string) error {
//TODO implement me
panic("implement me")
}
2023-01-31 18:55:22 +08:00
func NewGroupController(db *gorm.DB, rdb redis.UniversalClient, mgoClient *mongo.Client) GroupInterface {
groupController := &GroupController{database: newGroupDatabase(db, rdb, mgoClient)}
2023-01-28 13:19:36 +08:00
return groupController
}
func (g *GroupController) FindGroupsByID(ctx context.Context, groupIDs []string) (groups []*relation.Group, err error) {
2023-01-28 18:01:33 +08:00
return g.database.FindGroupsByID(ctx, groupIDs)
2023-01-28 13:19:36 +08:00
}
2023-01-29 14:51:59 +08:00
func (g *GroupController) CreateGroup(ctx context.Context, groups []*relation.Group, groupMember []*relation.GroupMember) error {
return g.database.CreateGroup(ctx, groups, groupMember)
2023-01-28 13:19:36 +08:00
}
func (g *GroupController) DeleteGroupByIDs(ctx context.Context, groupIDs []string) error {
2023-01-28 18:01:33 +08:00
return g.database.DeleteGroupByIDs(ctx, groupIDs)
2023-01-28 13:19:36 +08:00
}
func (g *GroupController) TakeGroupByID(ctx context.Context, groupID string) (group *relation.Group, err error) {
2023-01-28 18:01:33 +08:00
return g.database.TakeGroupByID(ctx, groupID)
2023-01-28 13:19:36 +08:00
}
func (g *GroupController) GetSuperGroupByID(ctx context.Context, groupID string) (superGroup *unrelation.SuperGroup, err error) {
2023-01-28 18:01:33 +08:00
return g.database.GetSuperGroupByID(ctx, groupID)
2023-01-28 13:19:36 +08:00
}
2023-01-29 14:51:59 +08:00
func (g *GroupController) CreateSuperGroup(ctx context.Context, groupID string, initMemberIDList []string) error {
return g.database.CreateSuperGroup(ctx, groupID, initMemberIDList)
2023-01-28 17:09:20 +08:00
}
2023-01-29 17:20:31 +08:00
type GroupDataBaseInterface interface {
2023-01-28 18:01:33 +08:00
FindGroupsByID(ctx context.Context, groupIDs []string) (groups []*relation.Group, err error)
2023-01-29 14:51:59 +08:00
CreateGroup(ctx context.Context, groups []*relation.Group, groupMember []*relation.GroupMember) error
2023-01-28 18:01:33 +08:00
DeleteGroupByIDs(ctx context.Context, groupIDs []string) error
TakeGroupByID(ctx context.Context, groupID string) (group *relation.Group, err error)
GetSuperGroupByID(ctx context.Context, groupID string) (superGroup *unrelation.SuperGroup, err error)
2023-01-29 14:51:59 +08:00
CreateSuperGroup(ctx context.Context, groupID string, initMemberIDList []string) error
2023-01-28 13:19:36 +08:00
}
type GroupDataBase struct {
2023-01-29 10:31:01 +08:00
groupDB *relation.Group
groupMemberDB *relation.GroupMember
groupRequestDB *relation.GroupRequest
2023-01-29 11:15:16 +08:00
db *gorm.DB
2023-01-29 10:31:01 +08:00
2023-01-28 13:19:36 +08:00
cache *cache.GroupCache
2023-01-28 16:36:38 +08:00
mongoDB *unrelation.SuperGroupMgoDB
2023-01-28 13:19:36 +08:00
}
2023-01-31 18:55:22 +08:00
func newGroupDatabase(db *gorm.DB, rdb redis.UniversalClient, mgoClient *mongo.Client) GroupDataBaseInterface {
2023-01-29 10:31:01 +08:00
groupDB := relation.NewGroupDB(db)
groupMemberDB := relation.NewGroupMemberDB(db)
groupRequestDB := relation.NewGroupRequest(db)
2023-01-29 11:15:16 +08:00
newDB := db
2023-01-31 18:55:22 +08:00
superGroupMgoDB := unrelation.NewSuperGroupMgoDB(mgoClient)
2023-01-28 13:19:36 +08:00
database := &GroupDataBase{
2023-01-29 10:31:01 +08:00
groupDB: groupDB,
groupMemberDB: groupMemberDB,
groupRequestDB: groupRequestDB,
2023-01-29 11:15:16 +08:00
db: newDB,
2023-01-31 18:55:22 +08:00
cache: cache.NewGroupCache(rdb, groupDB, groupMemberDB, groupRequestDB, superGroupMgoDB, rockscache.Options{
2023-01-28 13:19:36 +08:00
RandomExpireAdjustment: 0.2,
DisableCacheRead: false,
DisableCacheDelete: false,
StrongConsistency: true,
}),
2023-01-31 18:55:22 +08:00
mongoDB: superGroupMgoDB,
2023-01-28 13:19:36 +08:00
}
return database
}
2023-01-28 18:01:33 +08:00
func (g *GroupDataBase) FindGroupsByID(ctx context.Context, groupIDs []string) (groups []*relation.Group, err error) {
2023-01-29 10:31:01 +08:00
return g.cache.GetGroupsInfo(ctx, groupIDs)
2023-01-28 13:19:36 +08:00
}
2023-01-30 15:41:30 +08:00
func (g *GroupDataBase) CreateGroup(ctx context.Context, groups []*relation.Group, groupMembers []*relation.GroupMember) error {
2023-01-29 14:51:59 +08:00
return g.db.Transaction(func(tx *gorm.DB) error {
2023-01-30 15:41:30 +08:00
if len(groups) > 0 {
if err := g.groupDB.Create(ctx, groups, tx); err != nil {
return err
}
2023-01-29 14:51:59 +08:00
}
2023-01-30 15:41:30 +08:00
if len(groupMembers) > 0 {
if err := g.groupMemberDB.Create(ctx, groupMembers, tx); err != nil {
2023-01-29 14:51:59 +08:00
return err
}
}
return nil
})
2023-01-28 13:19:36 +08:00
}
2023-01-28 18:01:33 +08:00
func (g *GroupDataBase) DeleteGroupByIDs(ctx context.Context, groupIDs []string) error {
2023-01-29 10:31:01 +08:00
return g.groupDB.DB.Transaction(func(tx *gorm.DB) error {
if err := g.groupDB.Delete(ctx, groupIDs, tx); err != nil {
2023-01-28 13:19:36 +08:00
return err
}
2023-01-29 10:31:01 +08:00
if err := g.cache.DelGroupsInfo(ctx, groupIDs); err != nil {
2023-01-28 13:19:36 +08:00
return err
}
return nil
})
}
2023-01-28 18:01:33 +08:00
func (g *GroupDataBase) TakeGroupByID(ctx context.Context, groupID string) (group *relation.Group, err error) {
2023-01-29 10:31:01 +08:00
return g.cache.GetGroupInfo(ctx, groupID)
2023-01-28 13:19:36 +08:00
}
func (g *GroupDataBase) Update(ctx context.Context, groups []*relation.Group) error {
2023-01-29 11:15:16 +08:00
return g.db.Transaction(func(tx *gorm.DB) error {
2023-01-29 10:31:01 +08:00
if err := g.groupDB.Update(ctx, groups, tx); err != nil {
2023-01-28 13:19:36 +08:00
return err
}
var groupIDs []string
for _, group := range groups {
groupIDs = append(groupIDs, group.GroupID)
}
2023-01-29 10:31:01 +08:00
if err := g.cache.DelGroupsInfo(ctx, groupIDs); err != nil {
2023-01-28 13:19:36 +08:00
return err
}
return nil
})
}
2023-01-29 15:23:14 +08:00
func (g *GroupDataBase) GetJoinedGroupList(ctx context.Context, userID string) ([]*relation.Group, error) {
return nil, nil
}
2023-01-29 14:51:59 +08:00
func (g *GroupDataBase) CreateSuperGroup(ctx context.Context, groupID string, initMemberIDList []string) error {
2023-01-29 11:15:16 +08:00
sess, err := g.mongoDB.MgoClient.StartSession()
if err != nil {
return err
}
defer sess.EndSession(ctx)
sCtx := mongo.NewSessionContext(ctx, sess)
2023-01-29 14:51:59 +08:00
if err = g.mongoDB.CreateSuperGroup(sCtx, groupID, initMemberIDList); err != nil {
2023-01-29 11:15:16 +08:00
_ = sess.AbortTransaction(ctx)
return err
}
2023-01-31 18:55:22 +08:00
if err = g.cache.BatchDelJoinedSuperGroupIDs(ctx, initMemberIDList); err != nil {
2023-01-29 11:15:16 +08:00
_ = sess.AbortTransaction(ctx)
return err
}
return sess.CommitTransaction(ctx)
2023-01-28 17:09:20 +08:00
}
2023-01-28 18:01:33 +08:00
func (g *GroupDataBase) GetSuperGroupByID(ctx context.Context, groupID string) (superGroup *unrelation.SuperGroup, err error) {
2023-01-28 13:19:36 +08:00
return g.mongoDB.GetSuperGroup(ctx, groupID)
}