diff --git a/pkg/acl/acltree/acltree.go b/pkg/acl/acltree/acltree.go index 4b091433..078feb92 100644 --- a/pkg/acl/acltree/acltree.go +++ b/pkg/acl/acltree/acltree.go @@ -279,7 +279,7 @@ func (a *aclTree) AddRawChanges(ctx context.Context, rawChanges ...*aclpb.RawCha var err error var mode Mode - var changes []*Change + var changes []*Change // TODO: = addChangesBuf[:0] ... for _, ch := range rawChanges { change, err := NewFromRawChange(ch) // TODO: think what if we will have incorrect signatures on rawChanges, how everything will work diff --git a/service/sync/document/service.go b/service/sync/document/service.go new file mode 100644 index 00000000..075db778 --- /dev/null +++ b/service/sync/document/service.go @@ -0,0 +1 @@ +package document diff --git a/service/sync/message/service.go b/service/sync/message/service.go index e6670c63..7a51ce23 100644 --- a/service/sync/message/service.go +++ b/service/sync/message/service.go @@ -35,6 +35,7 @@ func NewMessageService() app.Component { type Service interface { RegisterMessageSender(peerId string) chan *syncpb.SyncContent UnregisterMessageSender(peerId string) + HandleMessage(peerId string, msg *syncpb.SyncContent) error SendMessage(peerId string, msg *syncpb.SyncContent) error } diff --git a/service/sync/requesthandler/requesthandler.go b/service/sync/requesthandler/requesthandler.go index f9d854a5..ba30a39c 100644 --- a/service/sync/requesthandler/requesthandler.go +++ b/service/sync/requesthandler/requesthandler.go @@ -238,7 +238,14 @@ func (r *requestHandler) prepareFullSyncResponse( } func (r *requestHandler) createTree(ctx context.Context, response *syncpb.SyncFullResponse) error { - return r.treeCache.Add(ctx, response.TreeId, response.TreeHeader, response.Changes) + return r.treeCache.Add( + ctx, + response.TreeId, + response.TreeHeader, + response.Changes, + func(tree acltree.ACLTree) error { + return nil + }) } func wrapHeadUpdate(update *syncpb.SyncHeadUpdate) *syncpb.SyncContent { diff --git a/service/treecache/service.go b/service/treecache/service.go index 82460917..d832e40c 100644 --- a/service/treecache/service.go +++ b/service/treecache/service.go @@ -13,9 +13,13 @@ import ( const CName = "treecache" +type ACLTreeFunc = func(tree acltree.ACLTree) error +type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error + type Service interface { - Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error - Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) error + Do(ctx context.Context, treeId string, f ACLTreeFunc) error + Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error + Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFunc) error } type service struct { @@ -28,7 +32,22 @@ func NewTreeCache() app.ComponentRunnable { return &service{} } -func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACLTree) error) error { +func (s *service) Create(ctx context.Context, build ChangeBuildFunc, f ACLTreeFunc) error { + acc := s.account.Account() + st, err := acltree.CreateNewTreeStorageWithACL(acc, build, s.treeProvider.CreateTreeStorage) + if err != nil { + return err + } + + id, err := st.TreeID() + if err != nil { + return err + } + + return s.Do(ctx, id, f) +} + +func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { tree, err := s.cache.Get(ctx, treeId) defer s.cache.Release(treeId) if err != nil { @@ -40,14 +59,12 @@ func (s *service) Do(ctx context.Context, treeId string, f func(tree acltree.ACL return f(tree.(acltree.ACLTree)) } -func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) error { +func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error { _, err := s.treeProvider.CreateTreeStorage(treeId, header, changes) if err != nil { return err } - // forcing the tree to build - _, err = s.cache.Get(ctx, treeId) - return err + return s.Do(ctx, treeId, f) } func (s *service) Init(ctx context.Context, a *app.App) (err error) {