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:
parent
02ae77645d
commit
45a0e43fe4
8 changed files with 105 additions and 30 deletions
|
@ -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()).
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -18,4 +18,5 @@ type CommonTree interface {
|
|||
ChangesAfterCommonSnapshot(snapshotPath []string) ([]*aclpb.RawChange, error)
|
||||
Storage() treestorage.TreeStorage
|
||||
DebugDump() (string, error)
|
||||
Close() error
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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
|
||||
}
|
48
service/storage/service.go
Normal file
48
service/storage/service.go
Normal 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
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue