1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-08 05:57:03 +09:00

Change object creation logic

This commit is contained in:
mcrakhman 2023-01-05 12:45:50 +01:00 committed by Mikhail Iudin
parent 7f19df6f6b
commit aac5b3e83c
No known key found for this signature in database
GPG key ID: FAAAA8BAABDFF1C0
4 changed files with 24 additions and 33 deletions

View file

@ -35,8 +35,8 @@ type treeCache struct {
type TreeCache interface { type TreeCache interface {
treegetter.TreeGetter treegetter.TreeGetter
treegetter.TreePutter
GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error) GetDocument(ctx context.Context, spaceId, id string) (doc textdocument.TextDocument, err error)
CreateDocument(ctx context.Context, spaceId string, payload objecttree.ObjectTreeCreatePayload) (ot textdocument.TextDocument, err error)
} }
type updateListener struct { type updateListener struct {
@ -117,14 +117,22 @@ func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr objectt
return return
} }
func (c *treeCache) PutTree(ctx context.Context, spaceId string, payload treestorage.TreeStorageCreatePayload) (ot objecttree.ObjectTree, err error) { func (c *treeCache) CreateDocument(ctx context.Context, spaceId string, payload objecttree.ObjectTreeCreatePayload) (ot textdocument.TextDocument, err error) {
ctx = context.WithValue(ctx, spaceKey, spaceId) space, err := c.clientService.GetSpace(ctx, spaceId)
ctx = context.WithValue(ctx, treeCreateKey, payload)
v, err := c.cache.Get(ctx, payload.RootRawChange.Id)
if err != nil { if err != nil {
return return
} }
return v.(objecttree.ObjectTree), nil create, err := space.CreateTree(context.Background(), payload)
if err != nil {
return
}
ctx = context.WithValue(ctx, spaceKey, spaceId)
ctx = context.WithValue(ctx, treeCreateKey, create)
v, err := c.cache.Get(ctx, create.RootRawChange.Id)
if err != nil {
return
}
return v.(textdocument.TextDocument), nil
} }
func (c *treeCache) DeleteTree(ctx context.Context, spaceId, treeId string) (err error) { func (c *treeCache) DeleteTree(ctx context.Context, spaceId, treeId string) (err error) {

View file

@ -58,11 +58,11 @@ func (s *service) CreateDocument(spaceId string) (id string, err error) {
SpaceId: space.Id(), SpaceId: space.Id(),
Identity: s.account.Account().Identity, Identity: s.account.Account().Identity,
} }
tree, err := space.CreateTree(context.Background(), payload) doc, err := s.cache.CreateDocument(context.Background(), space.Id(), payload)
if err != nil { if err != nil {
return return
} }
id = tree.Id() id = doc.Id()
return return
} }

View file

@ -5,7 +5,6 @@ import (
"context" "context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
) )
const CName = "common.object.treegetter" const CName = "common.object.treegetter"
@ -15,7 +14,3 @@ type TreeGetter interface {
GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error) GetTree(ctx context.Context, spaceId, treeId string) (objecttree.ObjectTree, error)
DeleteTree(ctx context.Context, spaceId, treeId string) error DeleteTree(ctx context.Context, spaceId, treeId string) error
} }
type TreePutter interface {
PutTree(ctx context.Context, spaceId string, payload treestorage.TreeStorageCreatePayload) (objecttree.ObjectTree, error)
}

View file

@ -81,8 +81,8 @@ type Space interface {
SpaceSyncRpc() RpcHandler SpaceSyncRpc() RpcHandler
DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err error)
CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (objecttree.ObjectTree, error) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err error)
PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error)
BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (objecttree.ObjectTree, error) BuildTree(ctx context.Context, id string, listener updatelistener.UpdateListener) (objecttree.ObjectTree, error)
DeleteTree(ctx context.Context, id string) (err error) DeleteTree(ctx context.Context, id string) (err error)
@ -230,51 +230,39 @@ func (s *space) DebugAllHeads() []headsync.TreeHeads {
return s.headSync.DebugAllHeads() return s.headSync.DebugAllHeads()
} }
func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (t objecttree.ObjectTree, err error) { func (s *space) DeriveTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err error) {
if s.isClosed.Load() { if s.isClosed.Load() {
err = ErrSpaceClosed err = ErrSpaceClosed
return return
} }
treePutter, conforms := s.cache.(treegetter.TreePutter)
if !conforms {
err = ErrPutNotImplemented
return
}
root, err := objecttree.DeriveObjectTreeRoot(payload, s.aclList) root, err := objecttree.DeriveObjectTreeRoot(payload, s.aclList)
if err != nil { if err != nil {
return return
} }
res := treestorage.TreeStorageCreatePayload{ res = treestorage.TreeStorageCreatePayload{
RootRawChange: root, RootRawChange: root,
Changes: []*treechangeproto.RawTreeChangeWithId{root}, Changes: []*treechangeproto.RawTreeChangeWithId{root},
Heads: []string{root.Id}, Heads: []string{root.Id},
} }
// here we must be sure that the object is created synchronously, return
// so there won't be any conflicts, therefore we do it through cache
return treePutter.PutTree(ctx, s.id, res)
} }
func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (t objecttree.ObjectTree, err error) { func (s *space) CreateTree(ctx context.Context, payload objecttree.ObjectTreeCreatePayload) (res treestorage.TreeStorageCreatePayload, err error) {
if s.isClosed.Load() { if s.isClosed.Load() {
err = ErrSpaceClosed err = ErrSpaceClosed
return return
} }
treePutter, conforms := s.cache.(treegetter.TreePutter)
if !conforms {
err = ErrPutNotImplemented
return
}
root, err := objecttree.CreateObjectTreeRoot(payload, s.aclList) root, err := objecttree.CreateObjectTreeRoot(payload, s.aclList)
if err != nil { if err != nil {
return return
} }
res := treestorage.TreeStorageCreatePayload{ res = treestorage.TreeStorageCreatePayload{
RootRawChange: root, RootRawChange: root,
Changes: []*treechangeproto.RawTreeChangeWithId{root}, Changes: []*treechangeproto.RawTreeChangeWithId{root},
Heads: []string{root.Id}, Heads: []string{root.Id},
} }
return treePutter.PutTree(ctx, s.id, res) return
} }
func (s *space) PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) { func (s *space) PutTree(ctx context.Context, payload treestorage.TreeStorageCreatePayload, listener updatelistener.UpdateListener) (t objecttree.ObjectTree, err error) {