This commit is contained in:
withchao 2023-01-29 11:22:37 +08:00
parent ebd329558c
commit 4e10b361ed
3 changed files with 50 additions and 28 deletions

View File

@ -166,6 +166,9 @@ func (s *groupServer) CreateGroup(ctx context.Context, req *pbGroup.CreateGroupR
if err := callbackBeforeCreateGroup(ctx, req); err != nil { if err := callbackBeforeCreateGroup(ctx, req); err != nil {
return nil, err return nil, err
} }
var groupInfo relation.Group
utils.CopyStructFields(&groupInfo, req.GroupInfo)
groupInfo, err := (&cp.PBGroup{req.GroupInfo}).Convert() groupInfo, err := (&cp.PBGroup{req.GroupInfo}).Convert()
groupInfo.GroupID = genGroupID(ctx, req.GroupInfo.GroupID) groupInfo.GroupID = genGroupID(ctx, req.GroupInfo.GroupID)
if req.GroupInfo.GroupType != constant.SuperGroup { if req.GroupInfo.GroupType != constant.SuperGroup {

View File

@ -60,16 +60,21 @@ type DataBase interface {
} }
type GroupDataBase struct { type GroupDataBase struct {
sqlDB *relation.Group groupDB *relation.Group
cache *cache.GroupCache groupMemberDB *relation.GroupMember
mongoDB *unrelation.SuperGroupMgoDB cache *cache.GroupCache
db *gorm.DB
mongoDB *unrelation.SuperGroupMgoDB
} }
func newGroupDatabase(db *gorm.DB, rdb redis.UniversalClient, mgoDB *mongo.Database) DataBase { func newGroupDatabase(db *gorm.DB, rdb redis.UniversalClient, mgoDB *mongo.Database) DataBase {
sqlDB := relation.NewGroupDB(db) group := relation.NewGroupDB(db)
groupMember := relation.NewGroupMemberDB(db)
database := &GroupDataBase{ database := &GroupDataBase{
sqlDB: sqlDB, groupDB: group,
cache: cache.NewGroupCache(rdb, sqlDB, rockscache.Options{ groupMemberDB: groupMember,
db: db,
cache: cache.NewGroupCache(rdb, group, rockscache.Options{
RandomExpireAdjustment: 0.2, RandomExpireAdjustment: 0.2,
DisableCacheRead: false, DisableCacheRead: false,
DisableCacheDelete: false, DisableCacheDelete: false,
@ -85,12 +90,12 @@ func (g *GroupDataBase) FindGroupsByID(ctx context.Context, groupIDs []string) (
} }
func (g *GroupDataBase) CreateGroup(ctx context.Context, groups []*relation.Group) error { func (g *GroupDataBase) CreateGroup(ctx context.Context, groups []*relation.Group) error {
return g.sqlDB.Create(ctx, groups) return g.groupDB.Create(ctx, groups)
} }
func (g *GroupDataBase) DeleteGroupByIDs(ctx context.Context, groupIDs []string) error { func (g *GroupDataBase) DeleteGroupByIDs(ctx context.Context, groupIDs []string) error {
return g.sqlDB.DB.Transaction(func(tx *gorm.DB) error { return g.groupDB.DB.Transaction(func(tx *gorm.DB) error {
if err := g.sqlDB.Delete(ctx, groupIDs, tx); err != nil { if err := g.groupDB.Delete(ctx, groupIDs, tx); err != nil {
return err return err
} }
if err := g.cache.DelGroupsInfoFromCache(ctx, groupIDs); err != nil { if err := g.cache.DelGroupsInfoFromCache(ctx, groupIDs); err != nil {
@ -105,8 +110,8 @@ func (g *GroupDataBase) TakeGroupByID(ctx context.Context, groupID string) (grou
} }
func (g *GroupDataBase) Update(ctx context.Context, groups []*relation.Group) error { func (g *GroupDataBase) Update(ctx context.Context, groups []*relation.Group) error {
return g.sqlDB.DB.Transaction(func(tx *gorm.DB) error { return g.groupDB.DB.Transaction(func(tx *gorm.DB) error {
if err := g.sqlDB.Update(ctx, groups, tx); err != nil { if err := g.groupDB.Update(ctx, groups, tx); err != nil {
return err return err
} }
var groupIDs []string var groupIDs []string
@ -123,3 +128,15 @@ func (g *GroupDataBase) Update(ctx context.Context, groups []*relation.Group) er
func (g *GroupDataBase) GetSuperGroupByID(ctx context.Context, groupID string) (superGroup *unrelation.SuperGroup, err error) { func (g *GroupDataBase) GetSuperGroupByID(ctx context.Context, groupID string) (superGroup *unrelation.SuperGroup, err error) {
return g.mongoDB.GetSuperGroup(ctx, groupID) return g.mongoDB.GetSuperGroup(ctx, groupID)
} }
func (g *GroupDataBase) CreateGroupAndMember(ctx context.Context, groups []*relation.Group, groupMember []*relation.GroupMember) error {
return g.db.Transaction(func(tx *gorm.DB) error {
if err := g.groupDB.Create(ctx, groups, tx); err != nil {
return err
}
if err := g.groupMemberDB.Create(ctx, groupMember, tx); err != nil {
return err
}
return nil
})
}

View File

@ -24,36 +24,40 @@ type GroupMember struct {
OperatorUserID string `gorm:"column:operator_user_id;size:64"` OperatorUserID string `gorm:"column:operator_user_id;size:64"`
MuteEndTime time.Time `gorm:"column:mute_end_time"` MuteEndTime time.Time `gorm:"column:mute_end_time"`
Ex string `gorm:"column:ex;size:1024"` Ex string `gorm:"column:ex;size:1024"`
DB *gorm.DB DB *gorm.DB `gorm:"-" json:"-"`
} }
func (g *GroupMember) Create(ctx context.Context, groupMemberList []*GroupMember) (err error) { func NewGroupMemberDB(db *gorm.DB) *GroupMember {
return &GroupMember{DB: db}
}
func (g *GroupMember) Create(ctx context.Context, groupMemberList []*GroupMember, tx ...*gorm.DB) (err error) {
defer func() { defer func() {
trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMemberList", groupMemberList) trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMemberList", groupMemberList)
}() }()
return utils.Wrap(GroupMemberDB.Create(&groupMemberList).Error, "") return utils.Wrap(getDBConn(g.DB, tx).Create(&groupMemberList).Error, "")
} }
func (g *GroupMember) Delete(ctx context.Context, groupMembers []*GroupMember) (err error) { func (g *GroupMember) Delete(ctx context.Context, groupMembers []*GroupMember, tx ...*gorm.DB) (err error) {
defer func() { defer func() {
trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMembers", groupMembers) trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMembers", groupMembers)
}() }()
return utils.Wrap(GroupMemberDB.Delete(groupMembers).Error, "") return utils.Wrap(getDBConn(g.DB, tx).Delete(groupMembers).Error, "")
} }
func (g *GroupMember) UpdateByMap(ctx context.Context, groupID string, userID string, args map[string]interface{}) (err error) { func (g *GroupMember) UpdateByMap(ctx context.Context, groupID string, userID string, args map[string]interface{}, tx ...*gorm.DB) (err error) {
defer func() { defer func() {
trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupID", groupID, "userID", userID, "args", args) trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupID", groupID, "userID", userID, "args", args)
}() }()
return utils.Wrap(GroupMemberDB.Model(&GroupMember{}).Where("group_id = ? and user_id = ?", groupID, userID).Updates(args).Error, "") return utils.Wrap(getDBConn(g.DB, tx).Model(&GroupMember{}).Where("group_id = ? and user_id = ?", groupID, userID).Updates(args).Error, "")
} }
func (g *GroupMember) Update(ctx context.Context, groupMembers []*GroupMember) (err error) { func (g *GroupMember) Update(ctx context.Context, groupMembers []*GroupMember, tx ...*gorm.DB) (err error) {
defer func() { trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMembers", groupMembers) }() defer func() { trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMembers", groupMembers) }()
return utils.Wrap(GroupMemberDB.Updates(&groupMembers).Error, "") return utils.Wrap(getDBConn(g.DB, tx).Updates(&groupMembers).Error, "")
} }
func (g *GroupMember) Find(ctx context.Context, groupMembers []*GroupMember) (groupList []*GroupMember, err error) { func (g *GroupMember) Find(ctx context.Context, groupMembers []*GroupMember, tx ...*gorm.DB) (groupList []*GroupMember, err error) {
defer func() { defer func() {
trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMembers", groupMembers, "groupList", groupList) trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupMembers", groupMembers, "groupList", groupList)
}() }()
@ -61,25 +65,23 @@ func (g *GroupMember) Find(ctx context.Context, groupMembers []*GroupMember) (gr
for _, groupMember := range groupMembers { for _, groupMember := range groupMembers {
where = append(where, []interface{}{groupMember.GroupID, groupMember.UserID}) where = append(where, []interface{}{groupMember.GroupID, groupMember.UserID})
} }
err = utils.Wrap(GroupMemberDB.Where("(group_id, user_id) in ?", where).Find(&groupList).Error, "") return groupList, utils.Wrap(getDBConn(g.DB, tx).Where("(group_id, user_id) in ?", where).Find(&groupList).Error, "")
return groupList, err
} }
func (g *GroupMember) Take(ctx context.Context, groupID string, userID string) (groupMember *GroupMember, err error) { func (g *GroupMember) Take(ctx context.Context, groupID string, userID string, tx ...*gorm.DB) (groupMember *GroupMember, err error) {
defer func() { defer func() {
trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupID", groupID, "userID", userID, "groupMember", *groupMember) trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupID", groupID, "userID", userID, "groupMember", *groupMember)
}() }()
groupMember = &GroupMember{} groupMember = &GroupMember{}
return groupMember, utils.Wrap(GroupMemberDB.Where("group_id = ? and user_id = ?", groupID, userID).Take(groupMember).Error, "") return groupMember, utils.Wrap(getDBConn(g.DB, tx).Where("group_id = ? and user_id = ?", groupID, userID).Take(groupMember).Error, "")
} }
func (g *GroupMember) TakeOwnerInfo(ctx context.Context, groupID string) (groupMember *GroupMember, err error) { func (g *GroupMember) TakeOwnerInfo(ctx context.Context, groupID string, tx ...*gorm.DB) (groupMember *GroupMember, err error) {
defer func() { defer func() {
trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupID", groupID, "groupMember", *groupMember) trace_log.SetCtxDebug(ctx, utils.GetFuncName(1), err, "groupID", groupID, "groupMember", *groupMember)
}() }()
groupMember = &GroupMember{} groupMember = &GroupMember{}
err = GroupMemberDB.Where("group_id = ? and role_level = ?", groupID, constant.GroupOwner).Take(groupMember).Error return groupMember, utils.Wrap(getDBConn(g.DB, tx).Where("group_id = ? and role_level = ?", groupID, constant.GroupOwner).Take(groupMember).Error, "")
return groupMember, utils.Wrap(err, "")
} }
func InsertIntoGroupMember(toInsertInfo GroupMember) error { func InsertIntoGroupMember(toInsertInfo GroupMember) error {