152 lines
4.1 KiB
Go
152 lines
4.1 KiB
Go
package synctree
|
|
|
|
import (
|
|
"context"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/list"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/storage"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
|
|
)
|
|
|
|
type SyncTree struct {
|
|
objTree tree.ObjectTree
|
|
syncService syncservice.SyncService
|
|
}
|
|
|
|
func CreateSyncTree(
|
|
payload tree.ObjectTreeCreatePayload,
|
|
syncService syncservice.SyncService,
|
|
listener tree.ObjectTreeUpdateListener,
|
|
aclList list.ACLList,
|
|
createStorage storage.TreeStorageCreatorFunc) (t tree.ObjectTree, err error) {
|
|
t, err = tree.CreateObjectTree(payload, listener, aclList, createStorage)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// TODO: use context where it is needed
|
|
err = syncService.NotifyHeadUpdate(context.Background(), t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{
|
|
Heads: t.Heads(),
|
|
SnapshotPath: t.SnapshotPath(),
|
|
})
|
|
return
|
|
}
|
|
|
|
func BuildSyncTree(
|
|
syncService syncservice.SyncService,
|
|
treeStorage storage.TreeStorage,
|
|
listener tree.ObjectTreeUpdateListener,
|
|
aclList list.ACLList) (t tree.ObjectTree, err error) {
|
|
return buildSyncTree(syncService, treeStorage, listener, aclList)
|
|
}
|
|
|
|
func buildSyncTree(
|
|
syncService syncservice.SyncService,
|
|
treeStorage storage.TreeStorage,
|
|
listener tree.ObjectTreeUpdateListener,
|
|
aclList list.ACLList) (t tree.ObjectTree, err error) {
|
|
t, err = tree.BuildObjectTree(treeStorage, listener, aclList)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
// TODO: use context where it is needed
|
|
err = syncService.NotifyHeadUpdate(context.Background(), t.ID(), t.Header(), &spacesyncproto.ObjectHeadUpdate{
|
|
Heads: t.Heads(),
|
|
SnapshotPath: t.SnapshotPath(),
|
|
})
|
|
return
|
|
}
|
|
|
|
func (s *SyncTree) Lock() {
|
|
s.objTree.Lock()
|
|
}
|
|
|
|
func (s *SyncTree) Unlock() {
|
|
s.objTree.Unlock()
|
|
}
|
|
|
|
func (s *SyncTree) RLock() {
|
|
s.objTree.RLock()
|
|
}
|
|
|
|
func (s *SyncTree) RUnlock() {
|
|
s.objTree.RUnlock()
|
|
}
|
|
|
|
func (s *SyncTree) ID() string {
|
|
return s.objTree.ID()
|
|
}
|
|
|
|
func (s *SyncTree) Header() *aclpb.TreeHeader {
|
|
return s.objTree.Header()
|
|
}
|
|
|
|
func (s *SyncTree) Heads() []string {
|
|
return s.objTree.Heads()
|
|
}
|
|
|
|
func (s *SyncTree) Root() *tree.Change {
|
|
return s.objTree.Root()
|
|
}
|
|
|
|
func (s *SyncTree) HasChange(id string) bool {
|
|
return s.objTree.HasChange(id)
|
|
}
|
|
|
|
func (s *SyncTree) Iterate(convert tree.ChangeConvertFunc, iterate tree.ChangeIterateFunc) error {
|
|
return s.objTree.Iterate(convert, iterate)
|
|
}
|
|
|
|
func (s *SyncTree) IterateFrom(id string, convert tree.ChangeConvertFunc, iterate tree.ChangeIterateFunc) error {
|
|
return s.objTree.IterateFrom(id, convert, iterate)
|
|
}
|
|
|
|
func (s *SyncTree) SnapshotPath() []string {
|
|
return s.objTree.SnapshotPath()
|
|
}
|
|
|
|
func (s *SyncTree) ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*aclpb.RawTreeChangeWithId, error) {
|
|
return s.objTree.ChangesAfterCommonSnapshot(snapshotPath, heads)
|
|
}
|
|
|
|
func (s *SyncTree) Storage() storage.TreeStorage {
|
|
return s.objTree.Storage()
|
|
}
|
|
|
|
func (s *SyncTree) DebugDump() (string, error) {
|
|
return s.objTree.DebugDump()
|
|
}
|
|
|
|
func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeContent) (res tree.AddResult, err error) {
|
|
res, err = s.objTree.AddContent(ctx, content)
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = s.syncService.NotifyHeadUpdate(ctx, s.ID(), s.Header(), &spacesyncproto.ObjectHeadUpdate{
|
|
Heads: res.Heads,
|
|
Changes: res.Added,
|
|
SnapshotPath: s.SnapshotPath(),
|
|
})
|
|
return
|
|
}
|
|
|
|
func (s *SyncTree) AddRawChanges(ctx context.Context, changes ...*aclpb.RawTreeChangeWithId) (res tree.AddResult, err error) {
|
|
res, err = s.objTree.AddRawChanges(ctx, changes...)
|
|
if err != nil || res.Mode == tree.Nothing {
|
|
return
|
|
}
|
|
err = s.syncService.NotifyHeadUpdate(ctx, s.ID(), s.Header(), &spacesyncproto.ObjectHeadUpdate{
|
|
Heads: res.Heads,
|
|
Changes: res.Added,
|
|
SnapshotPath: s.SnapshotPath(),
|
|
})
|
|
return
|
|
}
|
|
|
|
func (s *SyncTree) Close() error {
|
|
return s.objTree.Close()
|
|
}
|