1
0
Fork 0
mirror of https://github.com/anyproto/any-sync.git synced 2025-06-10 18:10:54 +09:00

Add storage and change API to include both tree types

This commit is contained in:
mcrakhman 2022-08-11 15:54:27 +02:00 committed by Mikhail Iudin
parent 02ae77645d
commit 45a0e43fe4
No known key found for this signature in database
GPG key ID: FAAAA8BAABDFF1C0
8 changed files with 105 additions and 30 deletions

View file

@ -9,14 +9,13 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/api"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/configuration"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/file"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/document"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/dialer"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/pool"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/rpc/server"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/net/secure"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/node"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/requesthandler"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache"
@ -97,10 +96,10 @@ func Bootstrap(a *app.App) {
Register(node.New()).
Register(secure.New()).
Register(server.New()).
Register(file.New()).
Register(dialer.New()).
Register(pool.NewPool()).
Register(configuration.New()).
Register(storage.New()).
//Register(&example.Example{})
Register(document.New()).
Register(message.New()).
Register(requesthandler.New()).

View file

@ -378,6 +378,10 @@ func (a *aclTree) Root() *Change {
return a.tree.Root()
}
func (a *aclTree) Close() error {
return nil
}
func (a *aclTree) SnapshotPath() []string {
// TODO: think about caching this

View file

@ -18,4 +18,5 @@ type CommonTree interface {
ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error)
Storage() treestorage.TreeStorage
DebugDump() (string, error)
Close() error
}

View file

@ -360,6 +360,10 @@ func (d *docTree) Root() *Change {
return d.tree.Root()
}
func (d *docTree) Close() error {
return nil
}
func (d *docTree) SnapshotPath() []string {
// TODO: think about caching this

View file

@ -6,8 +6,8 @@ import (
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/acltree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/document"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/document"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache"
"go.uber.org/zap"
"io"
@ -53,7 +53,8 @@ func (s *service) Run(ctx context.Context) (err error) {
}
mux := http.NewServeMux()
mux.HandleFunc("/treeDump", s.treeDump)
mux.HandleFunc("/createDocument", s.createDocument)
mux.HandleFunc("/createDocumentTree", s.createDocumentTree)
mux.HandleFunc("/createACLTree", s.createACLTree)
mux.HandleFunc("/appendDocument", s.appendDocument)
s.srv.Handler = mux
@ -79,8 +80,9 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) {
dump string
err error
)
err = s.treeCache.Do(context.Background(), treeId, func(tree acltree.ACLTree) error {
dump, err = tree.DebugDump()
err = s.treeCache.Do(context.Background(), treeId, func(obj interface{}) error {
t := obj.(tree.CommonTree)
dump, err = t.DebugDump()
if err != nil {
return err
}
@ -93,13 +95,25 @@ func (s *service) treeDump(w http.ResponseWriter, req *http.Request) {
sendText(w, http.StatusOK, dump)
}
func (s *service) createDocument(w http.ResponseWriter, req *http.Request) {
func (s *service) createDocumentTree(w http.ResponseWriter, req *http.Request) {
var (
query = req.URL.Query()
text = query.Get("text")
query = req.URL.Query()
text = query.Get("text")
aclTreeId = query.Get("aclTreeId")
)
timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30)
treeId, err := s.documentService.CreateDocument(timeoutCtx, fmt.Sprintf("created document with id: %s", text))
treeId, err := s.documentService.CreateDocumentTree(timeoutCtx, aclTreeId, text)
cancel()
if err != nil {
sendText(w, http.StatusInternalServerError, err.Error())
return
}
sendText(w, http.StatusOK, treeId)
}
func (s *service) createACLTree(w http.ResponseWriter, req *http.Request) {
timeoutCtx, cancel := context.WithTimeout(context.Background(), time.Second*30)
treeId, err := s.documentService.CreateACLTree(timeoutCtx)
cancel()
if err != nil {
sendText(w, http.StatusInternalServerError, err.Error())

View file

@ -2,15 +2,16 @@ package document
import (
"context"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"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/testutils/testchanges/testchangepb"
"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/treepb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/node"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/sync/message"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/treecache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto"
@ -23,10 +24,10 @@ var CName = "DocumentService"
var log = logger.NewNamed("documentservice")
type service struct {
messageService message.Service
treeCache treecache.Service
account account.Service
treeStorageProvider treestorage.Provider
messageService message.Service
treeCache treecache.Service
account account.Service
storage storage.Service
// to create new documents we need to know all nodes
nodes []*node.Node
}
@ -45,7 +46,7 @@ func (s *service) Init(ctx context.Context, a *app.App) (err error) {
s.account = a.MustComponent(account.CName).(account.Service)
s.messageService = a.MustComponent(message.CName).(message.Service)
s.treeCache = a.MustComponent(treecache.CName).(treecache.Service)
// TODO: add TreeStorageProvider service
s.storage = a.MustComponent(storage.CName).(storage.Service)
nodesService := a.MustComponent(node.CName).(node.Service)
s.nodes = nodesService.Nodes()
@ -76,7 +77,11 @@ func (s *service) UpdateDocumentTree(ctx context.Context, id, text string) (err
Debug("updating document")
err = s.treeCache.Do(ctx, id, func(obj interface{}) error {
docTree := obj.(tree.DocTree)
docTree, ok := obj.(tree.DocTree)
if !ok {
return fmt.Errorf("can't update acl trees with text")
}
docTree.Lock()
defer docTree.Unlock()
err = s.treeCache.Do(ctx, docTree.Header().AclTreeId, func(obj interface{}) error {
@ -141,7 +146,7 @@ func (s *service) CreateACLTree(ctx context.Context) (id string, err error) {
}
}
return nil
}, s.treeStorageProvider.CreateTreeStorage)
}, s.storage.CreateTreeStorage)
id, err = t.TreeID()
if err != nil {
@ -188,7 +193,7 @@ func (s *service) CreateDocumentTree(ctx context.Context, aclTreeId string, text
defer t.RUnlock()
content := createInitialTextChange(text)
doc, err := tree.CreateNewTreeStorage(acc, t, content, s.treeStorageProvider.CreateTreeStorage)
doc, err := tree.CreateNewTreeStorage(acc, t, content, s.storage.CreateTreeStorage)
if err != nil {
return err
}

View file

@ -0,0 +1,48 @@
package storage
import (
"context"
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/aclchanges/aclpb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb"
)
var CName = "storage"
type Service interface {
treestorage.Provider
}
func New() app.Component {
return &service{}
}
type service struct {
storageProvider treestorage.Provider
}
func (s *service) Init(ctx context.Context, a *app.App) (err error) {
s.storageProvider = treestorage.NewInMemoryTreeStorageProvider()
return nil
}
func (s *service) TreeStorage(treeId string) (treestorage.TreeStorage, error) {
return s.storageProvider.TreeStorage(treeId)
}
func (s *service) CreateTreeStorage(treeId string, header *treepb.TreeHeader, changes []*aclpb.RawChange) (treestorage.TreeStorage, error) {
return s.storageProvider.CreateTreeStorage(treeId, header, changes)
}
func (s *service) Name() (name string) {
return CName
}
func (s *service) Run(ctx context.Context) (err error) {
return nil
}
func (s service) Close(ctx context.Context) (err error) {
return nil
}

View file

@ -8,10 +8,10 @@ import (
"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/tree"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/acl/treestorage/treepb"
"github.com/anytypeio/go-anytype-infrastructure-experiments/pkg/ocache"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/account"
"github.com/anytypeio/go-anytype-infrastructure-experiments/service/storage"
"go.uber.org/zap"
)
@ -29,9 +29,9 @@ type Service interface {
}
type service struct {
treeProvider treestorage.Provider
account account.Service
cache ocache.OCache
storage storage.Service
account account.Service
cache ocache.OCache
}
func New() app.ComponentRunnable {
@ -56,7 +56,7 @@ func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHea
With(zap.String("treeId", treeId), zap.Int("len(changes)", len(changes))).
Debug("adding tree with changes")
_, err := s.treeProvider.CreateTreeStorage(treeId, header, changes)
_, err := s.storage.CreateTreeStorage(treeId, header, changes)
if err != nil {
return err
}
@ -66,7 +66,7 @@ func (s *service) Add(ctx context.Context, treeId string, header *treepb.TreeHea
func (s *service) Init(ctx context.Context, a *app.App) (err error) {
s.cache = ocache.New(s.loadTree)
s.account = a.MustComponent(account.CName).(account.Service)
s.treeProvider = treestorage.NewInMemoryTreeStorageProvider()
s.storage = a.MustComponent(storage.CName).(storage.Service)
// TODO: for test we should load some predefined keys
return nil
}
@ -84,7 +84,7 @@ func (s *service) Close(ctx context.Context) (err error) {
}
func (s *service) loadTree(ctx context.Context, id string) (ocache.Object, error) {
t, err := s.treeProvider.TreeStorage(id)
t, err := s.storage.TreeStorage(id)
if err != nil {
return nil, err
}