diff --git a/go/chao-sdk-core/internal/group/sdk.go b/go/chao-sdk-core/internal/group/sdk.go index 3821deb..f67677d 100644 --- a/go/chao-sdk-core/internal/group/sdk.go +++ b/go/chao-sdk-core/internal/group/sdk.go @@ -209,7 +209,7 @@ func (g *Group) GetSpecifiedGroupsInfo(ctx context.Context, groupIDs []string) ( return datautil.Batch(ServerGroupToLocalGroup, serverGroupInfo), nil }, ) - return dataFetcher.FetchMissingAndFillLocal(ctx, groupIDs) + return dataFetcher.FetchMissingAndCombineLocal(ctx, groupIDs) } func (g *Group) SearchGroups(ctx context.Context, param sdk_params_callback.SearchGroupsParam) ([]*model_struct.LocalGroup, error) { @@ -247,6 +247,25 @@ func (g *Group) GetGroupMemberListByJoinTimeFilter(ctx context.Context, groupID } func (g *Group) GetSpecifiedGroupMembersInfo(ctx context.Context, groupID string, userIDList []string) ([]*model_struct.LocalGroupMember, error) { + lvs, err := g.db.GetVersionSync(ctx, g.groupTableName(), g.loginUserID) + if err != nil { + return nil, err + } + if datautil.Contain(groupID, lvs.UIDList...) { + + _, err := g.db.GetVersionSync(ctx, g.groupAndMemberVersionTableName(), groupID) + if err != nil { + if errs.Unwrap(err) != gorm.ErrRecordNotFound { + return nil, err + } + err := g.IncrSyncGroupAndMember(ctx, groupID) + if err != nil { + return nil, err + } + } + } else { // If the user is no longer in the group, return nil immediately + return nil, nil + } dataFetcher := datafetcher.NewDataFetcher( g.db, g.groupAndMemberVersionTableName(), @@ -276,13 +295,26 @@ func (g *Group) GetSpecifiedGroupMembersInfo(ctx context.Context, groupID string } func (g *Group) GetGroupMemberList(ctx context.Context, groupID string, filter, offset, count int32) ([]*model_struct.LocalGroupMember, error) { - _, err := g.db.GetVersionSync(ctx, g.groupAndMemberVersionTableName(), groupID) - if errs.Unwrap(err) == gorm.ErrRecordNotFound { - err := g.IncrSyncGroupAndMember(ctx, groupID) + lvs, err := g.db.GetVersionSync(ctx, g.groupTableName(), g.loginUserID) + if err != nil { + return nil, err + } + if datautil.Contain(groupID, lvs.UIDList...) { + + _, err := g.db.GetVersionSync(ctx, g.groupAndMemberVersionTableName(), groupID) if err != nil { - return nil, err + if errs.Unwrap(err) != gorm.ErrRecordNotFound { + return nil, err + } + err := g.IncrSyncGroupAndMember(ctx, groupID) + if err != nil { + return nil, err + } } + } else { // If the user is no longer in the group, return nil immediately + return nil, nil } + dataFetcher := datafetcher.NewDataFetcher( g.db, g.groupAndMemberVersionTableName(), diff --git a/go/chao-sdk-core/pkg/datafetcher/datafetcher.go b/go/chao-sdk-core/pkg/datafetcher/datafetcher.go index 0d44972..1de2503 100644 --- a/go/chao-sdk-core/pkg/datafetcher/datafetcher.go +++ b/go/chao-sdk-core/pkg/datafetcher/datafetcher.go @@ -98,3 +98,31 @@ func (ds *DataFetcher[T]) FetchMissingAndFillLocal(ctx context.Context, uids []s return localData, nil } + +// FetchMissingAndCombineLocal fetches missing data from the server and combines it with local data without inserting it into the local database +func (ds *DataFetcher[T]) FetchMissingAndCombineLocal(ctx context.Context, uids []string) ([]T, error) { + localData, err := ds.FetchFromLocal(ctx, uids) + if err != nil { + return nil, err + } + + localUIDSet := datautil.SliceSetAny(localData, ds.Key) + + var missingUIDs []string + for _, uid := range uids { + if _, found := localUIDSet[uid]; !found { + missingUIDs = append(missingUIDs, uid) + } + } + + if len(missingUIDs) > 0 { + serverData, err := ds.fetchFromServer(ctx, missingUIDs) + if err != nil { + return nil, err + } + // Combine local data with server data + localData = append(localData, serverData...) + } + + return localData, nil +}