mirror of
https://github.com/openimsdk/open-im-server.git
synced 2025-11-05 03:42:08 +08:00
Merge branch 'list' into list
This commit is contained in:
commit
7821f5f265
@ -62,26 +62,28 @@ func (s *friendServer) GetIncrementalFriends(ctx context.Context, req *relation.
|
|||||||
if err := authverify.CheckAccessV3(ctx, req.UserID, s.config.Share.IMAdminUserID); err != nil {
|
if err := authverify.CheckAccessV3(ctx, req.UserID, s.config.Share.IMAdminUserID); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
opt := incrversion.Option[*relation.FriendInfo, relation.GetIncrementalFriendsResp]{
|
|
||||||
|
opt := incrversion.Option[*pbfriend.FriendInfo, pbfriend.GetIncrementalFriendsResp]{
|
||||||
|
Ctx: ctx,
|
||||||
|
VersionKey: req.UserID,
|
||||||
VersionID: req.VersionID,
|
VersionID: req.VersionID,
|
||||||
Version: func() (*model.VersionLog, error) {
|
VersionNumber: req.Version,
|
||||||
return s.friendDatabase.FindFriendIncrVersion(ctx, req.UserID, uint(req.Version), incrversion.Limit(s.config.RpcConfig.FriendSyncCount, req.Version))
|
SyncLimit: s.config.RpcConfig.FriendSyncCount,
|
||||||
},
|
Version: s.friendDatabase.FindFriendIncrVersion,
|
||||||
AllID: func() ([]string, error) {
|
CacheMaxVersion: s.friendDatabase.FindMaxFriendVersionCache,
|
||||||
return s.friendDatabase.FindSortFriendUserIDs(ctx, req.UserID)
|
SortID: s.friendDatabase.FindSortFriendUserIDs,
|
||||||
},
|
Find: func(ctx context.Context, ids []string) ([]*pbfriend.FriendInfo, error) {
|
||||||
Find: func(ids []string) ([]*relation.FriendInfo, error) {
|
|
||||||
friends, err := s.friendDatabase.FindFriendsWithError(ctx, req.UserID, ids)
|
friends, err := s.friendDatabase.FindFriendsWithError(ctx, req.UserID, ids)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return friendsDB2PB(friends), nil
|
return friendsDB2PB(friends), nil
|
||||||
},
|
},
|
||||||
ID: func(elem *relation.FriendInfo) string {
|
|
||||||
return elem.FriendUserID
|
ID: func(elem *pbfriend.FriendInfo) string { return elem.FriendUserID },
|
||||||
},
|
Resp: func(version *model.VersionLog, delIDs []string, list []*pbfriend.FriendInfo, full bool) *pbfriend.GetIncrementalFriendsResp {
|
||||||
Resp: func(version *model.VersionLog, delIDs []string, list []*relation.FriendInfo, full bool) *relation.GetIncrementalFriendsResp {
|
return &pbfriend.GetIncrementalFriendsResp{
|
||||||
return &relation.GetIncrementalFriendsResp{
|
|
||||||
VersionID: version.ID.Hex(),
|
VersionID: version.ID.Hex(),
|
||||||
Version: uint64(version.Version),
|
Version: uint64(version.Version),
|
||||||
Full: full,
|
Full: full,
|
||||||
@ -93,44 +95,3 @@ func (s *friendServer) GetIncrementalFriends(ctx context.Context, req *relation.
|
|||||||
}
|
}
|
||||||
return opt.Build()
|
return opt.Build()
|
||||||
}
|
}
|
||||||
|
|
||||||
//func (s *friendServer) GetIncrementalFriends(ctx context.Context, req *relation.GetIncrementalFriendsReq) (*relation.GetIncrementalFriendsResp, error) {
|
|
||||||
// if err := authverify.CheckAccessV3(ctx, req.UserID, s.config.Share.IMAdminUserID); err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// var limit int
|
|
||||||
// if req.Version > 0 {
|
|
||||||
// limit = s.config.RpcConfig.FriendSyncCount
|
|
||||||
// }
|
|
||||||
// incrVer, err := s.friendDatabase.FindFriendIncrVersion(ctx, req.UserID, uint(req.Version), limit)
|
|
||||||
// if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// var (
|
|
||||||
// deleteUserIDs []string
|
|
||||||
// changeUserIDs []string
|
|
||||||
// )
|
|
||||||
// if incrVer.Full() {
|
|
||||||
// changeUserIDs, err = s.friendDatabase.FindSortFriendUserIDs(ctx, req.UserID)
|
|
||||||
// if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// deleteUserIDs, changeUserIDs = incrVer.DeleteAndChangeIDs()
|
|
||||||
// }
|
|
||||||
// var friends []*model.Friend
|
|
||||||
// if len(changeUserIDs) > 0 {
|
|
||||||
// friends, err = s.friendDatabase.FindFriendsWithError(ctx, req.UserID, changeUserIDs)
|
|
||||||
// if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return &relation.GetIncrementalFriendsResp{
|
|
||||||
// Version: uint64(incrVer.Version),
|
|
||||||
// VersionID: incrVer.ID.Hex(),
|
|
||||||
// Full: incrVer.Full(),
|
|
||||||
// SyncCount: uint32(s.config.RpcConfig.FriendSyncCount),
|
|
||||||
// DeleteUserIds: deleteUserIDs,
|
|
||||||
// Changes: friendsDB2PB(friends),
|
|
||||||
// }, nil
|
|
||||||
//}
|
|
||||||
|
|||||||
@ -16,19 +16,18 @@ func (s *groupServer) SearchGroupMember(ctx context.Context, req *pbgroup.Search
|
|||||||
|
|
||||||
func (s *groupServer) GetIncrementalGroupMember(ctx context.Context, req *pbgroup.GetIncrementalGroupMemberReq) (*pbgroup.GetIncrementalGroupMemberResp, error) {
|
func (s *groupServer) GetIncrementalGroupMember(ctx context.Context, req *pbgroup.GetIncrementalGroupMemberReq) (*pbgroup.GetIncrementalGroupMemberResp, error) {
|
||||||
opt := incrversion.Option[*sdkws.GroupMemberFullInfo, pbgroup.GetIncrementalGroupMemberResp]{
|
opt := incrversion.Option[*sdkws.GroupMemberFullInfo, pbgroup.GetIncrementalGroupMemberResp]{
|
||||||
|
Ctx: ctx,
|
||||||
|
VersionKey: req.GroupID,
|
||||||
VersionID: req.VersionID,
|
VersionID: req.VersionID,
|
||||||
Version: func() (*model.VersionLog, error) {
|
VersionNumber: req.Version,
|
||||||
return s.db.FindMemberIncrVersion(ctx, req.GroupID, uint(req.Version), incrversion.Limit(s.config.RpcConfig.GroupSyncCount, req.Version))
|
SyncLimit: s.config.RpcConfig.GroupSyncCount,
|
||||||
},
|
Version: s.db.FindMemberIncrVersion,
|
||||||
AllID: func() ([]string, error) {
|
CacheMaxVersion: s.db.FindMaxGroupMemberVersionCache,
|
||||||
return s.db.FindSortGroupMemberUserIDs(ctx, req.GroupID)
|
SortID: s.db.FindSortGroupMemberUserIDs,
|
||||||
},
|
Find: func(ctx context.Context, ids []string) ([]*sdkws.GroupMemberFullInfo, error) {
|
||||||
Find: func(ids []string) ([]*sdkws.GroupMemberFullInfo, error) {
|
|
||||||
return s.getGroupMembersInfo(ctx, req.GroupID, ids)
|
return s.getGroupMembersInfo(ctx, req.GroupID, ids)
|
||||||
},
|
},
|
||||||
ID: func(elem *sdkws.GroupMemberFullInfo) string {
|
ID: func(elem *sdkws.GroupMemberFullInfo) string { return elem.UserID },
|
||||||
return elem.UserID
|
|
||||||
},
|
|
||||||
Resp: func(version *model.VersionLog, delIDs []string, list []*sdkws.GroupMemberFullInfo, full bool) *pbgroup.GetIncrementalGroupMemberResp {
|
Resp: func(version *model.VersionLog, delIDs []string, list []*sdkws.GroupMemberFullInfo, full bool) *pbgroup.GetIncrementalGroupMemberResp {
|
||||||
return &pbgroup.GetIncrementalGroupMemberResp{
|
return &pbgroup.GetIncrementalGroupMemberResp{
|
||||||
VersionID: version.ID.Hex(),
|
VersionID: version.ID.Hex(),
|
||||||
@ -48,19 +47,16 @@ func (s *groupServer) GetIncrementalJoinGroup(ctx context.Context, req *pbgroup.
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
opt := incrversion.Option[*sdkws.GroupInfo, pbgroup.GetIncrementalJoinGroupResp]{
|
opt := incrversion.Option[*sdkws.GroupInfo, pbgroup.GetIncrementalJoinGroupResp]{
|
||||||
|
Ctx: ctx,
|
||||||
|
VersionKey: req.UserID,
|
||||||
VersionID: req.VersionID,
|
VersionID: req.VersionID,
|
||||||
Version: func() (*model.VersionLog, error) {
|
VersionNumber: req.Version,
|
||||||
return s.db.FindJoinIncrVersion(ctx, req.UserID, uint(req.Version), incrversion.Limit(s.config.RpcConfig.GroupSyncCount, req.Version))
|
SyncLimit: s.config.RpcConfig.GroupSyncCount,
|
||||||
},
|
Version: s.db.FindJoinIncrVersion,
|
||||||
AllID: func() ([]string, error) {
|
CacheMaxVersion: s.db.FindMaxJoinGroupVersionCache,
|
||||||
return s.db.FindSortJoinGroupIDs(ctx, req.UserID)
|
SortID: s.db.FindSortJoinGroupIDs,
|
||||||
},
|
Find: s.getGroupsInfo,
|
||||||
Find: func(ids []string) ([]*sdkws.GroupInfo, error) {
|
ID: func(elem *sdkws.GroupInfo) string { return elem.GroupID },
|
||||||
return s.getGroupsInfo(ctx, ids)
|
|
||||||
},
|
|
||||||
ID: func(elem *sdkws.GroupInfo) string {
|
|
||||||
return elem.GroupID
|
|
||||||
},
|
|
||||||
Resp: func(version *model.VersionLog, delIDs []string, list []*sdkws.GroupInfo, full bool) *pbgroup.GetIncrementalJoinGroupResp {
|
Resp: func(version *model.VersionLog, delIDs []string, list []*sdkws.GroupInfo, full bool) *pbgroup.GetIncrementalJoinGroupResp {
|
||||||
return &pbgroup.GetIncrementalJoinGroupResp{
|
return &pbgroup.GetIncrementalJoinGroupResp{
|
||||||
VersionID: version.ID.Hex(),
|
VersionID: version.ID.Hex(),
|
||||||
|
|||||||
@ -1,38 +1,139 @@
|
|||||||
package incrversion
|
package incrversion
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
"github.com/openimsdk/open-im-server/v3/pkg/common/storage/model"
|
||||||
|
"github.com/openimsdk/tools/errs"
|
||||||
"github.com/openimsdk/tools/utils/datautil"
|
"github.com/openimsdk/tools/utils/datautil"
|
||||||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Limit(maxSync int, version uint64) int {
|
//func Limit(maxSync int, version uint64) int {
|
||||||
if version == 0 {
|
// if version == 0 {
|
||||||
return 0
|
// return 0
|
||||||
}
|
// }
|
||||||
return maxSync
|
// return maxSync
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
const (
|
||||||
|
tagQuery = iota + 1
|
||||||
|
tagFull
|
||||||
|
tageEqual
|
||||||
|
)
|
||||||
|
|
||||||
type Option[A, B any] struct {
|
type Option[A, B any] struct {
|
||||||
|
Ctx context.Context
|
||||||
|
VersionKey string
|
||||||
VersionID string
|
VersionID string
|
||||||
Version func() (*model.VersionLog, error)
|
VersionNumber uint64
|
||||||
AllID func() ([]string, error)
|
SyncLimit int
|
||||||
Find func(ids []string) ([]A, error)
|
CacheMaxVersion func(ctx context.Context, dId string) (*model.VersionLog, error)
|
||||||
|
Version func(ctx context.Context, dId string, version uint, limit int) (*model.VersionLog, error)
|
||||||
|
SortID func(ctx context.Context, dId string) ([]string, error)
|
||||||
|
Find func(ctx context.Context, ids []string) ([]A, error)
|
||||||
ID func(elem A) string
|
ID func(elem A) string
|
||||||
Resp func(version *model.VersionLog, delIDs []string, list []A, full bool) *B
|
Resp func(version *model.VersionLog, delIDs []string, list []A, full bool) *B
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *Option[A, B]) Build() (*B, error) {
|
func (o *Option[A, B]) newError(msg string) error {
|
||||||
version, err := o.Version()
|
return errs.ErrInternalServer.WrapMsg(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Option[A, B]) check() error {
|
||||||
|
if o.Ctx == nil {
|
||||||
|
return o.newError("opt ctx is nil")
|
||||||
|
}
|
||||||
|
if o.VersionKey == "" {
|
||||||
|
return o.newError("versionKey is empty")
|
||||||
|
}
|
||||||
|
if o.SyncLimit <= 0 {
|
||||||
|
return o.newError("invalid synchronization quantity")
|
||||||
|
}
|
||||||
|
if o.Version == nil {
|
||||||
|
return o.newError("func version is nil")
|
||||||
|
}
|
||||||
|
if o.SortID == nil {
|
||||||
|
return o.newError("func allID is nil")
|
||||||
|
}
|
||||||
|
if o.Find == nil {
|
||||||
|
return o.newError("func find is nil")
|
||||||
|
}
|
||||||
|
if o.ID == nil {
|
||||||
|
return o.newError("func id is nil")
|
||||||
|
}
|
||||||
|
if o.Resp == nil {
|
||||||
|
return o.newError("func resp is nil")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Option[A, B]) validVersion() bool {
|
||||||
|
objID, err := primitive.ObjectIDFromHex(o.VersionID)
|
||||||
|
return err == nil && (!objID.IsZero()) && o.VersionNumber > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Option[A, B]) equalID(objID primitive.ObjectID) bool {
|
||||||
|
return o.VersionID == objID.Hex()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Option[A, B]) getVersion(tag *int) (*model.VersionLog, error) {
|
||||||
|
if o.CacheMaxVersion == nil {
|
||||||
|
if o.validVersion() {
|
||||||
|
*tag = tagQuery
|
||||||
|
return o.Version(o.Ctx, o.VersionKey, uint(o.VersionNumber), o.SyncLimit)
|
||||||
|
}
|
||||||
|
*tag = tagFull
|
||||||
|
return o.Version(o.Ctx, o.VersionKey, 0, 0)
|
||||||
|
} else {
|
||||||
|
cache, err := o.CacheMaxVersion(o.Ctx, o.VersionKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
if !o.validVersion() {
|
||||||
|
*tag = tagFull
|
||||||
|
return cache, nil
|
||||||
|
}
|
||||||
|
if !o.equalID(cache.ID) {
|
||||||
|
*tag = tagFull
|
||||||
|
return cache, nil
|
||||||
|
}
|
||||||
|
if o.VersionNumber == uint64(cache.Version) {
|
||||||
|
*tag = tageEqual
|
||||||
|
return cache, nil
|
||||||
|
}
|
||||||
|
*tag = tagQuery
|
||||||
|
return o.Version(o.Ctx, o.VersionKey, uint(o.VersionNumber), o.SyncLimit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *Option[A, B]) Build() (*B, error) {
|
||||||
|
if err := o.check(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var tag int
|
||||||
|
version, err := o.getVersion(&tag)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var full bool
|
||||||
|
switch tag {
|
||||||
|
case tagQuery:
|
||||||
|
full = version.ID.Hex() != o.VersionID || uint64(version.Version) < o.VersionNumber || len(version.Logs) != version.LogLen
|
||||||
|
case tagFull:
|
||||||
|
full = true
|
||||||
|
case tageEqual:
|
||||||
|
full = false
|
||||||
|
default:
|
||||||
|
panic(fmt.Errorf("undefined tag %d", tag))
|
||||||
|
}
|
||||||
var (
|
var (
|
||||||
deleteIDs []string
|
deleteIDs []string
|
||||||
changeIDs []string
|
changeIDs []string
|
||||||
)
|
)
|
||||||
full := o.VersionID != version.ID.Hex() || version.Full()
|
//full := o.VersionID != version.ID.Hex() || version.Full()
|
||||||
if full {
|
if full {
|
||||||
changeIDs, err = o.AllID()
|
changeIDs, err = o.SortID(o.Ctx, o.VersionKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -41,7 +142,7 @@ func (o *Option[A, B]) Build() (*B, error) {
|
|||||||
}
|
}
|
||||||
var list []A
|
var list []A
|
||||||
if len(changeIDs) > 0 {
|
if len(changeIDs) > 0 {
|
||||||
list, err = o.Find(changeIDs)
|
list, err = o.Find(o.Ctx, changeIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
15
pkg/common/storage/cache/cachekey/friend.go
vendored
15
pkg/common/storage/cache/cachekey/friend.go
vendored
@ -14,14 +14,13 @@
|
|||||||
|
|
||||||
package cachekey
|
package cachekey
|
||||||
|
|
||||||
import "strconv"
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
FriendIDsKey = "FRIEND_IDS:"
|
FriendIDsKey = "FRIEND_IDS:"
|
||||||
TwoWayFriendsIDsKey = "COMMON_FRIENDS_IDS:"
|
TwoWayFriendsIDsKey = "COMMON_FRIENDS_IDS:"
|
||||||
FriendKey = "FRIEND_INFO:"
|
FriendKey = "FRIEND_INFO:"
|
||||||
IsFriendKey = "IS_FRIEND:" // local cache key
|
IsFriendKey = "IS_FRIEND:" // local cache key
|
||||||
FriendSyncSortUserIDsKey = "FRIEND_SYNC_SORT_USER_IDS:"
|
//FriendSyncSortUserIDsKey = "FRIEND_SYNC_SORT_USER_IDS:"
|
||||||
|
FriendMaxVersionKey = "FRIEND_MAX_VERSION:"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetFriendIDsKey(ownerUserID string) string {
|
func GetFriendIDsKey(ownerUserID string) string {
|
||||||
@ -36,10 +35,14 @@ func GetFriendKey(ownerUserID, friendUserID string) string {
|
|||||||
return FriendKey + ownerUserID + "-" + friendUserID
|
return FriendKey + ownerUserID + "-" + friendUserID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetFriendMaxVersionKey(ownerUserID string) string {
|
||||||
|
return FriendMaxVersionKey + ownerUserID
|
||||||
|
}
|
||||||
|
|
||||||
func GetIsFriendKey(possibleFriendUserID, userID string) string {
|
func GetIsFriendKey(possibleFriendUserID, userID string) string {
|
||||||
return IsFriendKey + possibleFriendUserID + "-" + userID
|
return IsFriendKey + possibleFriendUserID + "-" + userID
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetFriendSyncSortUserIDsKey(ownerUserID string, count int) string {
|
//func GetFriendSyncSortUserIDsKey(ownerUserID string, count int) string {
|
||||||
return FriendSyncSortUserIDsKey + strconv.Itoa(count) + ":" + ownerUserID
|
// return FriendSyncSortUserIDsKey + strconv.Itoa(count) + ":" + ownerUserID
|
||||||
}
|
//}
|
||||||
|
|||||||
10
pkg/common/storage/cache/cachekey/group.go
vendored
10
pkg/common/storage/cache/cachekey/group.go
vendored
@ -28,6 +28,8 @@ const (
|
|||||||
JoinedGroupsKey = "JOIN_GROUPS_KEY:"
|
JoinedGroupsKey = "JOIN_GROUPS_KEY:"
|
||||||
GroupMemberNumKey = "GROUP_MEMBER_NUM_CACHE:"
|
GroupMemberNumKey = "GROUP_MEMBER_NUM_CACHE:"
|
||||||
GroupRoleLevelMemberIDsKey = "GROUP_ROLE_LEVEL_MEMBER_IDS:"
|
GroupRoleLevelMemberIDsKey = "GROUP_ROLE_LEVEL_MEMBER_IDS:"
|
||||||
|
GroupMemberMaxVersionKey = "GROUP_MEMBER_MAX_VERSION:"
|
||||||
|
GroupJoinMaxVersionKey = "GROUP_JOIN_MAX_VERSION:"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetGroupInfoKey(groupID string) string {
|
func GetGroupInfoKey(groupID string) string {
|
||||||
@ -57,3 +59,11 @@ func GetGroupMemberNumKey(groupID string) string {
|
|||||||
func GetGroupRoleLevelMemberIDsKey(groupID string, roleLevel int32) string {
|
func GetGroupRoleLevelMemberIDsKey(groupID string, roleLevel int32) string {
|
||||||
return GroupRoleLevelMemberIDsKey + groupID + "-" + strconv.Itoa(int(roleLevel))
|
return GroupRoleLevelMemberIDsKey + groupID + "-" + strconv.Itoa(int(roleLevel))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetGroupMemberMaxVersionKey(groupID string) string {
|
||||||
|
return GroupMemberMaxVersionKey + groupID
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetJoinGroupMaxVersionKey(userID string) string {
|
||||||
|
return GroupJoinMaxVersionKey + userID
|
||||||
|
}
|
||||||
|
|||||||
8
pkg/common/storage/cache/friend.go
vendored
8
pkg/common/storage/cache/friend.go
vendored
@ -35,9 +35,13 @@ type FriendCache interface {
|
|||||||
|
|
||||||
DelOwner(friendUserID string, ownerUserIDs []string) FriendCache
|
DelOwner(friendUserID string, ownerUserIDs []string) FriendCache
|
||||||
|
|
||||||
DelSortFriendUserIDs(ownerUserIDs ...string) FriendCache
|
DelMaxFriendVersion(ownerUserIDs ...string) FriendCache
|
||||||
|
|
||||||
|
//DelSortFriendUserIDs(ownerUserIDs ...string) FriendCache
|
||||||
|
|
||||||
FindSortFriendUserIDs(ctx context.Context, ownerUserID string) ([]string, error)
|
FindSortFriendUserIDs(ctx context.Context, ownerUserID string) ([]string, error)
|
||||||
|
|
||||||
FindFriendIncrVersion(ctx context.Context, ownerUserID string, version uint, limit int) (*relationtb.VersionLog, error)
|
//FindFriendIncrVersion(ctx context.Context, ownerUserID string, version uint, limit int) (*relationtb.VersionLog, error)
|
||||||
|
|
||||||
|
FindMaxFriendVersion(ctx context.Context, ownerUserID string) (*relationtb.VersionLog, error)
|
||||||
}
|
}
|
||||||
|
|||||||
5
pkg/common/storage/cache/group.go
vendored
5
pkg/common/storage/cache/group.go
vendored
@ -62,4 +62,9 @@ type GroupCache interface {
|
|||||||
|
|
||||||
FindSortGroupMemberUserIDs(ctx context.Context, groupID string) ([]string, error)
|
FindSortGroupMemberUserIDs(ctx context.Context, groupID string) ([]string, error)
|
||||||
FindSortJoinGroupIDs(ctx context.Context, userID string) ([]string, error)
|
FindSortJoinGroupIDs(ctx context.Context, userID string) ([]string, error)
|
||||||
|
|
||||||
|
DelMaxGroupMemberVersion(groupIDs ...string) GroupCache
|
||||||
|
DelMaxJoinGroupVersion(userIDs ...string) GroupCache
|
||||||
|
FindMaxGroupMemberVersion(ctx context.Context, groupID string) (*model.VersionLog, error)
|
||||||
|
FindMaxJoinGroupVersion(ctx context.Context, userID string) (*model.VersionLog, error)
|
||||||
}
|
}
|
||||||
|
|||||||
55
pkg/common/storage/cache/redis/friend.go
vendored
55
pkg/common/storage/cache/redis/friend.go
vendored
@ -70,8 +70,12 @@ func (f *FriendCacheRedis) getFriendIDsKey(ownerUserID string) string {
|
|||||||
return cachekey.GetFriendIDsKey(ownerUserID)
|
return cachekey.GetFriendIDsKey(ownerUserID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FriendCacheRedis) getFriendSyncSortUserIDsKey(ownerUserID string) string {
|
//func (f *FriendCacheRedis) getFriendSyncSortUserIDsKey(ownerUserID string) string {
|
||||||
return cachekey.GetFriendSyncSortUserIDsKey(ownerUserID, f.syncCount)
|
// return cachekey.GetFriendSyncSortUserIDsKey(ownerUserID, f.syncCount)
|
||||||
|
//}
|
||||||
|
|
||||||
|
func (f *FriendCacheRedis) getFriendMaxVersionKey(ownerUserID string) string {
|
||||||
|
return cachekey.GetFriendMaxVersionKey(ownerUserID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// getTwoWayFriendsIDsKey returns the key for storing two-way friend IDs in the cache.
|
// getTwoWayFriendsIDsKey returns the key for storing two-way friend IDs in the cache.
|
||||||
@ -103,15 +107,15 @@ func (f *FriendCacheRedis) DelFriendIDs(ownerUserIDs ...string) cache.FriendCach
|
|||||||
return newFriendCache
|
return newFriendCache
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FriendCacheRedis) DelSortFriendUserIDs(ownerUserIDs ...string) cache.FriendCache {
|
//func (f *FriendCacheRedis) DelSortFriendUserIDs(ownerUserIDs ...string) cache.FriendCache {
|
||||||
newGroupCache := f.CloneFriendCache()
|
// newGroupCache := f.CloneFriendCache()
|
||||||
keys := make([]string, 0, len(ownerUserIDs))
|
// keys := make([]string, 0, len(ownerUserIDs))
|
||||||
for _, userID := range ownerUserIDs {
|
// for _, userID := range ownerUserIDs {
|
||||||
keys = append(keys, f.getFriendSyncSortUserIDsKey(userID))
|
// keys = append(keys, f.getFriendSyncSortUserIDsKey(userID))
|
||||||
}
|
// }
|
||||||
newGroupCache.AddKeys(keys...)
|
// newGroupCache.AddKeys(keys...)
|
||||||
return newGroupCache
|
// return newGroupCache
|
||||||
}
|
//}
|
||||||
|
|
||||||
// GetTwoWayFriendIDs retrieves two-way friend IDs from the cache.
|
// GetTwoWayFriendIDs retrieves two-way friend IDs from the cache.
|
||||||
func (f *FriendCacheRedis) GetTwoWayFriendIDs(ctx context.Context, ownerUserID string) (twoWayFriendIDs []string, err error) {
|
func (f *FriendCacheRedis) GetTwoWayFriendIDs(ctx context.Context, ownerUserID string) (twoWayFriendIDs []string, err error) {
|
||||||
@ -179,12 +183,29 @@ func (f *FriendCacheRedis) DelOwner(friendUserID string, ownerUserIDs []string)
|
|||||||
return newFriendCache
|
return newFriendCache
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FriendCacheRedis) FindSortFriendUserIDs(ctx context.Context, ownerUserID string) ([]string, error) {
|
func (f *FriendCacheRedis) DelMaxFriendVersion(ownerUserIDs ...string) cache.FriendCache {
|
||||||
return getCache(ctx, f.rcClient, f.getFriendSyncSortUserIDsKey(ownerUserID), f.expireTime, func(ctx context.Context) ([]string, error) {
|
newFriendCache := f.CloneFriendCache()
|
||||||
return f.friendDB.FindOwnerFriendUserIds(ctx, ownerUserID, f.syncCount)
|
for _, ownerUserID := range ownerUserIDs {
|
||||||
})
|
key := f.getFriendMaxVersionKey(ownerUserID)
|
||||||
|
newFriendCache.AddKeys(key) // Assuming AddKeys marks the keys for deletion
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FriendCacheRedis) FindFriendIncrVersion(ctx context.Context, ownerUserID string, version uint, limit int) (*model.VersionLog, error) {
|
return newFriendCache
|
||||||
return f.friendDB.FindIncrVersion(ctx, ownerUserID, version, limit)
|
}
|
||||||
|
|
||||||
|
func (f *FriendCacheRedis) FindSortFriendUserIDs(ctx context.Context, ownerUserID string) ([]string, error) {
|
||||||
|
userIDs, err := f.GetFriendIDs(ctx, ownerUserID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if len(userIDs) > f.syncCount {
|
||||||
|
userIDs = userIDs[:f.syncCount]
|
||||||
|
}
|
||||||
|
return userIDs, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *FriendCacheRedis) FindMaxFriendVersion(ctx context.Context, ownerUserID string) (*model.VersionLog, error) {
|
||||||
|
return getCache(ctx, f.rcClient, f.getFriendMaxVersionKey(ownerUserID), f.expireTime, func(ctx context.Context) (*model.VersionLog, error) {
|
||||||
|
return f.friendDB.FindIncrVersion(ctx, ownerUserID, 0, 0)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
50
pkg/common/storage/cache/redis/group.go
vendored
50
pkg/common/storage/cache/redis/group.go
vendored
@ -114,6 +114,14 @@ func (g *GroupCacheRedis) getGroupRoleLevelMemberIDsKey(groupID string, roleLeve
|
|||||||
return cachekey.GetGroupRoleLevelMemberIDsKey(groupID, roleLevel)
|
return cachekey.GetGroupRoleLevelMemberIDsKey(groupID, roleLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *GroupCacheRedis) getGroupMemberMaxVersionKey(groupID string) string {
|
||||||
|
return cachekey.GetGroupMemberMaxVersionKey(groupID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GroupCacheRedis) getJoinGroupMaxVersionKey(userID string) string {
|
||||||
|
return cachekey.GetJoinGroupMaxVersionKey(userID)
|
||||||
|
}
|
||||||
|
|
||||||
func (g *GroupCacheRedis) GetGroupIndex(group *model.Group, keys []string) (int, error) {
|
func (g *GroupCacheRedis) GetGroupIndex(group *model.Group, keys []string) (int, error) {
|
||||||
key := g.getGroupInfoKey(group.GroupID)
|
key := g.getGroupInfoKey(group.GroupID)
|
||||||
for i, _key := range keys {
|
for i, _key := range keys {
|
||||||
@ -249,9 +257,17 @@ func (g *GroupCacheRedis) DelGroupMemberIDs(groupID string) cache.GroupCache {
|
|||||||
return cache
|
return cache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *GroupCacheRedis) findUserJoinedGroupID(ctx context.Context, userID string) ([]string, error) {
|
||||||
|
groupIDs, err := g.groupMemberDB.FindUserJoinedGroupID(ctx, userID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return g.groupDB.FindJoinSortGroupID(ctx, groupIDs)
|
||||||
|
}
|
||||||
|
|
||||||
func (g *GroupCacheRedis) GetJoinedGroupIDs(ctx context.Context, userID string) (joinedGroupIDs []string, err error) {
|
func (g *GroupCacheRedis) GetJoinedGroupIDs(ctx context.Context, userID string) (joinedGroupIDs []string, err error) {
|
||||||
return getCache(ctx, g.rcClient, g.getJoinedGroupsKey(userID), g.expireTime, func(ctx context.Context) ([]string, error) {
|
return getCache(ctx, g.rcClient, g.getJoinedGroupsKey(userID), g.expireTime, func(ctx context.Context) ([]string, error) {
|
||||||
return g.groupMemberDB.FindUserJoinedGroupID(ctx, userID)
|
return g.findUserJoinedGroupID(ctx, userID)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,3 +447,35 @@ func (g *GroupCacheRedis) FindSortJoinGroupIDs(ctx context.Context, userID strin
|
|||||||
}
|
}
|
||||||
return groupIDs, nil
|
return groupIDs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *GroupCacheRedis) DelMaxGroupMemberVersion(groupIDs ...string) cache.GroupCache {
|
||||||
|
keys := make([]string, 0, len(groupIDs))
|
||||||
|
for _, groupID := range groupIDs {
|
||||||
|
keys = append(keys, g.getGroupMemberMaxVersionKey(groupID))
|
||||||
|
}
|
||||||
|
cache := g.CloneGroupCache()
|
||||||
|
cache.AddKeys(keys...)
|
||||||
|
return cache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GroupCacheRedis) DelMaxJoinGroupVersion(userIDs ...string) cache.GroupCache {
|
||||||
|
keys := make([]string, 0, len(userIDs))
|
||||||
|
for _, userID := range userIDs {
|
||||||
|
keys = append(keys, g.getJoinGroupMaxVersionKey(userID))
|
||||||
|
}
|
||||||
|
cache := g.CloneGroupCache()
|
||||||
|
cache.AddKeys(keys...)
|
||||||
|
return cache
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GroupCacheRedis) FindMaxGroupMemberVersion(ctx context.Context, groupID string) (*model.VersionLog, error) {
|
||||||
|
return getCache(ctx, g.rcClient, g.getGroupMemberMaxVersionKey(groupID), g.expireTime, func(ctx context.Context) (*model.VersionLog, error) {
|
||||||
|
return g.groupMemberDB.FindJoinIncrVersion(ctx, groupID, 0, 0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GroupCacheRedis) FindMaxJoinGroupVersion(ctx context.Context, userID string) (*model.VersionLog, error) {
|
||||||
|
return getCache(ctx, g.rcClient, g.getJoinGroupMaxVersionKey(userID), g.expireTime, func(ctx context.Context) (*model.VersionLog, error) {
|
||||||
|
return g.groupMemberDB.FindJoinIncrVersion(ctx, userID, 0, 0)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@ -82,6 +82,8 @@ type FriendDatabase interface {
|
|||||||
|
|
||||||
FindFriendIncrVersion(ctx context.Context, ownerUserID string, version uint, limit int) (*model.VersionLog, error)
|
FindFriendIncrVersion(ctx context.Context, ownerUserID string, version uint, limit int) (*model.VersionLog, error)
|
||||||
|
|
||||||
|
FindMaxFriendVersionCache(ctx context.Context, ownerUserID string) (*model.VersionLog, error)
|
||||||
|
|
||||||
FindFriendUserID(ctx context.Context, friendUserID string) ([]string, error)
|
FindFriendUserID(ctx context.Context, friendUserID string) ([]string, error)
|
||||||
|
|
||||||
UpdateFriendUserInfo(ctx context.Context, friendUserID string, ownerUserID []string, nickname string, faceURL string) error
|
UpdateFriendUserInfo(ctx context.Context, friendUserID string, ownerUserID []string, nickname string, faceURL string) error
|
||||||
@ -185,7 +187,7 @@ func (f *friendDatabase) BecomeFriends(ctx context.Context, ownerUserID string,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
newFriendIDs = append(newFriendIDs, ownerUserID)
|
newFriendIDs = append(newFriendIDs, ownerUserID)
|
||||||
cache = cache.DelFriendIDs(newFriendIDs...).DelSortFriendUserIDs(ownerUserID)
|
cache = cache.DelFriendIDs(newFriendIDs...).DelMaxFriendVersion(newFriendIDs...)
|
||||||
return cache.ChainExecDel(ctx)
|
return cache.ChainExecDel(ctx)
|
||||||
|
|
||||||
})
|
})
|
||||||
@ -288,7 +290,7 @@ func (f *friendDatabase) AgreeFriendRequest(ctx context.Context, friendRequest *
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return f.cache.DelFriendIDs(friendRequest.ToUserID, friendRequest.FromUserID).DelSortFriendUserIDs(friendRequest.ToUserID, friendRequest.FromUserID).ChainExecDel(ctx)
|
return f.cache.DelFriendIDs(friendRequest.ToUserID, friendRequest.FromUserID).DelMaxFriendVersion(friendRequest.ToUserID, friendRequest.FromUserID).ChainExecDel(ctx)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,7 +299,8 @@ func (f *friendDatabase) Delete(ctx context.Context, ownerUserID string, friendU
|
|||||||
if err := f.friend.Delete(ctx, ownerUserID, friendUserIDs); err != nil {
|
if err := f.friend.Delete(ctx, ownerUserID, friendUserIDs); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return f.cache.DelFriendIDs(append(friendUserIDs, ownerUserID)...).DelSortFriendUserIDs(ownerUserID).ChainExecDel(ctx)
|
userIds := append(friendUserIDs, ownerUserID)
|
||||||
|
return f.cache.DelFriendIDs(userIds...).DelMaxFriendVersion(userIds...).ChainExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateRemark updates the remark for a friend. Zero value for remark is also supported.
|
// UpdateRemark updates the remark for a friend. Zero value for remark is also supported.
|
||||||
@ -305,7 +308,7 @@ func (f *friendDatabase) UpdateRemark(ctx context.Context, ownerUserID, friendUs
|
|||||||
if err := f.friend.UpdateRemark(ctx, ownerUserID, friendUserID, remark); err != nil {
|
if err := f.friend.UpdateRemark(ctx, ownerUserID, friendUserID, remark); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return f.cache.DelFriend(ownerUserID, friendUserID).ChainExecDel(ctx)
|
return f.cache.DelFriend(ownerUserID, friendUserID).DelMaxFriendVersion(ownerUserID).ChainExecDel(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PageOwnerFriends retrieves the list of friends for the ownerUserID. It does not return an error if the result is empty.
|
// PageOwnerFriends retrieves the list of friends for the ownerUserID. It does not return an error if the result is empty.
|
||||||
@ -351,10 +354,12 @@ func (f *friendDatabase) UpdateFriends(ctx context.Context, ownerUserID string,
|
|||||||
if len(val) == 0 {
|
if len(val) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
return f.tx.Transaction(ctx, func(ctx context.Context) error {
|
||||||
if err := f.friend.UpdateFriends(ctx, ownerUserID, friendUserIDs, val); err != nil {
|
if err := f.friend.UpdateFriends(ctx, ownerUserID, friendUserIDs, val); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return f.cache.DelFriends(ownerUserID, friendUserIDs).DelSortFriendUserIDs(ownerUserID).ChainExecDel(ctx)
|
return f.cache.DelFriends(ownerUserID, friendUserIDs).DelMaxFriendVersion(ownerUserID).ChainExecDel(ctx)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *friendDatabase) FindSortFriendUserIDs(ctx context.Context, ownerUserID string) ([]string, error) {
|
func (f *friendDatabase) FindSortFriendUserIDs(ctx context.Context, ownerUserID string) ([]string, error) {
|
||||||
@ -362,7 +367,11 @@ func (f *friendDatabase) FindSortFriendUserIDs(ctx context.Context, ownerUserID
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *friendDatabase) FindFriendIncrVersion(ctx context.Context, ownerUserID string, version uint, limit int) (*model.VersionLog, error) {
|
func (f *friendDatabase) FindFriendIncrVersion(ctx context.Context, ownerUserID string, version uint, limit int) (*model.VersionLog, error) {
|
||||||
return f.cache.FindFriendIncrVersion(ctx, ownerUserID, version, limit)
|
return f.friend.FindIncrVersion(ctx, ownerUserID, version, limit)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *friendDatabase) FindMaxFriendVersionCache(ctx context.Context, ownerUserID string) (*model.VersionLog, error) {
|
||||||
|
return f.cache.FindMaxFriendVersion(ctx, ownerUserID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *friendDatabase) FindFriendUserID(ctx context.Context, friendUserID string) ([]string, error) {
|
func (f *friendDatabase) FindFriendUserID(ctx context.Context, friendUserID string) ([]string, error) {
|
||||||
@ -370,10 +379,12 @@ func (f *friendDatabase) FindFriendUserID(ctx context.Context, friendUserID stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *friendDatabase) UpdateFriendUserInfo(ctx context.Context, friendUserID string, ownerUserIDs []string, nickname string, faceURL string) error {
|
func (f *friendDatabase) UpdateFriendUserInfo(ctx context.Context, friendUserID string, ownerUserIDs []string, nickname string, faceURL string) error {
|
||||||
|
return f.tx.Transaction(ctx, func(ctx context.Context) error {
|
||||||
if err := f.friend.UpdateFriendUserInfo(ctx, friendUserID, nickname, faceURL); err != nil {
|
if err := f.friend.UpdateFriendUserInfo(ctx, friendUserID, nickname, faceURL); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return f.cache.DelOwner(friendUserID, ownerUserIDs).ChainExecDel(ctx)
|
return f.cache.DelOwner(friendUserID, ownerUserIDs).DelMaxFriendVersion(ownerUserIDs...).ChainExecDel(ctx)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *friendDatabase) SearchFriend(ctx context.Context, ownerUserID, keyword string, pagination pagination.Pagination) (int64, []*model.Friend, error) {
|
func (f *friendDatabase) SearchFriend(ctx context.Context, ownerUserID, keyword string, pagination pagination.Pagination) (int64, []*model.Friend, error) {
|
||||||
|
|||||||
@ -113,6 +113,11 @@ type GroupDatabase interface {
|
|||||||
FindSortGroupMemberUserIDs(ctx context.Context, groupID string) ([]string, error)
|
FindSortGroupMemberUserIDs(ctx context.Context, groupID string) ([]string, error)
|
||||||
|
|
||||||
FindSortJoinGroupIDs(ctx context.Context, userID string) ([]string, error)
|
FindSortJoinGroupIDs(ctx context.Context, userID string) ([]string, error)
|
||||||
|
|
||||||
|
FindMaxGroupMemberVersionCache(ctx context.Context, groupID string) (*model.VersionLog, error)
|
||||||
|
FindMaxJoinGroupVersionCache(ctx context.Context, userID string) (*model.VersionLog, error)
|
||||||
|
|
||||||
|
SearchJoinGroup(ctx context.Context, userID string, keyword string, pagination pagination.Pagination) (int64, []*model.Group, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGroupDatabase(
|
func NewGroupDatabase(
|
||||||
@ -182,7 +187,8 @@ func (g *groupDatabase) CreateGroup(ctx context.Context, groups []*model.Group,
|
|||||||
DelGroupMembersHash(group.GroupID).
|
DelGroupMembersHash(group.GroupID).
|
||||||
DelGroupsMemberNum(group.GroupID).
|
DelGroupsMemberNum(group.GroupID).
|
||||||
DelGroupMemberIDs(group.GroupID).
|
DelGroupMemberIDs(group.GroupID).
|
||||||
DelGroupAllRoleLevel(group.GroupID)
|
DelGroupAllRoleLevel(group.GroupID).
|
||||||
|
DelMaxGroupMemberVersion(group.GroupID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(groupMembers) > 0 {
|
if len(groupMembers) > 0 {
|
||||||
@ -195,7 +201,9 @@ func (g *groupDatabase) CreateGroup(ctx context.Context, groups []*model.Group,
|
|||||||
DelGroupMemberIDs(groupMember.GroupID).
|
DelGroupMemberIDs(groupMember.GroupID).
|
||||||
DelJoinedGroupID(groupMember.UserID).
|
DelJoinedGroupID(groupMember.UserID).
|
||||||
DelGroupMembersInfo(groupMember.GroupID, groupMember.UserID).
|
DelGroupMembersInfo(groupMember.GroupID, groupMember.UserID).
|
||||||
DelGroupAllRoleLevel(groupMember.GroupID)
|
DelGroupAllRoleLevel(groupMember.GroupID).
|
||||||
|
DelMaxJoinGroupVersion(groupMember.UserID).
|
||||||
|
DelMaxGroupMemberVersion(groupMember.GroupID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return c.ChainExecDel(ctx)
|
return c.ChainExecDel(ctx)
|
||||||
@ -239,8 +247,9 @@ func (g *groupDatabase) UpdateGroup(ctx context.Context, groupID string, data ma
|
|||||||
if err := g.groupMemberDB.JoinGroupIncrVersion(ctx, userID, []string{groupID}, false); err != nil {
|
if err := g.groupMemberDB.JoinGroupIncrVersion(ctx, userID, []string{groupID}, false); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return g.cache.DelGroupsInfo(groupID).ChainExecDel(ctx)
|
return g.cache.CloneGroupCache().DelGroupsInfo(groupID).DelMaxJoinGroupVersion(userIDs...).ChainExecDel(ctx)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,8 +272,10 @@ func (g *groupDatabase) DismissGroup(ctx context.Context, groupID string, delete
|
|||||||
DelGroupsMemberNum(groupID).
|
DelGroupsMemberNum(groupID).
|
||||||
DelGroupMembersHash(groupID).
|
DelGroupMembersHash(groupID).
|
||||||
DelGroupAllRoleLevel(groupID).
|
DelGroupAllRoleLevel(groupID).
|
||||||
DelGroupMembersInfo(groupID, userIDs...)
|
DelGroupMembersInfo(groupID, userIDs...).
|
||||||
|
DelMaxGroupMemberVersion(groupID)
|
||||||
}
|
}
|
||||||
|
c = c.DelMaxJoinGroupVersion(userIDs...)
|
||||||
if len(userIDs) > 0 {
|
if len(userIDs) > 0 {
|
||||||
if err := g.groupMemberDB.JoinGroupIncrVersion(ctx, groupID, userIDs, true); err != nil {
|
if err := g.groupMemberDB.JoinGroupIncrVersion(ctx, groupID, userIDs, true); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -340,7 +351,9 @@ func (g *groupDatabase) HandlerGroupRequest(ctx context.Context, groupID string,
|
|||||||
DelGroupMemberIDs(groupID).
|
DelGroupMemberIDs(groupID).
|
||||||
DelGroupsMemberNum(groupID).
|
DelGroupsMemberNum(groupID).
|
||||||
DelJoinedGroupID(member.UserID).
|
DelJoinedGroupID(member.UserID).
|
||||||
DelGroupRoleLevel(groupID, []int32{member.RoleLevel})
|
DelGroupRoleLevel(groupID, []int32{member.RoleLevel}).
|
||||||
|
DelMaxJoinGroupVersion(userID).
|
||||||
|
DelMaxGroupMemberVersion(groupID)
|
||||||
if err := c.ChainExecDel(ctx); err != nil {
|
if err := c.ChainExecDel(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -350,6 +363,7 @@ func (g *groupDatabase) HandlerGroupRequest(ctx context.Context, groupID string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *groupDatabase) DeleteGroupMember(ctx context.Context, groupID string, userIDs []string) error {
|
func (g *groupDatabase) DeleteGroupMember(ctx context.Context, groupID string, userIDs []string) error {
|
||||||
|
return g.ctxTx.Transaction(ctx, func(ctx context.Context) error {
|
||||||
if err := g.groupMemberDB.Delete(ctx, groupID, userIDs); err != nil {
|
if err := g.groupMemberDB.Delete(ctx, groupID, userIDs); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -360,7 +374,9 @@ func (g *groupDatabase) DeleteGroupMember(ctx context.Context, groupID string, u
|
|||||||
DelJoinedGroupID(userIDs...).
|
DelJoinedGroupID(userIDs...).
|
||||||
DelGroupMembersInfo(groupID, userIDs...).
|
DelGroupMembersInfo(groupID, userIDs...).
|
||||||
DelGroupAllRoleLevel(groupID).
|
DelGroupAllRoleLevel(groupID).
|
||||||
|
DelMaxGroupMemberVersion(groupID).
|
||||||
ChainExecDel(ctx)
|
ChainExecDel(ctx)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *groupDatabase) MapGroupMemberUserID(ctx context.Context, groupIDs []string) (map[string]*common.GroupSimpleUserID, error) {
|
func (g *groupDatabase) MapGroupMemberUserID(ctx context.Context, groupIDs []string) (map[string]*common.GroupSimpleUserID, error) {
|
||||||
@ -390,11 +406,14 @@ func (g *groupDatabase) TransferGroupOwner(ctx context.Context, groupID string,
|
|||||||
c := g.cache.CloneGroupCache()
|
c := g.cache.CloneGroupCache()
|
||||||
return c.DelGroupMembersInfo(groupID, oldOwnerUserID, newOwnerUserID).
|
return c.DelGroupMembersInfo(groupID, oldOwnerUserID, newOwnerUserID).
|
||||||
DelGroupAllRoleLevel(groupID).
|
DelGroupAllRoleLevel(groupID).
|
||||||
DelGroupMembersHash(groupID).ChainExecDel(ctx)
|
DelGroupMembersHash(groupID).
|
||||||
|
DelJoinedGroupID(oldOwnerUserID, newOwnerUserID).
|
||||||
|
ChainExecDel(ctx)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *groupDatabase) UpdateGroupMember(ctx context.Context, groupID string, userID string, data map[string]any) error {
|
func (g *groupDatabase) UpdateGroupMember(ctx context.Context, groupID string, userID string, data map[string]any) error {
|
||||||
|
return g.ctxTx.Transaction(ctx, func(ctx context.Context) error {
|
||||||
if err := g.groupMemberDB.Update(ctx, groupID, userID, data); err != nil {
|
if err := g.groupMemberDB.Update(ctx, groupID, userID, data); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -403,7 +422,9 @@ func (g *groupDatabase) UpdateGroupMember(ctx context.Context, groupID string, u
|
|||||||
if g.groupMemberDB.IsUpdateRoleLevel(data) {
|
if g.groupMemberDB.IsUpdateRoleLevel(data) {
|
||||||
c = c.DelGroupAllRoleLevel(groupID)
|
c = c.DelGroupAllRoleLevel(groupID)
|
||||||
}
|
}
|
||||||
|
c = c.DelMaxGroupMemberVersion(groupID).DelMaxJoinGroupVersion(userID)
|
||||||
return c.ChainExecDel(ctx)
|
return c.ChainExecDel(ctx)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *groupDatabase) UpdateGroupMembers(ctx context.Context, data []*common.BatchUpdateGroupMember) error {
|
func (g *groupDatabase) UpdateGroupMembers(ctx context.Context, data []*common.BatchUpdateGroupMember) error {
|
||||||
@ -483,3 +504,19 @@ func (g *groupDatabase) FindSortGroupMemberUserIDs(ctx context.Context, groupID
|
|||||||
func (g *groupDatabase) FindSortJoinGroupIDs(ctx context.Context, userID string) ([]string, error) {
|
func (g *groupDatabase) FindSortJoinGroupIDs(ctx context.Context, userID string) ([]string, error) {
|
||||||
return g.cache.FindSortJoinGroupIDs(ctx, userID)
|
return g.cache.FindSortJoinGroupIDs(ctx, userID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *groupDatabase) FindMaxGroupMemberVersionCache(ctx context.Context, groupID string) (*model.VersionLog, error) {
|
||||||
|
return g.cache.FindMaxGroupMemberVersion(ctx, groupID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *groupDatabase) FindMaxJoinGroupVersionCache(ctx context.Context, userID string) (*model.VersionLog, error) {
|
||||||
|
return g.cache.FindMaxJoinGroupVersion(ctx, userID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *groupDatabase) SearchJoinGroup(ctx context.Context, userID string, keyword string, pagination pagination.Pagination) (int64, []*model.Group, error) {
|
||||||
|
groupIDs, err := g.cache.GetJoinedGroupIDs(ctx, userID)
|
||||||
|
if err != nil {
|
||||||
|
return 0, nil, err
|
||||||
|
}
|
||||||
|
return g.groupDB.SearchJoin(ctx, groupIDs, keyword, pagination)
|
||||||
|
}
|
||||||
|
|||||||
@ -32,4 +32,8 @@ type Group interface {
|
|||||||
CountTotal(ctx context.Context, before *time.Time) (count int64, err error)
|
CountTotal(ctx context.Context, before *time.Time) (count int64, err error)
|
||||||
// Get Group total quantity every day
|
// Get Group total quantity every day
|
||||||
CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error)
|
CountRangeEverydayTotal(ctx context.Context, start time.Time, end time.Time) (map[string]int64, error)
|
||||||
|
|
||||||
|
FindJoinSortGroupID(ctx context.Context, groupIDs []string) ([]string, error)
|
||||||
|
|
||||||
|
SearchJoin(ctx context.Context, groupIDs []string, keyword string, pagination pagination.Pagination) (int64, []*model.Group, error)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,6 +52,10 @@ func NewFriendMongo(db *mongo.Database) (database.Friend, error) {
|
|||||||
return &FriendMgo{coll: coll, owner: owner}, nil
|
return &FriendMgo{coll: coll, owner: owner}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *FriendMgo) friendSort() any {
|
||||||
|
return bson.D{{"is_pinned", -1}, {"friend_nickname", 1}, {"create_time", 1}}
|
||||||
|
}
|
||||||
|
|
||||||
// Create inserts multiple friend records.
|
// Create inserts multiple friend records.
|
||||||
func (f *FriendMgo) Create(ctx context.Context, friends []*model.Friend) error {
|
func (f *FriendMgo) Create(ctx context.Context, friends []*model.Friend) error {
|
||||||
return mongoutil.IncrVersion(func() error {
|
return mongoutil.IncrVersion(func() error {
|
||||||
@ -145,13 +149,13 @@ func (f *FriendMgo) FindReversalFriends(ctx context.Context, friendUserID string
|
|||||||
// FindOwnerFriends retrieves a paginated list of friends for a given owner.
|
// FindOwnerFriends retrieves a paginated list of friends for a given owner.
|
||||||
func (f *FriendMgo) FindOwnerFriends(ctx context.Context, ownerUserID string, pagination pagination.Pagination) (int64, []*model.Friend, error) {
|
func (f *FriendMgo) FindOwnerFriends(ctx context.Context, ownerUserID string, pagination pagination.Pagination) (int64, []*model.Friend, error) {
|
||||||
filter := bson.M{"owner_user_id": ownerUserID}
|
filter := bson.M{"owner_user_id": ownerUserID}
|
||||||
opt := options.Find().SetSort(bson.D{{"friend_nickname", 1}, {"create_time", 1}})
|
opt := options.Find().SetSort(f.friendSort())
|
||||||
return mongoutil.FindPage[*model.Friend](ctx, f.coll, filter, pagination, opt)
|
return mongoutil.FindPage[*model.Friend](ctx, f.coll, filter, pagination, opt)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FriendMgo) FindOwnerFriendUserIds(ctx context.Context, ownerUserID string, limit int) ([]string, error) {
|
func (f *FriendMgo) FindOwnerFriendUserIds(ctx context.Context, ownerUserID string, limit int) ([]string, error) {
|
||||||
filter := bson.M{"owner_user_id": ownerUserID}
|
filter := bson.M{"owner_user_id": ownerUserID}
|
||||||
opt := options.Find().SetProjection(bson.M{"_id": 0, "friend_user_id": 1}).SetSort(bson.D{{"friend_nickname", 1}, {"create_time", 1}}).SetLimit(int64(limit))
|
opt := options.Find().SetProjection(bson.M{"_id": 0, "friend_user_id": 1}).SetSort(f.friendSort()).SetLimit(int64(limit))
|
||||||
return mongoutil.Find[string](ctx, f.coll, filter, opt)
|
return mongoutil.Find[string](ctx, f.coll, filter, opt)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,7 +201,7 @@ func (f *FriendMgo) FindFriendUserID(ctx context.Context, friendUserID string) (
|
|||||||
filter := bson.M{
|
filter := bson.M{
|
||||||
"friend_user_id": friendUserID,
|
"friend_user_id": friendUserID,
|
||||||
}
|
}
|
||||||
return mongoutil.Find[string](ctx, f.coll, filter, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1}))
|
return mongoutil.Find[string](ctx, f.coll, filter, options.Find().SetProjection(bson.M{"_id": 0, "owner_user_id": 1}).SetSort(f.friendSort()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FriendMgo) UpdateFriendUserInfo(ctx context.Context, friendUserID string, nickname string, faceURL string) error {
|
func (f *FriendMgo) UpdateFriendUserInfo(ctx context.Context, friendUserID string, nickname string, faceURL string) error {
|
||||||
@ -209,14 +213,16 @@ func (f *FriendMgo) UpdateFriendUserInfo(ctx context.Context, friendUserID strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *FriendMgo) SearchFriend(ctx context.Context, ownerUserID, keyword string, pagination pagination.Pagination) (int64, []*model.Friend, error) {
|
func (f *FriendMgo) SearchFriend(ctx context.Context, ownerUserID, keyword string, pagination pagination.Pagination) (int64, []*model.Friend, error) {
|
||||||
//where := bson.M{
|
filter := bson.M{
|
||||||
// "owner_user_id": ownerUserID,
|
"owner_user_id": ownerUserID,
|
||||||
// "$or": []bson.M{
|
}
|
||||||
// {"remark": bson.M{"$regex": keyword, "$options": "i"}},
|
if keyword != "" {
|
||||||
// {"friend_user_id": bson.M{"$regex": keyword, "$options": "i"}},
|
filter["$or"] = []bson.M{
|
||||||
// {"nickname": bson.M{"$regex": keyword, "$options": "i"}},
|
{"remark": bson.M{"$regex": keyword, "$options": "i"}},
|
||||||
// },
|
{"nickname": bson.M{"$regex": keyword, "$options": "i"}},
|
||||||
//}
|
{"friend_user_id": bson.M{"$regex": keyword, "$options": "i"}},
|
||||||
//return f.aggregatePagination(ctx, where, pagination)
|
}
|
||||||
panic("todo")
|
}
|
||||||
|
opt := options.Find().SetSort(f.friendSort())
|
||||||
|
return mongoutil.FindPage[*model.Friend](ctx, f.coll, filter, pagination, opt)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -47,6 +47,10 @@ type GroupMgo struct {
|
|||||||
coll *mongo.Collection
|
coll *mongo.Collection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *GroupMgo) sortGroup() any {
|
||||||
|
return bson.D{{"group_name", 1}, {"create_time", 1}}
|
||||||
|
}
|
||||||
|
|
||||||
func (g *GroupMgo) Create(ctx context.Context, groups []*model.Group) (err error) {
|
func (g *GroupMgo) Create(ctx context.Context, groups []*model.Group) (err error) {
|
||||||
return mongoutil.InsertMany(ctx, g.coll, groups)
|
return mongoutil.InsertMany(ctx, g.coll, groups)
|
||||||
}
|
}
|
||||||
@ -126,3 +130,32 @@ func (g *GroupMgo) CountRangeEverydayTotal(ctx context.Context, start time.Time,
|
|||||||
}
|
}
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *GroupMgo) FindJoinSortGroupID(ctx context.Context, groupIDs []string) ([]string, error) {
|
||||||
|
if len(groupIDs) < 2 {
|
||||||
|
return groupIDs, nil
|
||||||
|
}
|
||||||
|
filter := bson.M{
|
||||||
|
"group_id": bson.M{"$in": groupIDs},
|
||||||
|
"status": bson.M{"$ne": constant.GroupStatusDismissed},
|
||||||
|
}
|
||||||
|
opt := options.Find().SetSort(g.sortGroup()).SetProjection(bson.M{"_id": 0, "group_id": 1})
|
||||||
|
return mongoutil.Find[string](ctx, g.coll, filter, opt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GroupMgo) SearchJoin(ctx context.Context, groupIDs []string, keyword string, pagination pagination.Pagination) (int64, []*model.Group, error) {
|
||||||
|
if len(groupIDs) == 0 {
|
||||||
|
return 0, nil, nil
|
||||||
|
}
|
||||||
|
filter := bson.M{
|
||||||
|
"group_id": bson.M{"$in": groupIDs},
|
||||||
|
"status": bson.M{"$ne": constant.GroupStatusDismissed},
|
||||||
|
}
|
||||||
|
if keyword != "" {
|
||||||
|
filter["group_name"] = bson.M{"$regex": keyword}
|
||||||
|
}
|
||||||
|
// Define the sorting options
|
||||||
|
opts := options.Find().SetSort(g.sortGroup())
|
||||||
|
// Perform the search with pagination and sorting
|
||||||
|
return mongoutil.FindPage[*model.Group](ctx, g.coll, filter, pagination, opts)
|
||||||
|
}
|
||||||
|
|||||||
@ -57,7 +57,7 @@ type GroupMemberMgo struct {
|
|||||||
join database.VersionLog
|
join database.VersionLog
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GroupMemberMgo) sortBson() any {
|
func (g *GroupMemberMgo) memberSort() any {
|
||||||
return bson.D{{"role_level", -1}, {"create_time", -1}}
|
return bson.D{{"role_level", -1}, {"create_time", -1}}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ func (g *GroupMemberMgo) Update(ctx context.Context, groupID string, userID stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (g *GroupMemberMgo) FindMemberUserID(ctx context.Context, groupID string) (userIDs []string, err error) {
|
func (g *GroupMemberMgo) FindMemberUserID(ctx context.Context, groupID string) (userIDs []string, err error) {
|
||||||
return mongoutil.Find[string](ctx, g.coll, bson.M{"group_id": groupID}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1}).SetSort(g.sortBson()))
|
return mongoutil.Find[string](ctx, g.coll, bson.M{"group_id": groupID}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1}).SetSort(g.memberSort()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GroupMemberMgo) Take(ctx context.Context, groupID string, userID string) (groupMember *model.GroupMember, err error) {
|
func (g *GroupMemberMgo) Take(ctx context.Context, groupID string, userID string) (groupMember *model.GroupMember, err error) {
|
||||||
@ -143,13 +143,13 @@ func (g *GroupMemberMgo) FindRoleLevelUserIDs(ctx context.Context, groupID strin
|
|||||||
return mongoutil.Find[string](ctx, g.coll, bson.M{"group_id": groupID, "role_level": roleLevel}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1}))
|
return mongoutil.Find[string](ctx, g.coll, bson.M{"group_id": groupID, "role_level": roleLevel}, options.Find().SetProjection(bson.M{"_id": 0, "user_id": 1}))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GroupMemberMgo) SearchMember(ctx context.Context, keyword string, groupID string, pagination pagination.Pagination) (total int64, groupList []*model.GroupMember, err error) {
|
func (g *GroupMemberMgo) SearchMember(ctx context.Context, keyword string, groupID string, pagination pagination.Pagination) (int64, []*model.GroupMember, error) {
|
||||||
filter := bson.M{"group_id": groupID, "nickname": bson.M{"$regex": keyword}}
|
filter := bson.M{"group_id": groupID, "nickname": bson.M{"$regex": keyword}}
|
||||||
return mongoutil.FindPage[*model.GroupMember](ctx, g.coll, filter, pagination, options.Find().SetSort(g.sortBson()))
|
return mongoutil.FindPage[*model.GroupMember](ctx, g.coll, filter, pagination, options.Find().SetSort(g.memberSort()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GroupMemberMgo) FindUserJoinedGroupID(ctx context.Context, userID string) (groupIDs []string, err error) {
|
func (g *GroupMemberMgo) FindUserJoinedGroupID(ctx context.Context, userID string) (groupIDs []string, err error) {
|
||||||
return mongoutil.Find[string](ctx, g.coll, bson.M{"user_id": userID}, options.Find().SetProjection(bson.M{"_id": 0, "group_id": 1}).SetSort(g.sortBson()))
|
return mongoutil.Find[string](ctx, g.coll, bson.M{"user_id": userID}, options.Find().SetProjection(bson.M{"_id": 0, "group_id": 1}).SetSort(g.memberSort()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GroupMemberMgo) TakeGroupMemberNum(ctx context.Context, groupID string) (count int64, err error) {
|
func (g *GroupMemberMgo) TakeGroupMemberNum(ctx context.Context, groupID string) (count int64, err error) {
|
||||||
|
|||||||
@ -30,7 +30,6 @@ func (v *VersionLogTable) VersionLog() *VersionLog {
|
|||||||
Deleted: v.Deleted,
|
Deleted: v.Deleted,
|
||||||
LastUpdate: v.LastUpdate,
|
LastUpdate: v.LastUpdate,
|
||||||
LogLen: 0,
|
LogLen: 0,
|
||||||
queryDoc: true,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,15 +41,10 @@ type VersionLog struct {
|
|||||||
Deleted uint `bson:"deleted"`
|
Deleted uint `bson:"deleted"`
|
||||||
LastUpdate time.Time `bson:"last_update"`
|
LastUpdate time.Time `bson:"last_update"`
|
||||||
LogLen int `bson:"log_len"`
|
LogLen int `bson:"log_len"`
|
||||||
queryDoc bool `bson:"-"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *VersionLog) Full() bool {
|
func (v *VersionLog) DeleteAndChangeIDs() (delIds []string, changeIds []string) {
|
||||||
return w.queryDoc || w.Version == 0 || len(w.Logs) != w.LogLen
|
for _, l := range v.Logs {
|
||||||
}
|
|
||||||
|
|
||||||
func (w *VersionLog) DeleteAndChangeIDs() (delIds []string, changeIds []string) {
|
|
||||||
for _, l := range w.Logs {
|
|
||||||
if l.Deleted {
|
if l.Deleted {
|
||||||
delIds = append(delIds, l.EID)
|
delIds = append(delIds, l.EID)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user