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

Rewrite document service methods

This commit is contained in:
mcrakhman 2022-08-11 11:04:03 +02:00 committed by Mikhail Iudin
parent e709febfb2
commit f50c876ec8
No known key found for this signature in database
GPG key ID: FAAAA8BAABDFF1C0
3 changed files with 69 additions and 30 deletions

View file

@ -115,7 +115,7 @@ func (s *service) appendDocument(w http.ResponseWriter, req *http.Request) {
treeId = query.Get("treeId") treeId = query.Get("treeId")
) )
timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30) timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30)
err := s.documentService.UpdateDocument(timeoutCtx, treeId, text) err := s.documentService.UpdateDocumentTree(timeoutCtx, treeId, text)
cancel() cancel()
if err != nil { if err != nil {
sendText(w, http.StatusInternalServerError, err.Error()) sendText(w, http.StatusInternalServerError, err.Error())

View file

@ -5,7 +5,6 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/testutils/testchanges/testchangepb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
@ -33,8 +32,9 @@ type service struct {
} }
type Service interface { type Service interface {
UpdateDocument(ctx context.Context, id, text string) error UpdateDocumentTree(ctx context.Context, id, text string) error
CreateDocument(ctx context.Context, text string) (string, error) CreateACLTree(ctx context.Context) (id string, err error)
CreateDocumentTree(ctx context.Context, aclTreeId string, text string) (id string, err error)
} }
func New() app.Component { func New() app.Component {
@ -65,7 +65,7 @@ func (s *service) Close(ctx context.Context) (err error) {
return nil return nil
} }
func (s *service) UpdateDocument(ctx context.Context, id, text string) (err error) { func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err error) {
var ( var (
ch *aclpb.RawChange ch *aclpb.RawChange
header *treepb.TreeHeader header *treepb.TreeHeader
@ -75,24 +75,28 @@ func (s *service) UpdateDocument(ctx context.Context, id, text string) (err erro
log.With(zap.String("id", id), zap.String("text", text)). log.With(zap.String("id", id), zap.String("text", text)).
Debug("updating document") Debug("updating document")
err = s.treeCache.Do(ctx, id, func(tree acltree.ACLTree) error { err = s.treeCache.Do(ctx, id, func(obj interface{}) error {
ch, err = tree.AddContent(ctx, func(builder acltree.ChangeBuilder) error { docTree := obj.(tree.DocTree)
builder.AddChangeContent( err = s.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error {
&testchangepb.PlainTextChangeData{ aclTree := obj.(tree.ACLTree)
Content: []*testchangepb.PlainTextChangeContent{ aclTree.RLock()
createAppendTextChangeContent(text), defer aclTree.RUnlock()
},
}) content := createAppendTextChange(text)
_, err := docTree.AddContent(ctx, aclTree, content, false)
if err != nil {
return err
}
return nil return nil
}) })
if err != nil { if err != nil {
return err return err
} }
id = tree.ID() id = docTree.ID()
heads = tree.Heads() heads = docTree.Heads()
header = tree.Header() header = docTree.Header()
snapshotPath = tree.SnapshotPath() snapshotPath = docTree.SnapshotPath()
return nil return nil
}) })
if err != nil { if err != nil {
@ -176,11 +180,12 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text
snapshotPath []string snapshotPath []string
heads []string heads []string
) )
err = s.treeCache.Do(ctx, aclTreeId, func(t tree.ACLTree) error { err = s.treeCache.Do(ctx, aclTreeId, func(obj interface{}) error {
t := obj.(tree.ACLTree)
t.RLock() t.RLock()
defer t.RUnlock() defer t.RUnlock()
content := createInitialChangeContent(text) content := createInitialTextChange(text)
doc, err := tree.CreateNewTreeStorage(acc, t, content, s.treeStorageProvider.CreateTreeStorage) doc, err := tree.CreateNewTreeStorage(acc, t, content, s.treeStorageProvider.CreateTreeStorage)
if err != nil { if err != nil {
return err return err
@ -225,7 +230,7 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text
return id, err return id, err
} }
func createInitialChangeContent(text string) proto.Marshaler { func createInitialTextChange(text string) proto.Marshaler {
return &testchangepb.PlainTextChangeData{ return &testchangepb.PlainTextChangeData{
Content: []*testchangepb.PlainTextChangeContent{ Content: []*testchangepb.PlainTextChangeContent{
createAppendTextChangeContent(text), createAppendTextChangeContent(text),
@ -234,6 +239,14 @@ func createInitialChangeContent(text string) proto.Marshaler {
} }
} }
func createAppendTextChange(text string) proto.Marshaler {
return &testchangepb.PlainTextChangeData{
Content: []*testchangepb.PlainTextChangeContent{
createAppendTextChangeContent(text),
},
}
}
func createAppendTextChangeContent(text string) *testchangepb.PlainTextChangeContent { func createAppendTextChangeContent(text string) *testchangepb.PlainTextChangeContent {
return &testchangepb.PlainTextChangeContent{ return &testchangepb.PlainTextChangeContent{
Value: &testchangepb.PlainTextChangeContentValueOfTextAppend{ Value: &testchangepb.PlainTextChangeContentValueOfTextAppend{

View file

@ -2,6 +2,7 @@ package treecache
import ( import (
"context" "context"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app" "github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger" "github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb" "github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb"
@ -17,14 +18,14 @@ import (
const CName = "treecache" const CName = "treecache"
// TODO: add context // TODO: add context
type ACLTreeFunc = func(tree tree.ACLTree) error type TreeFunc = func(tree interface{}) error
type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error type ChangeBuildFunc = func(builder acltree.ChangeBuilder) error
var log = logger.NewNamed("treecache") var log = logger.NewNamed("treecache")
type Service interface { type Service interface {
Do(ctx context.Context, treeId string, f ACLTreeFunc) error Do(ctx context.Context, treeId string, f TreeFunc) error
Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f TreeFunc) error
} }
type service struct { type service struct {
@ -37,7 +38,7 @@ func New() app.ComponentRunnable {
return &service{} return &service{}
} }
func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error { func (s *service) Do(ctx context.Context, treeId string, f TreeFunc) error {
log. log.
With(zap.String("treeId", treeId)). With(zap.String("treeId", treeId)).
Debug("requesting tree from cache to perform operation") Debug("requesting tree from cache to perform operation")
@ -47,10 +48,10 @@ func (s *service) Do(ctx context.Context, treeId string, f ACLTreeFunc) error {
if err != nil { if err != nil {
return err return err
} }
return f(t.(tree.ACLTree)) return f(t)
} }
func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f ACLTreeFunc) error { func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange, f TreeFunc) error {
log. log.
With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))). With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))).
Debug("adding tree with changes") Debug("adding tree with changes")
@ -83,11 +84,36 @@ func (s *service) Close(ctx context.Context) (err error) {
} }
func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) { func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) {
tree, err := s.treeProvider.TreeStorage(id) t, err := s.treeProvider.TreeStorage(id)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// TODO: should probably accept nil listeners header, err := t.Header()
aclTree, err := acltree.BuildACLTree(tree, s.account.Account(), acltree.NoOpListener{}) if err != nil {
return aclTree, err return nil, err
}
switch header.Type {
case treepb.TreeHeader_ACLTree:
return tree.BuildACLTreeWithIdentity(t, s.account.Account(), nil)
case treepb.TreeHeader_DocTree:
break
default:
return nil, fmt.Errorf("incorrect type")
}
var docTree tree.DocTree
// TODO: it is a question if we need to use ACLTree on the first tree build, because we can think that the tree is already validated
err = s.Do(ctx, header.AclTreeId, func(obj interface{}) error {
aclTree := obj.(tree.ACLTree)
aclTree.RLock()
defer aclTree.RUnlock()
docTree, err = tree.BuildDocTreeWithIdentity(t, s.account.Account(), nil, aclTree)
if err != nil {
return err
}
return nil
})
return docTree, err
} }