From 3423b224fd8d9d622c6532e1144ee2859182c302 Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Wed, 8 Feb 2023 15:25:25 +0800 Subject: [PATCH] group db --- pkg/common/db/controller/group.go | 62 ++++++------------- .../db/relation/group_member_model_k.go | 46 +++++++++----- pkg/common/db/relation/group_model_k.go | 6 +- pkg/common/db/relation/utils.go | 22 ++++++- 4 files changed, 72 insertions(+), 64 deletions(-) diff --git a/pkg/common/db/controller/group.go b/pkg/common/db/controller/group.go index c402fea81..e03cff015 100644 --- a/pkg/common/db/controller/group.go +++ b/pkg/common/db/controller/group.go @@ -1,6 +1,7 @@ package controller import ( + "Open_IM/pkg/common/constant" "Open_IM/pkg/common/db/cache" "Open_IM/pkg/common/db/relation" relation2 "Open_IM/pkg/common/db/table/relation" @@ -9,6 +10,8 @@ import ( "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" ) @@ -66,7 +69,7 @@ type GroupDataBaseInterface interface { TakeGroupOwner(ctx context.Context, groupID string) (*relation2.GroupMemberModel, error) FindGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32) ([]*relation2.GroupMemberModel, error) PageGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (int32, []*relation2.GroupMemberModel, error) - SearchGroupMember(ctx context.Context, name string, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (int32, []*relation2.GroupMemberModel, error) + SearchGroupMember(ctx context.Context, keyword string, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (int32, []*relation2.GroupMemberModel, error) HandlerGroupRequest(ctx context.Context, groupID string, userID string, handledMsg string, handleResult int32, member *relation2.GroupMemberModel) error DeleteGroupMember(ctx context.Context, groupID string, userIDs []string) error MapGroupHash(ctx context.Context, groupIDs []string) (map[string]uint64, error) @@ -109,26 +112,6 @@ func newGroupDatabase(db *gorm.DB, rdb redis.UniversalClient, mgoClient *mongo.C return database } -//func (g *GroupDataBase) FindGroupsByID(ctx context.Context, groupIDs []string) (groups []*relation2.GroupModel, err error) { -// return g.cache.GetGroupsInfo(ctx, groupIDs) -//} -// -//func (g *GroupDataBase) CreateGroup(ctx context.Context, groups []*relation2.GroupModel, groupMembers []*relation2.GroupMemberModel) error { -// return g.db.Transaction(func(tx *gorm.DB) error { -// if len(groups) > 0 { -// if err := g.groupDB.Create(ctx, groups, tx); err != nil { -// return err -// } -// } -// if len(groupMembers) > 0 { -// if err := g.groupMemberDB.Create(ctx, groupMembers, tx); err != nil { -// return err -// } -// } -// return nil -// }) -//} -// //func (g *GroupDataBase) DeleteGroupByIDs(ctx context.Context, groupIDs []string) error { // return g.groupDB.DB.Transaction(func(tx *gorm.DB) error { // if err := g.groupDB.Delete(ctx, groupIDs, tx); err != nil { @@ -308,53 +291,48 @@ func (g *GroupDataBase) CreateGroup(ctx context.Context, groups []*relation2.Gro } func (g *GroupDataBase) TakeGroup(ctx context.Context, groupID string) (group *relation2.GroupModel, err error) { - //TODO implement me - panic("implement me") + return g.groupDB.Take(ctx, groupID) } func (g *GroupDataBase) FindGroup(ctx context.Context, groupIDs []string) (groups []*relation2.GroupModel, err error) { - //TODO implement me - panic("implement me") + return g.groupDB.Find(ctx, groupIDs) } func (g *GroupDataBase) SearchGroup(ctx context.Context, keyword string, pageNumber, showNumber int32) (int32, []*relation2.GroupModel, error) { - //TODO implement me - panic("implement me") + return g.groupDB.Search(ctx, keyword, pageNumber, showNumber) } func (g *GroupDataBase) UpdateGroup(ctx context.Context, groupID string, data map[string]any) error { - //TODO implement me - panic("implement me") + return g.groupDB.UpdateMap(ctx, groupID, data) } func (g *GroupDataBase) DismissGroup(ctx context.Context, groupID string) error { - //TODO implement me - panic("implement me") + return g.db.Transaction(func(tx *gorm.DB) error { + if err := g.groupDB.UpdateStatus(ctx, groupID, constant.GroupStatusDismissed, tx); err != nil { + return err + } + return g.groupMemberDB.DeleteGroup(ctx, []string{groupID}, tx) + }) } func (g *GroupDataBase) TakeGroupMember(ctx context.Context, groupID string, userID string) (groupMember *relation2.GroupMemberModel, err error) { - //TODO implement me - panic("implement me") + return g.groupMemberDB.Take(ctx, groupID, userID) } func (g *GroupDataBase) TakeGroupOwner(ctx context.Context, groupID string) (*relation2.GroupMemberModel, error) { - //TODO implement me - panic("implement me") + return g.groupMemberDB.TakeOwner(ctx, groupID) } func (g *GroupDataBase) FindGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32) ([]*relation2.GroupMemberModel, error) { - //TODO implement me - panic("implement me") + return g.groupMemberDB.Find(ctx, groupIDs, userIDs, roleLevels) } func (g *GroupDataBase) PageGroupMember(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (int32, []*relation2.GroupMemberModel, error) { - //TODO implement me - panic("implement me") + return g.groupMemberDB.SearchMember(ctx, "", groupIDs, userIDs, roleLevels, pageNumber, showNumber) } -func (g *GroupDataBase) SearchGroupMember(ctx context.Context, name string, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (int32, []*relation2.GroupMemberModel, error) { - //TODO implement me - panic("implement me") +func (g *GroupDataBase) SearchGroupMember(ctx context.Context, keyword string, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32) (int32, []*relation2.GroupMemberModel, error) { + return g.groupMemberDB.SearchMember(ctx, keyword, groupIDs, userIDs, roleLevels, pageNumber, showNumber) } func (g *GroupDataBase) HandlerGroupRequest(ctx context.Context, groupID string, userID string, handledMsg string, handleResult int32, member *relation2.GroupMemberModel) error { diff --git a/pkg/common/db/relation/group_member_model_k.go b/pkg/common/db/relation/group_member_model_k.go index e137464b7..4bf36c90d 100644 --- a/pkg/common/db/relation/group_member_model_k.go +++ b/pkg/common/db/relation/group_member_model_k.go @@ -50,17 +50,34 @@ func (g *GroupMemberGorm) Update(ctx context.Context, groupMembers []*relation.G return utils.Wrap(getDBConn(g.DB, tx).Updates(&groupMembers).Error, "") } -func (g *GroupMemberGorm) Find(ctx context.Context, groupMembers []*relation.GroupMemberModel, tx ...*gorm.DB) (groupList []*relation.GroupMemberModel, err error) { +func (g *GroupMemberGorm) Find(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32, tx ...*gorm.DB) (groupList []*relation.GroupMemberModel, err error) { defer func() { - tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMembers", groupMembers, "groupList", groupList) + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupIDs", groupIDs, "userIDs", userIDs, "groupList", groupList) }() - var where [][]interface{} - for _, groupMember := range groupMembers { - where = append(where, []interface{}{groupMember.GroupID, groupMember.UserID}) + db := getDBConn(g.DB, tx) + if len(groupIDs) > 0 { + db = db.Where("group_id in (?)", groupIDs) } - return groupList, utils.Wrap(getDBConn(g.DB, tx).Where("(group_id, user_id) in ?", where).Find(&groupList).Error, "") + if len(userIDs) > 0 { + db = db.Where("user_id in (?)", userIDs) + } + if len(roleLevels) > 0 { + db = db.Where("role_level in (?)", roleLevels) + } + return groupList, utils.Wrap(db.Find(&groupList).Error, "") } +//func (g *GroupMemberGorm) Find(ctx context.Context, groupMembers []*relation.GroupMemberModel, tx ...*gorm.DB) (groupList []*relation.GroupMemberModel, err error) { +// defer func() { +// tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMembers", groupMembers, "groupList", groupList) +// }() +// var where [][]interface{} +// for _, groupMember := range groupMembers { +// where = append(where, []interface{}{groupMember.GroupID, groupMember.UserID}) +// } +// return groupList, utils.Wrap(getDBConn(g.DB, tx).Where("(group_id, user_id) in ?", where).Find(&groupList).Error, "") +//} + func (g *GroupMemberGorm) FindGroupUser(ctx context.Context, groupIDs []string, userIDs []string, roleLevels []int32, tx ...*gorm.DB) (groupList []*relation.GroupMemberModel, err error) { defer func() { tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupIDs", groupIDs, "userIDs", userIDs, "groupList", groupList) @@ -94,16 +111,13 @@ func (g *GroupMemberGorm) TakeOwner(ctx context.Context, groupID string, tx ...* return groupMember, utils.Wrap(getDBConn(g.DB, tx).Where("group_id = ? and role_level = ?", groupID, constant.GroupOwner).Take(groupMember).Error, "") } -func (g *GroupMemberGorm) PageByUser(ctx context.Context, userID string, pageNumber, showNumber int32, tx ...*gorm.DB) (total int32, groupList []*relation.GroupMemberModel, err error) { +func (g *GroupMemberGorm) SearchMember(ctx context.Context, keyword string, groupIDs []string, userIDs []string, roleLevels []int32, pageNumber, showNumber int32, tx ...*gorm.DB) (total int32, groupList []*relation.GroupMemberModel, err error) { defer func() { - tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "userID", userID, "total", total, "groupList", groupList) + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "keyword", keyword, "groupIDs", groupIDs, "userIDs", userIDs, "roleLevels", roleLevels, "pageNumber", pageNumber, "showNumber", showNumber, "total", total, "groupList", groupList) }() - return gormPage[relation.GroupMemberModel](getDBConn(g.DB, tx).Where("user_id = ?", userID), pageNumber, showNumber) -} - -func (g *GroupMemberGorm) SearchMember(ctx context.Context, groupID string, name string, pageNumber, showNumber int32, tx ...*gorm.DB) (total int32, groupList []*relation.GroupMemberModel, err error) { - defer func() { - tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupID", groupID, "name", name, "pageNumber", pageNumber, "showNumber", showNumber, "total", total, "groupList", groupList) - }() - return gormSearch[relation.GroupMemberModel](getDBConn(g.DB, tx).Where("group_id = ?", groupID), "nickname", name, pageNumber, showNumber) + db := getDBConn(g.DB, tx) + gormIn(&db, "group_id", groupIDs) + gormIn(&db, "user_id", userIDs) + gormIn(&db, "role_level", roleLevels) + return gormSearch[relation.GroupMemberModel](db, []string{"nickname"}, keyword, pageNumber, showNumber) } diff --git a/pkg/common/db/relation/group_model_k.go b/pkg/common/db/relation/group_model_k.go index 011632976..731c83fdd 100644 --- a/pkg/common/db/relation/group_model_k.go +++ b/pkg/common/db/relation/group_model_k.go @@ -66,9 +66,9 @@ func (g *GroupGorm) Take(ctx context.Context, groupID string, tx ...*gorm.DB) (g return group, utils.Wrap(getDBConn(g.DB, tx).Where("group_id = ?", groupID).Take(group).Error, "") } -func (g *GroupGorm) Search(ctx context.Context, name string, pageNumber, showNumber int32, tx ...*gorm.DB) (total int32, groups []*relation.GroupModel, err error) { +func (g *GroupGorm) Search(ctx context.Context, keyword string, pageNumber, showNumber int32, tx ...*gorm.DB) (total int32, groups []*relation.GroupModel, err error) { defer func() { - tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "name", name, "pageNumber", pageNumber, "showNumber", showNumber, "total", total, "groups", groups) + tracelog.SetCtxDebug(ctx, utils.GetFuncName(1), err, "keyword", keyword, "pageNumber", pageNumber, "showNumber", showNumber, "total", total, "groups", groups) }() - return gormSearch[relation.GroupModel](getDBConn(g.DB, tx), "name", name, pageNumber, showNumber) + return gormSearch[relation.GroupModel](getDBConn(g.DB, tx), []string{"name"}, keyword, pageNumber, showNumber) } diff --git a/pkg/common/db/relation/utils.go b/pkg/common/db/relation/utils.go index 89ccb6552..e025e089a 100644 --- a/pkg/common/db/relation/utils.go +++ b/pkg/common/db/relation/utils.go @@ -17,9 +17,25 @@ func gormPage[E any](db *gorm.DB, pageNumber, showNumber int32) (int32, []*E, er return int32(count), es, nil } -func gormSearch[E any](db *gorm.DB, field string, value string, pageNumber, showNumber int32) (int32, []*E, error) { - if field != "" && value != "" { - db = db.Where(field+" like ?", "%"+value+"%") +func gormSearch[E any](db *gorm.DB, fields []string, value string, pageNumber, showNumber int32) (int32, []*E, error) { + if len(fields) > 0 && value != "" { + value = "%" + value + "%" + if len(fields) == 1 { + db = db.Where(fields[0]+" like ?", value) + } else { + t := db + for _, field := range fields { + t = t.Or(field+" like ?", value) + } + db = db.Where(t) + } } return gormPage[E](db, pageNumber, showNumber) } + +func gormIn[E any](db **gorm.DB, field string, es []E) { + if len(es) == 0 { + return + } + *db = (*db).Where(field+" in (?)", es) +}