mirror of
https://github.com/anyproto/any-sync.git
synced 2025-06-08 14:07:02 +09:00
Moving around files and refactoring of common
This commit is contained in:
parent
53e945b956
commit
a66a356947
174 changed files with 1883 additions and 1543 deletions
|
@ -1,21 +1,21 @@
|
||||||
package account
|
package account
|
||||||
|
|
||||||
import (
|
import (
|
||||||
commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
|
commonaccount "github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
||||||
"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/accountdata"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
)
|
)
|
||||||
|
|
||||||
type service struct {
|
type service struct {
|
||||||
accountData *account.AccountData
|
accountData *accountdata.AccountData
|
||||||
peerId string
|
peerId string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Account() *account.AccountData {
|
func (s *service) Account() *accountdata.AccountData {
|
||||||
return s.accountData
|
return s.accountData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ func (s *service) Init(a *app.App) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
s.accountData = &account.AccountData{
|
s.accountData = &accountdata.AccountData{
|
||||||
Identity: identity,
|
Identity: identity,
|
||||||
PeerKey: decodedPeerKey,
|
PeerKey: decodedPeerKey,
|
||||||
SignKey: decodedSigningKey,
|
SignKey: decodedSigningKey,
|
||||||
|
|
|
@ -1,167 +0,0 @@
|
||||||
package api
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/api/apiproto"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
|
||||||
"math/rand"
|
|
||||||
)
|
|
||||||
|
|
||||||
type rpcHandler struct {
|
|
||||||
spaceService clientspace.Service
|
|
||||||
storageService storage.ClientStorage
|
|
||||||
docService document.Service
|
|
||||||
account account.Service
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) Watch(ctx context.Context, request *apiproto.WatchRequest) (resp *apiproto.WatchResponse, err error) {
|
|
||||||
space, err := r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
space.StatusService().Watch(request.TreeId)
|
|
||||||
resp = &apiproto.WatchResponse{}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) Unwatch(ctx context.Context, request *apiproto.UnwatchRequest) (resp *apiproto.UnwatchResponse, err error) {
|
|
||||||
space, err := r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
space.StatusService().Unwatch(request.TreeId)
|
|
||||||
resp = &apiproto.UnwatchResponse{}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) LoadSpace(ctx context.Context, request *apiproto.LoadSpaceRequest) (resp *apiproto.LoadSpaceResponse, err error) {
|
|
||||||
_, err = r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.LoadSpaceResponse{}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) CreateSpace(ctx context.Context, request *apiproto.CreateSpaceRequest) (resp *apiproto.CreateSpaceResponse, err error) {
|
|
||||||
key, err := symmetric.NewRandom()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
sp, err := r.spaceService.CreateSpace(context.Background(), commonspace.SpaceCreatePayload{
|
|
||||||
SigningKey: r.account.Account().SignKey,
|
|
||||||
EncryptionKey: r.account.Account().EncKey,
|
|
||||||
ReadKey: key.Bytes(),
|
|
||||||
ReplicationKey: rand.Uint64(),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
id := sp.Id()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.CreateSpaceResponse{Id: id}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) DeriveSpace(ctx context.Context, request *apiproto.DeriveSpaceRequest) (resp *apiproto.DeriveSpaceResponse, err error) {
|
|
||||||
sp, err := r.spaceService.DeriveSpace(context.Background(), commonspace.SpaceDerivePayload{
|
|
||||||
SigningKey: r.account.Account().SignKey,
|
|
||||||
EncryptionKey: r.account.Account().EncKey,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
id := sp.Id()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.DeriveSpaceResponse{Id: id}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) CreateDocument(ctx context.Context, request *apiproto.CreateDocumentRequest) (resp *apiproto.CreateDocumentResponse, err error) {
|
|
||||||
id, err := r.docService.CreateDocument(request.SpaceId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.CreateDocumentResponse{Id: id}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) DeleteDocument(ctx context.Context, request *apiproto.DeleteDocumentRequest) (resp *apiproto.DeleteDocumentResponse, err error) {
|
|
||||||
err = r.docService.DeleteDocument(request.SpaceId, request.DocumentId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.DeleteDocumentResponse{}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) AddText(ctx context.Context, request *apiproto.AddTextRequest) (resp *apiproto.AddTextResponse, err error) {
|
|
||||||
root, head, err := r.docService.AddText(request.SpaceId, request.DocumentId, request.Text, request.IsSnapshot)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.AddTextResponse{
|
|
||||||
DocumentId: request.DocumentId,
|
|
||||||
HeadId: head,
|
|
||||||
RootId: root,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) DumpTree(ctx context.Context, request *apiproto.DumpTreeRequest) (resp *apiproto.DumpTreeResponse, err error) {
|
|
||||||
dump, err := r.docService.DumpDocumentTree(request.SpaceId, request.DocumentId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.DumpTreeResponse{
|
|
||||||
Dump: dump,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) AllTrees(ctx context.Context, request *apiproto.AllTreesRequest) (resp *apiproto.AllTreesResponse, err error) {
|
|
||||||
heads, err := r.docService.AllDocumentHeads(request.SpaceId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
var trees []*apiproto.Tree
|
|
||||||
for _, head := range heads {
|
|
||||||
trees = append(trees, &apiproto.Tree{
|
|
||||||
Id: head.Id,
|
|
||||||
Heads: head.Heads,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
resp = &apiproto.AllTreesResponse{Trees: trees}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) AllSpaces(ctx context.Context, request *apiproto.AllSpacesRequest) (resp *apiproto.AllSpacesResponse, err error) {
|
|
||||||
ids, err := r.storageService.AllSpaceIds()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.AllSpacesResponse{SpaceIds: ids}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *rpcHandler) TreeParams(ctx context.Context, request *apiproto.TreeParamsRequest) (resp *apiproto.TreeParamsResponse, err error) {
|
|
||||||
root, heads, err := r.docService.TreeParams(request.SpaceId, request.DocumentId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
resp = &apiproto.TreeParamsResponse{
|
|
||||||
RootId: root,
|
|
||||||
HeadIds: heads,
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
|
@ -5,12 +5,12 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
||||||
"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/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ocache"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -25,7 +25,7 @@ const spaceKey ctxKey = 0
|
||||||
type treeCache struct {
|
type treeCache struct {
|
||||||
gcttl int
|
gcttl int
|
||||||
cache ocache.OCache
|
cache ocache.OCache
|
||||||
account account.Service
|
account accountservice.Service
|
||||||
clientService clientspace.Service
|
clientService clientspace.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,14 +37,14 @@ type TreeCache interface {
|
||||||
type updateListener struct {
|
type updateListener struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *updateListener) Update(tree tree.ObjectTree) {
|
func (u *updateListener) Update(tree objecttree.ObjectTree) {
|
||||||
log.With(
|
log.With(
|
||||||
zap.Strings("heads", tree.Heads()),
|
zap.Strings("heads", tree.Heads()),
|
||||||
zap.String("tree id", tree.ID())).
|
zap.String("tree id", tree.ID())).
|
||||||
Debug("updating tree")
|
Debug("updating tree")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *updateListener) Rebuild(tree tree.ObjectTree) {
|
func (u *updateListener) Rebuild(tree objecttree.ObjectTree) {
|
||||||
log.With(
|
log.With(
|
||||||
zap.Strings("heads", tree.Heads()),
|
zap.Strings("heads", tree.Heads()),
|
||||||
zap.String("tree id", tree.ID())).
|
zap.String("tree id", tree.ID())).
|
||||||
|
@ -67,7 +67,7 @@ func (c *treeCache) Close(ctx context.Context) (err error) {
|
||||||
|
|
||||||
func (c *treeCache) Init(a *app.App) (err error) {
|
func (c *treeCache) Init(a *app.App) (err error) {
|
||||||
c.clientService = a.MustComponent(clientspace.CName).(clientspace.Service)
|
c.clientService = a.MustComponent(clientspace.CName).(clientspace.Service)
|
||||||
c.account = a.MustComponent(account.CName).(account.Service)
|
c.account = a.MustComponent(accountservice.CName).(accountservice.Service)
|
||||||
c.cache = ocache.New(
|
c.cache = ocache.New(
|
||||||
func(ctx context.Context, id string) (value ocache.Object, err error) {
|
func(ctx context.Context, id string) (value ocache.Object, err error) {
|
||||||
spaceId := ctx.Value(spaceKey).(string)
|
spaceId := ctx.Value(spaceKey).(string)
|
||||||
|
@ -98,7 +98,7 @@ func (c *treeCache) GetDocument(ctx context.Context, spaceId, id string) (doc te
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr tree.ObjectTree, err error) {
|
func (c *treeCache) GetTree(ctx context.Context, spaceId, id string) (tr objecttree.ObjectTree, err error) {
|
||||||
doc, err := c.GetDocument(ctx, spaceId, id)
|
doc, err := c.GetDocument(ctx, spaceId, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
|
|
@ -4,12 +4,13 @@ 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/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ocache"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
config2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -31,14 +32,14 @@ type Service interface {
|
||||||
type service struct {
|
type service struct {
|
||||||
conf config2.Space
|
conf config2.Space
|
||||||
spaceCache ocache.OCache
|
spaceCache ocache.OCache
|
||||||
commonSpace commonspace.Service
|
commonSpace commonspace.SpaceService
|
||||||
spaceStorageProvider storage.SpaceStorageProvider
|
spaceStorageProvider spacestorage.SpaceStorageProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Init(a *app.App) (err error) {
|
func (s *service) Init(a *app.App) (err error) {
|
||||||
s.conf = a.MustComponent(config2.CName).(*config2.Config).Space
|
s.conf = a.MustComponent(config2.CName).(*config2.Config).Space
|
||||||
s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.Service)
|
s.commonSpace = a.MustComponent(commonspace.CName).(commonspace.SpaceService)
|
||||||
s.spaceStorageProvider = a.MustComponent(storage.CName).(storage.SpaceStorageProvider)
|
s.spaceStorageProvider = a.MustComponent(spacestorage.CName).(spacestorage.SpaceStorageProvider)
|
||||||
s.spaceCache = ocache.New(
|
s.spaceCache = ocache.New(
|
||||||
s.loadSpace,
|
s.loadSpace,
|
||||||
ocache.WithLogger(log.Sugar()),
|
ocache.WithLogger(log.Sugar()),
|
||||||
|
@ -99,7 +100,7 @@ func (s *service) loadSpace(ctx context.Context, id string) (value ocache.Object
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ns.StatusService().SetUpdateReceiver(&statusReceiver{})
|
ns.SyncStatus().(syncstatus.SyncStatusWatcher).SetUpdateReceiver(&statusReceiver{})
|
||||||
if err = ns.Init(ctx); err != nil {
|
if err = ns.Init(ctx); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,10 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/account"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/api"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/debug/clientdebugrpc"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/rpcstore"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/filestorage/rpcstore"
|
||||||
|
@ -22,7 +22,7 @@ import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/dialer"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secureservice"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
@ -104,7 +104,7 @@ func Bootstrap(a *app.App) {
|
||||||
Register(badgerprovider.New()).
|
Register(badgerprovider.New()).
|
||||||
Register(storage.New()).
|
Register(storage.New()).
|
||||||
Register(clientcache.New(200)).
|
Register(clientcache.New(200)).
|
||||||
Register(secure.New()).
|
Register(secureservice.New()).
|
||||||
Register(dialer.New()).
|
Register(dialer.New()).
|
||||||
Register(pool.New()).
|
Register(pool.New()).
|
||||||
Register(commonspace.New()).
|
Register(commonspace.New()).
|
||||||
|
@ -114,5 +114,5 @@ func Bootstrap(a *app.App) {
|
||||||
Register(rpcstore.New()).
|
Register(rpcstore.New()).
|
||||||
Register(fileservice.New()).
|
Register(fileservice.New()).
|
||||||
Register(filestorage.New()).
|
Register(filestorage.New()).
|
||||||
Register(api.New())
|
Register(clientdebugrpc.New())
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,51 +1,54 @@
|
||||||
package api
|
package clientdebugrpc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/api/apiproto"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/debug/clientdebugrpc/clientdebugrpcproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
|
||||||
clientstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage"
|
clientstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
||||||
"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/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileservice"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/server"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secure"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/secureservice"
|
||||||
"storj.io/drpc"
|
"storj.io/drpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
const CName = "api.service"
|
const CName = "debug.clientdebugrpc"
|
||||||
|
|
||||||
var log = logger.NewNamed(CName)
|
var log = logger.NewNamed(CName)
|
||||||
|
|
||||||
func New() Service {
|
func New() ClientDebugRpc {
|
||||||
return &service{BaseDrpcServer: server.NewBaseDrpcServer()}
|
return &service{BaseDrpcServer: server.NewBaseDrpcServer()}
|
||||||
}
|
}
|
||||||
|
|
||||||
type Service interface {
|
type ClientDebugRpc interface {
|
||||||
app.ComponentRunnable
|
app.ComponentRunnable
|
||||||
drpc.Mux
|
drpc.Mux
|
||||||
}
|
}
|
||||||
|
|
||||||
type service struct {
|
type service struct {
|
||||||
transport secure.Service
|
transport secureservice.SecureService
|
||||||
cfg *config.Config
|
cfg *config.Config
|
||||||
spaceService clientspace.Service
|
spaceService clientspace.Service
|
||||||
storageService clientstorage.ClientStorage
|
storageService clientstorage.ClientStorage
|
||||||
docService document.Service
|
docService document.Service
|
||||||
account account.Service
|
account accountservice.Service
|
||||||
|
file fileservice.FileService
|
||||||
*server.BaseDrpcServer
|
*server.BaseDrpcServer
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Init(a *app.App) (err error) {
|
func (s *service) Init(a *app.App) (err error) {
|
||||||
s.spaceService = a.MustComponent(clientspace.CName).(clientspace.Service)
|
s.spaceService = a.MustComponent(clientspace.CName).(clientspace.Service)
|
||||||
s.storageService = a.MustComponent(storage.CName).(clientstorage.ClientStorage)
|
s.storageService = a.MustComponent(spacestorage.CName).(clientstorage.ClientStorage)
|
||||||
s.docService = a.MustComponent(document.CName).(document.Service)
|
s.docService = a.MustComponent(document.CName).(document.Service)
|
||||||
s.account = a.MustComponent(account.CName).(account.Service)
|
s.account = a.MustComponent(accountservice.CName).(accountservice.Service)
|
||||||
s.cfg = a.MustComponent(config.CName).(*config.Config)
|
s.cfg = a.MustComponent(config.CName).(*config.Config)
|
||||||
s.transport = a.MustComponent(secure.CName).(secure.Service)
|
s.transport = a.MustComponent(secureservice.CName).(secureservice.SecureService)
|
||||||
|
s.file = a.MustComponent(fileservice.CName).(fileservice.FileService)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,11 +70,12 @@ func (s *service) Run(ctx context.Context) (err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return apiproto.DRPCRegisterClientApi(s, &rpcHandler{
|
return clientdebugrpcproto.DRPCRegisterClientApi(s, &rpcHandler{
|
||||||
spaceService: s.spaceService,
|
spaceService: s.spaceService,
|
||||||
storageService: s.storageService,
|
storageService: s.storageService,
|
||||||
docService: s.docService,
|
docService: s.docService,
|
||||||
account: s.account,
|
account: s.account,
|
||||||
|
file: s.file,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
||||||
// source: api/apiproto/protos/api.proto
|
// source: api/apiproto/protos/api.proto
|
||||||
|
|
||||||
package apiproto
|
package clientdebugrpcproto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
fmt "fmt"
|
fmt "fmt"
|
|
@ -2,7 +2,7 @@
|
||||||
// protoc-gen-go-drpc version: v0.0.32
|
// protoc-gen-go-drpc version: v0.0.32
|
||||||
// source: api/apiproto/protos/api.proto
|
// source: api/apiproto/protos/api.proto
|
||||||
|
|
||||||
package apiproto
|
package clientdebugrpcproto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
bytes "bytes"
|
bytes "bytes"
|
222
client/debug/clientdebugrpc/rpchandler.go
Normal file
222
client/debug/clientdebugrpc/rpchandler.go
Normal file
|
@ -0,0 +1,222 @@
|
||||||
|
package clientdebugrpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/debug/clientdebugrpc/clientdebugrpcproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/storage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonfile/fileservice"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
||||||
|
"github.com/ipfs/go-cid"
|
||||||
|
"go.uber.org/zap"
|
||||||
|
"io"
|
||||||
|
"math/rand"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
type rpcHandler struct {
|
||||||
|
spaceService clientspace.Service
|
||||||
|
storageService storage.ClientStorage
|
||||||
|
docService document.Service
|
||||||
|
account accountservice.Service
|
||||||
|
file fileservice.FileService
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) Watch(ctx context.Context, request *clientdebugrpcproto.WatchRequest) (resp *clientdebugrpcproto.WatchResponse, err error) {
|
||||||
|
space, err := r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
watcher := space.SyncStatus().(syncstatus.SyncStatusWatcher)
|
||||||
|
watcher.Watch(request.TreeId)
|
||||||
|
resp = &clientdebugrpcproto.WatchResponse{}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) Unwatch(ctx context.Context, request *clientdebugrpcproto.UnwatchRequest) (resp *clientdebugrpcproto.UnwatchResponse, err error) {
|
||||||
|
space, err := r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
watcher := space.SyncStatus().(syncstatus.SyncStatusWatcher)
|
||||||
|
watcher.Unwatch(request.TreeId)
|
||||||
|
resp = &clientdebugrpcproto.UnwatchResponse{}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) LoadSpace(ctx context.Context, request *clientdebugrpcproto.LoadSpaceRequest) (resp *clientdebugrpcproto.LoadSpaceResponse, err error) {
|
||||||
|
_, err = r.spaceService.GetSpace(context.Background(), request.SpaceId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.LoadSpaceResponse{}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) CreateSpace(ctx context.Context, request *clientdebugrpcproto.CreateSpaceRequest) (resp *clientdebugrpcproto.CreateSpaceResponse, err error) {
|
||||||
|
key, err := symmetric.NewRandom()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sp, err := r.spaceService.CreateSpace(context.Background(), commonspace.SpaceCreatePayload{
|
||||||
|
SigningKey: r.account.Account().SignKey,
|
||||||
|
EncryptionKey: r.account.Account().EncKey,
|
||||||
|
ReadKey: key.Bytes(),
|
||||||
|
ReplicationKey: rand.Uint64(),
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id := sp.Id()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.CreateSpaceResponse{Id: id}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) DeriveSpace(ctx context.Context, request *clientdebugrpcproto.DeriveSpaceRequest) (resp *clientdebugrpcproto.DeriveSpaceResponse, err error) {
|
||||||
|
sp, err := r.spaceService.DeriveSpace(context.Background(), commonspace.SpaceDerivePayload{
|
||||||
|
SigningKey: r.account.Account().SignKey,
|
||||||
|
EncryptionKey: r.account.Account().EncKey,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id := sp.Id()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.DeriveSpaceResponse{Id: id}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) CreateDocument(ctx context.Context, request *clientdebugrpcproto.CreateDocumentRequest) (resp *clientdebugrpcproto.CreateDocumentResponse, err error) {
|
||||||
|
id, err := r.docService.CreateDocument(request.SpaceId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.CreateDocumentResponse{Id: id}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) DeleteDocument(ctx context.Context, request *clientdebugrpcproto.DeleteDocumentRequest) (resp *clientdebugrpcproto.DeleteDocumentResponse, err error) {
|
||||||
|
err = r.docService.DeleteDocument(request.SpaceId, request.DocumentId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.DeleteDocumentResponse{}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) AddText(ctx context.Context, request *clientdebugrpcproto.AddTextRequest) (resp *clientdebugrpcproto.AddTextResponse, err error) {
|
||||||
|
root, head, err := r.docService.AddText(request.SpaceId, request.DocumentId, request.Text, request.IsSnapshot)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.AddTextResponse{
|
||||||
|
DocumentId: request.DocumentId,
|
||||||
|
HeadId: head,
|
||||||
|
RootId: root,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) DumpTree(ctx context.Context, request *clientdebugrpcproto.DumpTreeRequest) (resp *clientdebugrpcproto.DumpTreeResponse, err error) {
|
||||||
|
dump, err := r.docService.DumpDocumentTree(request.SpaceId, request.DocumentId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.DumpTreeResponse{
|
||||||
|
Dump: dump,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) AllTrees(ctx context.Context, request *clientdebugrpcproto.AllTreesRequest) (resp *clientdebugrpcproto.AllTreesResponse, err error) {
|
||||||
|
heads, err := r.docService.AllDocumentHeads(request.SpaceId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
var trees []*clientdebugrpcproto.Tree
|
||||||
|
for _, head := range heads {
|
||||||
|
trees = append(trees, &clientdebugrpcproto.Tree{
|
||||||
|
Id: head.Id,
|
||||||
|
Heads: head.Heads,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.AllTreesResponse{Trees: trees}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) AllSpaces(ctx context.Context, request *clientdebugrpcproto.AllSpacesRequest) (resp *clientdebugrpcproto.AllSpacesResponse, err error) {
|
||||||
|
ids, err := r.storageService.AllSpaceIds()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.AllSpacesResponse{SpaceIds: ids}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) TreeParams(ctx context.Context, request *clientdebugrpcproto.TreeParamsRequest) (resp *clientdebugrpcproto.TreeParamsResponse, err error) {
|
||||||
|
root, heads, err := r.docService.TreeParams(request.SpaceId, request.DocumentId)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
resp = &clientdebugrpcproto.TreeParamsResponse{
|
||||||
|
RootId: root,
|
||||||
|
HeadIds: heads,
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) PutFile(ctx context.Context, request *clientdebugrpcproto.PutFileRequest) (*clientdebugrpcproto.PutFileResponse, error) {
|
||||||
|
f, err := os.Open(request.Path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
n, err := r.file.AddFile(ctx, f)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &clientdebugrpcproto.PutFileResponse{
|
||||||
|
Hash: n.Cid().String(),
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) GetFile(ctx context.Context, request *clientdebugrpcproto.GetFileRequest) (*clientdebugrpcproto.GetFileResponse, error) {
|
||||||
|
c, err := cid.Parse(request.Hash)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
f, err := os.Create(request.Path)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
rd, err := r.file.GetFile(ctx, c)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rd.Close()
|
||||||
|
wr, err := io.Copy(f, rd)
|
||||||
|
if err != nil && err != io.EOF {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
log.Info("copied bytes", zap.Int64("size", wr))
|
||||||
|
return &clientdebugrpcproto.GetFileResponse{
|
||||||
|
Path: request.Path,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rpcHandler) DeleteFile(ctx context.Context, request *clientdebugrpcproto.DeleteFileRequest) (*clientdebugrpcproto.DeleteFileResponse, error) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
|
@ -5,10 +5,11 @@ import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/clientspace/clientcache"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textdocument"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
||||||
"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/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Service interface {
|
type Service interface {
|
||||||
|
@ -27,7 +28,7 @@ const CName = "client.document"
|
||||||
var log = logger.NewNamed(CName)
|
var log = logger.NewNamed(CName)
|
||||||
|
|
||||||
type service struct {
|
type service struct {
|
||||||
account account.Service
|
account accountservice.Service
|
||||||
spaceService clientspace.Service
|
spaceService clientspace.Service
|
||||||
cache clientcache.TreeCache
|
cache clientcache.TreeCache
|
||||||
}
|
}
|
||||||
|
@ -37,7 +38,7 @@ func New() Service {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *service) Init(a *app.App) (err error) {
|
func (s *service) Init(a *app.App) (err error) {
|
||||||
s.account = a.MustComponent(account.CName).(account.Service)
|
s.account = a.MustComponent(accountservice.CName).(accountservice.Service)
|
||||||
s.spaceService = a.MustComponent(clientspace.CName).(clientspace.Service)
|
s.spaceService = a.MustComponent(clientspace.CName).(clientspace.Service)
|
||||||
s.cache = a.MustComponent(treegetter.CName).(clientcache.TreeCache)
|
s.cache = a.MustComponent(treegetter.CName).(clientcache.TreeCache)
|
||||||
return
|
return
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
package anytype;
|
package textchange;
|
||||||
option go_package = "testchanges";
|
option go_package = "textchange";
|
||||||
|
|
||||||
message TextContent {
|
message TextContent {
|
||||||
oneof value {
|
oneof value {
|
|
@ -1,7 +1,7 @@
|
||||||
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
// Code generated by protoc-gen-gogo. DO NOT EDIT.
|
||||||
// source: pkg/acl/testutils/testchanges/proto/test.proto
|
// source: pkg/acl/testutils/testchanges/proto/test.proto
|
||||||
|
|
||||||
package testchanges
|
package textchangeproto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
fmt "fmt"
|
fmt "fmt"
|
|
@ -2,17 +2,17 @@ package textdocument
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/account"
|
textchange "github.com/anytypeio/go-anytype-infrastructure-experiments/client/document/textchangeproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
testchanges "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/testchanges/proto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TextDocument interface {
|
type TextDocument interface {
|
||||||
tree.ObjectTree
|
objecttree.ObjectTree
|
||||||
InnerTree() tree.ObjectTree
|
InnerTree() objecttree.ObjectTree
|
||||||
AddText(text string, isSnapshot bool) (string, string, error)
|
AddText(text string, isSnapshot bool) (string, string, error)
|
||||||
Text() (string, error)
|
Text() (string, error)
|
||||||
TreeDump() string
|
TreeDump() string
|
||||||
|
@ -20,15 +20,15 @@ type TextDocument interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type textDocument struct {
|
type textDocument struct {
|
||||||
tree.ObjectTree
|
objecttree.ObjectTree
|
||||||
account account.Service
|
account accountservice.Service
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateTextDocument(
|
func CreateTextDocument(
|
||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
space commonspace.Space,
|
space commonspace.Space,
|
||||||
account account.Service) (id string, err error) {
|
account accountservice.Service) (id string, err error) {
|
||||||
payload := tree.ObjectTreeCreatePayload{
|
payload := objecttree.ObjectTreeCreatePayload{
|
||||||
SignKey: account.Account().SignKey,
|
SignKey: account.Account().SignKey,
|
||||||
SpaceId: space.Id(),
|
SpaceId: space.Id(),
|
||||||
Identity: account.Account().Identity,
|
Identity: account.Account().Identity,
|
||||||
|
@ -36,7 +36,7 @@ func CreateTextDocument(
|
||||||
return space.CreateTree(ctx, payload)
|
return space.CreateTree(ctx, payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account account.Service) (doc TextDocument, err error) {
|
func NewTextDocument(ctx context.Context, space commonspace.Space, id string, listener updatelistener.UpdateListener, account accountservice.Service) (doc TextDocument, err error) {
|
||||||
t, err := space.BuildTree(ctx, id, listener)
|
t, err := space.BuildTree(ctx, id, listener)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
@ -47,16 +47,16 @@ func NewTextDocument(ctx context.Context, space commonspace.Space, id string, li
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *textDocument) InnerTree() tree.ObjectTree {
|
func (t *textDocument) InnerTree() objecttree.ObjectTree {
|
||||||
return t.ObjectTree
|
return t.ObjectTree
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *textDocument) AddText(text string, isSnapshot bool) (root, head string, err error) {
|
func (t *textDocument) AddText(text string, isSnapshot bool) (root, head string, err error) {
|
||||||
content := &testchanges.TextContent_TextAppend{
|
content := &textchange.TextContent_TextAppend{
|
||||||
TextAppend: &testchanges.TextAppend{Text: text},
|
TextAppend: &textchange.TextAppend{Text: text},
|
||||||
}
|
}
|
||||||
change := &testchanges.TextData{
|
change := &textchange.TextData{
|
||||||
Content: []*testchanges.TextContent{
|
Content: []*textchange.TextContent{
|
||||||
{content},
|
{content},
|
||||||
},
|
},
|
||||||
Snapshot: nil,
|
Snapshot: nil,
|
||||||
|
@ -67,7 +67,7 @@ func (t *textDocument) AddText(text string, isSnapshot bool) (root, head string,
|
||||||
}
|
}
|
||||||
t.Lock()
|
t.Lock()
|
||||||
defer t.Unlock()
|
defer t.Unlock()
|
||||||
addRes, err := t.AddContent(context.Background(), tree.SignableChangeContent{
|
addRes, err := t.AddContent(context.Background(), objecttree.SignableChangeContent{
|
||||||
Data: res,
|
Data: res,
|
||||||
Key: t.account.Account().SignKey,
|
Key: t.account.Account().SignKey,
|
||||||
Identity: t.account.Account().Identity,
|
Identity: t.account.Account().Identity,
|
||||||
|
@ -87,7 +87,7 @@ func (t *textDocument) Text() (text string, err error) {
|
||||||
|
|
||||||
err = t.Iterate(
|
err = t.Iterate(
|
||||||
func(decrypted []byte) (any, error) {
|
func(decrypted []byte) (any, error) {
|
||||||
textChange := &testchanges.TextData{}
|
textChange := &textchange.TextData{}
|
||||||
err = proto.Unmarshal(decrypted, textChange)
|
err = proto.Unmarshal(decrypted, textChange)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -98,7 +98,7 @@ func (t *textDocument) Text() (text string, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return textChange, nil
|
return textChange, nil
|
||||||
}, func(change *tree.Change) bool {
|
}, func(change *objecttree.Change) bool {
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
|
|
|
@ -3,7 +3,7 @@ package rpcstore
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ocache"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ocache"
|
||||||
"github.com/cheggaaa/mb/v3"
|
"github.com/cheggaaa/mb/v3"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
)
|
)
|
||||||
|
|
||||||
type aclKeys struct {
|
type aclKeys struct {
|
||||||
|
@ -13,8 +13,8 @@ type aclKeys struct {
|
||||||
func newACLKeys(spaceId string) aclKeys {
|
func newACLKeys(spaceId string) aclKeys {
|
||||||
return aclKeys{
|
return aclKeys{
|
||||||
spaceId: spaceId,
|
spaceId: spaceId,
|
||||||
rootKey: storage.JoinStringsToBytes("space", spaceId, "a", "rootId"),
|
rootKey: treestorage.JoinStringsToBytes("space", spaceId, "a", "rootId"),
|
||||||
headKey: storage.JoinStringsToBytes("space", spaceId, "a", "headId"),
|
headKey: treestorage.JoinStringsToBytes("space", spaceId, "a", "headId"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ func (a aclKeys) RootIdKey() []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a aclKeys) RawRecordKey(id string) []byte {
|
func (a aclKeys) RawRecordKey(id string) []byte {
|
||||||
return storage.JoinStringsToBytes("space", a.spaceId, "a", id)
|
return treestorage.JoinStringsToBytes("space", a.spaceId, "a", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
type treeKeys struct {
|
type treeKeys struct {
|
||||||
|
@ -42,9 +42,9 @@ func newTreeKeys(spaceId, id string) treeKeys {
|
||||||
return treeKeys{
|
return treeKeys{
|
||||||
id: id,
|
id: id,
|
||||||
spaceId: spaceId,
|
spaceId: spaceId,
|
||||||
headsKey: storage.JoinStringsToBytes("space", spaceId, "t", id, "heads"),
|
headsKey: treestorage.JoinStringsToBytes("space", spaceId, "t", id, "heads"),
|
||||||
rootKey: storage.JoinStringsToBytes("space", spaceId, "t", "rootId", id),
|
rootKey: treestorage.JoinStringsToBytes("space", spaceId, "t", "rootId", id),
|
||||||
rawChangePrefix: storage.JoinStringsToBytes("space", spaceId, "t", id),
|
rawChangePrefix: treestorage.JoinStringsToBytes("space", spaceId, "t", id),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ func (t treeKeys) RootIdKey() []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t treeKeys) RawChangeKey(id string) []byte {
|
func (t treeKeys) RawChangeKey(id string) []byte {
|
||||||
return storage.JoinStringsToBytes("space", t.spaceId, "t", t.id, id)
|
return treestorage.JoinStringsToBytes("space", t.spaceId, "t", t.id, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t treeKeys) RawChangePrefix() []byte {
|
func (t treeKeys) RawChangePrefix() []byte {
|
||||||
|
@ -74,9 +74,9 @@ type spaceKeys struct {
|
||||||
func newSpaceKeys(spaceId string) spaceKeys {
|
func newSpaceKeys(spaceId string) spaceKeys {
|
||||||
return spaceKeys{
|
return spaceKeys{
|
||||||
spaceId: spaceId,
|
spaceId: spaceId,
|
||||||
headerKey: storage.JoinStringsToBytes("space", "header", spaceId),
|
headerKey: treestorage.JoinStringsToBytes("space", "header", spaceId),
|
||||||
treePrefixKey: storage.JoinStringsToBytes("space", spaceId, "t", "rootId"),
|
treePrefixKey: treestorage.JoinStringsToBytes("space", spaceId, "t", "rootId"),
|
||||||
spaceSettingsIdKey: storage.JoinStringsToBytes("space", spaceId, "spaceSettingsId"),
|
spaceSettingsIdKey: treestorage.JoinStringsToBytes("space", spaceId, "spaceSettingsId"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ func (s spaceKeys) SpaceSettingsId() []byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s spaceKeys) TreeDeletedKey(id string) []byte {
|
func (s spaceKeys) TreeDeletedKey(id string) []byte {
|
||||||
return storage.JoinStringsToBytes("space", s.spaceId, "deleted", id)
|
return treestorage.JoinStringsToBytes("space", s.spaceId, "deleted", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
type storageServiceKeys struct {
|
type storageServiceKeys struct {
|
||||||
|
|
|
@ -3,8 +3,8 @@ package storage
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage"
|
||||||
"github.com/dgraph-io/badger/v3"
|
"github.com/dgraph-io/badger/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ type listStorage struct {
|
||||||
root *aclrecordproto.RawACLRecordWithId
|
root *aclrecordproto.RawACLRecordWithId
|
||||||
}
|
}
|
||||||
|
|
||||||
func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage.ListStorage, err error) {
|
func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls liststorage.ListStorage, err error) {
|
||||||
keys := newACLKeys(spaceId)
|
keys := newACLKeys(spaceId)
|
||||||
rootId, err := getTxn(txn, keys.RootIdKey())
|
rootId, err := getTxn(txn, keys.RootIdKey())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -44,7 +44,7 @@ func newListStorage(spaceId string, db *badger.DB, txn *badger.Txn) (ls storage.
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *aclrecordproto.RawACLRecordWithId) (ls storage.ListStorage, err error) {
|
func createListStorage(spaceId string, db *badger.DB, txn *badger.Txn, root *aclrecordproto.RawACLRecordWithId) (ls liststorage.ListStorage, err error) {
|
||||||
keys := newACLKeys(spaceId)
|
keys := newACLKeys(spaceId)
|
||||||
_, err = getTxn(txn, keys.RootIdKey())
|
_, err = getTxn(txn, keys.RootIdKey())
|
||||||
if err != badger.ErrKeyNotFound {
|
if err != badger.ErrKeyNotFound {
|
||||||
|
@ -98,7 +98,7 @@ func (l *listStorage) GetRawRecord(ctx context.Context, id string) (raw *aclreco
|
||||||
res, err := getDB(l.db, l.keys.RawRecordKey(id))
|
res, err := getDB(l.db, l.keys.RawRecordKey(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == badger.ErrKeyNotFound {
|
if err == badger.ErrKeyNotFound {
|
||||||
err = storage.ErrUnknownRecord
|
err = liststorage.ErrUnknownRecord
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,15 +2,15 @@ package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage"
|
||||||
"github.com/dgraph-io/badger/v3"
|
"github.com/dgraph-io/badger/v3"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func testList(t *testing.T, store storage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) {
|
func testList(t *testing.T, store liststorage.ListStorage, root *aclrecordproto.RawACLRecordWithId, head string) {
|
||||||
require.Equal(t, store.ID(), root.Id)
|
require.Equal(t, store.Id(), root.Id)
|
||||||
|
|
||||||
aclRoot, err := store.Root()
|
aclRoot, err := store.Root()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -34,7 +34,7 @@ func TestListStorage(t *testing.T) {
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
var listStore storage.ListStorage
|
var listStore liststorage.ListStorage
|
||||||
fx.db.View(func(txn *badger.Txn) (err error) {
|
fx.db.View(func(txn *badger.Txn) (err error) {
|
||||||
listStore, err = newListStorage(spaceId, fx.db, txn)
|
listStore, err = newListStorage(spaceId, fx.db, txn)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
|
storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
|
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
|
||||||
storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
"github.com/dgraph-io/badger/v3"
|
"github.com/dgraph-io/badger/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -13,7 +14,7 @@ type spaceStorage struct {
|
||||||
spaceSettingsId string
|
spaceSettingsId string
|
||||||
objDb *badger.DB
|
objDb *badger.DB
|
||||||
keys spaceKeys
|
keys spaceKeys
|
||||||
aclStorage storage.ListStorage
|
aclStorage liststorage.ListStorage
|
||||||
header *spacesyncproto.RawSpaceHeaderWithId
|
header *spacesyncproto.RawSpaceHeaderWithId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +120,7 @@ func (s *spaceStorage) CreateTreeStorage(payload storage.TreeStorageCreatePayloa
|
||||||
return createTreeStorage(s.objDb, s.spaceId, payload)
|
return createTreeStorage(s.objDb, s.spaceId, payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *spaceStorage) ACLStorage() (storage.ListStorage, error) {
|
func (s *spaceStorage) ACLStorage() (liststorage.ListStorage, error) {
|
||||||
return s.aclStorage, nil
|
return s.aclStorage, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
|
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/client/badgerprovider"
|
||||||
"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/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
"github.com/dgraph-io/badger/v3"
|
"github.com/dgraph-io/badger/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ type storageService struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ClientStorage interface {
|
type ClientStorage interface {
|
||||||
storage.SpaceStorageProvider
|
spacestorage.SpaceStorageProvider
|
||||||
app.ComponentRunnable
|
app.ComponentRunnable
|
||||||
AllSpaceIds() (ids []string, err error)
|
AllSpaceIds() (ids []string, err error)
|
||||||
}
|
}
|
||||||
|
@ -31,14 +31,14 @@ func (s *storageService) Init(a *app.App) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *storageService) Name() (name string) {
|
func (s *storageService) Name() (name string) {
|
||||||
return storage.CName
|
return spacestorage.CName
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *storageService) SpaceStorage(id string) (storage.SpaceStorage, error) {
|
func (s *storageService) SpaceStorage(id string) (spacestorage.SpaceStorage, error) {
|
||||||
return newSpaceStorage(s.db, id)
|
return newSpaceStorage(s.db, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *storageService) CreateSpaceStorage(payload storage.SpaceStorageCreatePayload) (storage.SpaceStorage, error) {
|
func (s *storageService) CreateSpaceStorage(payload spacestorage.SpaceStorageCreatePayload) (spacestorage.SpaceStorage, error) {
|
||||||
return createSpaceStorage(s.db, payload)
|
return createSpaceStorage(s.db, payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/dgraph-io/badger/v3"
|
"github.com/dgraph-io/badger/v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ type treeStorage struct {
|
||||||
root *treechangeproto.RawTreeChangeWithId
|
root *treechangeproto.RawTreeChangeWithId
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStorage, err error) {
|
func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts treestorage.TreeStorage, err error) {
|
||||||
keys := newTreeKeys(spaceId, treeId)
|
keys := newTreeKeys(spaceId, treeId)
|
||||||
err = db.View(func(txn *badger.Txn) error {
|
err = db.View(func(txn *badger.Txn) error {
|
||||||
_, err := txn.Get(keys.RootIdKey())
|
_, err := txn.Get(keys.RootIdKey())
|
||||||
|
@ -40,17 +40,20 @@ func newTreeStorage(db *badger.DB, spaceId, treeId string) (ts storage.TreeStora
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
if err == badger.ErrKeyNotFound {
|
||||||
|
err = treestorage.ErrUnknownTreeId
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func createTreeStorage(db *badger.DB, spaceId string, payload storage.TreeStorageCreatePayload) (ts storage.TreeStorage, err error) {
|
func createTreeStorage(db *badger.DB, spaceId string, payload treestorage.TreeStorageCreatePayload) (ts treestorage.TreeStorage, err error) {
|
||||||
keys := newTreeKeys(spaceId, payload.TreeId)
|
keys := newTreeKeys(spaceId, payload.RootRawChange.Id)
|
||||||
if hasDB(db, keys.RootIdKey()) {
|
if hasDB(db, keys.RootIdKey()) {
|
||||||
err = storage.ErrTreeExists
|
err = treestorage.ErrTreeExists
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = db.Update(func(txn *badger.Txn) error {
|
err = db.Update(func(txn *badger.Txn) error {
|
||||||
heads := storage.CreateHeadsPayload(payload.Heads)
|
heads := treestorage.CreateHeadsPayload(payload.Heads)
|
||||||
|
|
||||||
for _, ch := range payload.Changes {
|
for _, ch := range payload.Changes {
|
||||||
err = txn.Set(keys.RawChangeKey(ch.Id), ch.GetRawChange())
|
err = txn.Set(keys.RawChangeKey(ch.Id), ch.GetRawChange())
|
||||||
|
@ -97,16 +100,16 @@ func (t *treeStorage) Heads() (heads []string, err error) {
|
||||||
headsBytes, err := getDB(t.db, t.keys.HeadsKey())
|
headsBytes, err := getDB(t.db, t.keys.HeadsKey())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == badger.ErrKeyNotFound {
|
if err == badger.ErrKeyNotFound {
|
||||||
err = storage.ErrUnknownTreeId
|
err = treestorage.ErrUnknownTreeId
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
heads = storage.ParseHeads(headsBytes)
|
heads = treestorage.ParseHeads(headsBytes)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *treeStorage) SetHeads(heads []string) (err error) {
|
func (t *treeStorage) SetHeads(heads []string) (err error) {
|
||||||
payload := storage.CreateHeadsPayload(heads)
|
payload := treestorage.CreateHeadsPayload(heads)
|
||||||
return putDB(t.db, t.keys.HeadsKey(), payload)
|
return putDB(t.db, t.keys.HeadsKey(), payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +121,7 @@ func (t *treeStorage) GetRawChange(ctx context.Context, id string) (raw *treecha
|
||||||
res, err := getDB(t.db, t.keys.RawChangeKey(id))
|
res, err := getDB(t.db, t.keys.RawChangeKey(id))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == badger.ErrKeyNotFound {
|
if err == badger.ErrKeyNotFound {
|
||||||
err = storage.ErrUnknownTreeId
|
err = treestorage.ErrUnknownTreeId
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,19 +2,19 @@ package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/dgraph-io/badger/v3"
|
"github.com/dgraph-io/badger/v3"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func treeTestPayload() storage.TreeStorageCreatePayload {
|
func treeTestPayload() treestorage.TreeStorageCreatePayload {
|
||||||
rootRawChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some"), Id: "someRootId"}
|
rootRawChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some"), Id: "someRootId"}
|
||||||
otherChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some other"), Id: "otherId"}
|
otherChange := &treechangeproto.RawTreeChangeWithId{RawChange: []byte("some other"), Id: "otherId"}
|
||||||
changes := []*treechangeproto.RawTreeChangeWithId{rootRawChange, otherChange}
|
changes := []*treechangeproto.RawTreeChangeWithId{rootRawChange, otherChange}
|
||||||
return storage.TreeStorageCreatePayload{
|
return treestorage.TreeStorageCreatePayload{
|
||||||
RootRawChange: rootRawChange,
|
RootRawChange: rootRawChange,
|
||||||
Changes: changes,
|
Changes: changes,
|
||||||
Heads: []string{rootRawChange.Id},
|
Heads: []string{rootRawChange.Id},
|
||||||
|
@ -26,8 +26,8 @@ type fixture struct {
|
||||||
db *badger.DB
|
db *badger.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
func testTreePayload(t *testing.T, store storage.TreeStorage, payload storage.TreeStorageCreatePayload) {
|
func testTreePayload(t *testing.T, store treestorage.TreeStorage, payload treestorage.TreeStorageCreatePayload) {
|
||||||
require.Equal(t, payload.RootRawChange.Id, store.ID())
|
require.Equal(t, payload.RootRawChange.Id, store.Id())
|
||||||
|
|
||||||
root, err := store.Root()
|
root, err := store.Root()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@ -181,7 +181,7 @@ func TestTreeStorage_Delete(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = newTreeStorage(fx.db, spaceId, payload.RootRawChange.Id)
|
_, err = newTreeStorage(fx.db, spaceId, payload.RootRawChange.Id)
|
||||||
require.Equal(t, err, storage.ErrUnknownTreeId)
|
require.Equal(t, err, treestorage.ErrUnknownTreeId)
|
||||||
|
|
||||||
fx.testNoKeysExist(t, spaceId, payload.RootRawChange.Id)
|
fx.testNoKeysExist(t, spaceId, payload.RootRawChange.Id)
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
//go:generate mockgen -destination mock_account/mock_account.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/account Service
|
//go:generate mockgen -destination mock_accountservice/mock_accountservice.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice Service
|
||||||
package account
|
package accountservice
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"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/accountdata"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/config"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const CName = "common.account"
|
const CName = "common.account"
|
||||||
|
|
||||||
type Service interface {
|
type Service interface {
|
||||||
app.Component
|
app.Component
|
||||||
Account() *account.AccountData
|
Account() *accountdata.AccountData
|
||||||
}
|
}
|
||||||
|
|
||||||
type ConfigGetter interface {
|
type ConfigGetter interface {
|
|
@ -1,14 +1,14 @@
|
||||||
// Code generated by MockGen. DO NOT EDIT.
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/account (interfaces: Service)
|
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/accountservice (interfaces: Service)
|
||||||
|
|
||||||
// Package mock_account is a generated GoMock package.
|
// Package mock_accountservice is a generated GoMock package.
|
||||||
package mock_account
|
package mock_accountservice
|
||||||
|
|
||||||
import (
|
import (
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
app "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app"
|
||||||
account "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account"
|
accountdata "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/accountdata"
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -36,10 +36,10 @@ func (m *MockService) EXPECT() *MockServiceMockRecorder {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Account mocks base method.
|
// Account mocks base method.
|
||||||
func (m *MockService) Account() *account.AccountData {
|
func (m *MockService) Account() *accountdata.AccountData {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Account")
|
ret := m.ctrl.Call(m, "Account")
|
||||||
ret0, _ := ret[0].(*account.AccountData)
|
ret0, _ := ret[0].(*accountdata.AccountData)
|
||||||
return ret0
|
return ret0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// Package ldiff provides a container of elements with fixed id and changeable content.
|
// Package ldiff provides a container of elements with fixed id and changeable content.
|
||||||
// Diff can calculate the difference with another diff container (you can make it remote) with minimum hops and traffic.
|
// Diff can calculate the difference with another diff container (you can make it remote) with minimum hops and traffic.
|
||||||
//
|
//
|
||||||
//go:generate mockgen -destination mock_ldiff/mock_ldiff.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff Diff,Remote
|
//go:generate mockgen -destination mock_ldiff/mock_ldiff.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff Diff,Remote
|
||||||
package ldiff
|
package ldiff
|
||||||
|
|
||||||
import (
|
import (
|
|
@ -1,5 +1,5 @@
|
||||||
// Code generated by MockGen. DO NOT EDIT.
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff (interfaces: Diff,Remote)
|
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff (interfaces: Diff,Remote)
|
||||||
|
|
||||||
// Package mock_ldiff is a generated GoMock package.
|
// Package mock_ldiff is a generated GoMock package.
|
||||||
package mock_ldiff
|
package mock_ldiff
|
||||||
|
@ -8,7 +8,7 @@ import (
|
||||||
context "context"
|
context "context"
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
ldiff "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
|
ldiff "github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
|
@ -87,9 +87,9 @@ type entry struct {
|
||||||
refCount uint32
|
refCount uint32
|
||||||
isClosing bool
|
isClosing bool
|
||||||
load chan struct{}
|
load chan struct{}
|
||||||
loadErr error
|
loadErr error
|
||||||
value Object
|
value Object
|
||||||
close chan struct{}
|
close chan struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *entry) locked() bool {
|
func (e *entry) locked() bool {
|
|
@ -2,10 +2,10 @@ package commonspace
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectgetter"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/syncacl"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/syncobjectgetter"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncacl"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type commonSpaceGetter struct {
|
type commonSpaceGetter struct {
|
||||||
|
@ -15,7 +15,7 @@ type commonSpaceGetter struct {
|
||||||
settings settings.SettingsObject
|
settings settings.SettingsObject
|
||||||
}
|
}
|
||||||
|
|
||||||
func newCommonSpaceGetter(spaceId string, aclList *syncacl.SyncACL, treeGetter treegetter.TreeGetter, settings settings.SettingsObject) objectgetter.ObjectGetter {
|
func newCommonSpaceGetter(spaceId string, aclList *syncacl.SyncACL, treeGetter treegetter.TreeGetter, settings settings.SettingsObject) syncobjectgetter.SyncObjectGetter {
|
||||||
return &commonSpaceGetter{
|
return &commonSpaceGetter{
|
||||||
spaceId: spaceId,
|
spaceId: spaceId,
|
||||||
aclList: aclList,
|
aclList: aclList,
|
||||||
|
@ -24,19 +24,19 @@ func newCommonSpaceGetter(spaceId string, aclList *syncacl.SyncACL, treeGetter t
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *commonSpaceGetter) GetObject(ctx context.Context, objectId string) (obj objectgetter.Object, err error) {
|
func (c *commonSpaceGetter) GetObject(ctx context.Context, objectId string) (obj syncobjectgetter.SyncObject, err error) {
|
||||||
if c.aclList.ID() == objectId {
|
if c.aclList.ID() == objectId {
|
||||||
obj = c.aclList
|
obj = c.aclList
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if c.settings.ID() == objectId {
|
if c.settings.ID() == objectId {
|
||||||
obj = c.settings.(objectgetter.Object)
|
obj = c.settings.(syncobjectgetter.SyncObject)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t, err := c.treeGetter.GetTree(ctx, c.spaceId, objectId)
|
t, err := c.treeGetter.GetTree(ctx, c.spaceId, objectId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
obj = t.(objectgetter.Object)
|
obj = t.(syncobjectgetter.SyncObject)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
package commonspace
|
package commonspace
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
)
|
)
|
||||||
|
|
||||||
type commonStorage struct {
|
type commonStorage struct {
|
||||||
storage.SpaceStorage
|
spacestorage.SpaceStorage
|
||||||
}
|
}
|
||||||
|
|
||||||
func newCommonStorage(spaceStorage storage.SpaceStorage) storage.SpaceStorage {
|
func newCommonStorage(spaceStorage spacestorage.SpaceStorage) spacestorage.SpaceStorage {
|
||||||
return &commonStorage{
|
return &commonStorage{
|
||||||
SpaceStorage: spaceStorage,
|
SpaceStorage: spaceStorage,
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,6 @@ func (c *commonStorage) CreateTreeStorage(payload treestorage.TreeStorageCreateP
|
||||||
if status == "" {
|
if status == "" {
|
||||||
return c.SpaceStorage.CreateTreeStorage(payload)
|
return c.SpaceStorage.CreateTreeStorage(payload)
|
||||||
}
|
}
|
||||||
err = storage.ErrTreeStorageAlreadyDeleted
|
err = spacestorage.ErrTreeStorageAlreadyDeleted
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,16 +2,16 @@ package headsync
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/rpc/rpcerr"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
|
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
@ -28,7 +28,7 @@ func newDiffSyncer(
|
||||||
diff ldiff.Diff,
|
diff ldiff.Diff,
|
||||||
confConnector nodeconf.ConfConnector,
|
confConnector nodeconf.ConfConnector,
|
||||||
cache treegetter.TreeGetter,
|
cache treegetter.TreeGetter,
|
||||||
storage storage.SpaceStorage,
|
storage spacestorage.SpaceStorage,
|
||||||
clientFactory spacesyncproto.ClientFactory,
|
clientFactory spacesyncproto.ClientFactory,
|
||||||
syncStatus syncstatus.SyncStatusUpdater,
|
syncStatus syncstatus.SyncStatusUpdater,
|
||||||
log *zap.Logger) DiffSyncer {
|
log *zap.Logger) DiffSyncer {
|
||||||
|
@ -49,7 +49,7 @@ type diffSyncer struct {
|
||||||
diff ldiff.Diff
|
diff ldiff.Diff
|
||||||
confConnector nodeconf.ConfConnector
|
confConnector nodeconf.ConfConnector
|
||||||
cache treegetter.TreeGetter
|
cache treegetter.TreeGetter
|
||||||
storage storage.SpaceStorage
|
storage spacestorage.SpaceStorage
|
||||||
clientFactory spacesyncproto.ClientFactory
|
clientFactory spacesyncproto.ClientFactory
|
||||||
log *zap.Logger
|
log *zap.Logger
|
||||||
deletionState deletionstate.DeletionState
|
deletionState deletionstate.DeletionState
|
||||||
|
|
|
@ -3,21 +3,20 @@ package headsync
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff/mock_ldiff"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
|
mock_treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage/mock_treestorage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter/mock_treegetter"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate/mock_deletionstate"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate/mock_deletionstate"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage/mock_spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto/mock_spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter/mock_treegetter"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf/mock_nodeconf"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
|
||||||
mock_aclstorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage"
|
|
||||||
mock_treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff/mock_ldiff"
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/libp2p/go-libp2p/core/sec"
|
"github.com/libp2p/go-libp2p/core/sec"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
@ -101,7 +100,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
|
||||||
diffMock := mock_ldiff.NewMockDiff(ctrl)
|
diffMock := mock_ldiff.NewMockDiff(ctrl)
|
||||||
connectorMock := mock_nodeconf.NewMockConfConnector(ctrl)
|
connectorMock := mock_nodeconf.NewMockConfConnector(ctrl)
|
||||||
cacheMock := mock_treegetter.NewMockTreeGetter(ctrl)
|
cacheMock := mock_treegetter.NewMockTreeGetter(ctrl)
|
||||||
stMock := mock_storage.NewMockSpaceStorage(ctrl)
|
stMock := mock_spacestorage.NewMockSpaceStorage(ctrl)
|
||||||
clientMock := mock_spacesyncproto.NewMockDRPCSpaceClient(ctrl)
|
clientMock := mock_spacesyncproto.NewMockDRPCSpaceClient(ctrl)
|
||||||
factory := spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceClient {
|
factory := spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceClient {
|
||||||
return clientMock
|
return clientMock
|
||||||
|
@ -158,7 +157,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("diff syncer sync space missing", func(t *testing.T) {
|
t.Run("diff syncer sync space missing", func(t *testing.T) {
|
||||||
aclStorageMock := mock_aclstorage.NewMockListStorage(ctrl)
|
aclStorageMock := mock_treestorage.NewMockListStorage(ctrl)
|
||||||
settingsStorage := mock_treestorage.NewMockTreeStorage(ctrl)
|
settingsStorage := mock_treestorage.NewMockTreeStorage(ctrl)
|
||||||
settingsId := "settingsId"
|
settingsId := "settingsId"
|
||||||
aclRoot := &aclrecordproto.RawACLRecordWithId{
|
aclRoot := &aclrecordproto.RawACLRecordWithId{
|
||||||
|
|
|
@ -3,13 +3,13 @@ package headsync
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/treegetter"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/treegetter"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -35,7 +35,7 @@ type HeadSync interface {
|
||||||
type headSync struct {
|
type headSync struct {
|
||||||
spaceId string
|
spaceId string
|
||||||
periodicSync periodicsync.PeriodicSync
|
periodicSync periodicsync.PeriodicSync
|
||||||
storage storage.SpaceStorage
|
storage spacestorage.SpaceStorage
|
||||||
diff ldiff.Diff
|
diff ldiff.Diff
|
||||||
log *zap.Logger
|
log *zap.Logger
|
||||||
syncer DiffSyncer
|
syncer DiffSyncer
|
||||||
|
@ -46,7 +46,7 @@ type headSync struct {
|
||||||
func NewHeadSync(
|
func NewHeadSync(
|
||||||
spaceId string,
|
spaceId string,
|
||||||
syncPeriod int,
|
syncPeriod int,
|
||||||
storage storage.SpaceStorage,
|
storage spacestorage.SpaceStorage,
|
||||||
confConnector nodeconf.ConfConnector,
|
confConnector nodeconf.ConfConnector,
|
||||||
cache treegetter.TreeGetter,
|
cache treegetter.TreeGetter,
|
||||||
syncStatus syncstatus.SyncStatusUpdater,
|
syncStatus syncstatus.SyncStatusUpdater,
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
package headsync
|
package headsync
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff/mock_ldiff"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync/mock_headsync"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/headsync/mock_headsync"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage/mock_treestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate/mock_deletionstate"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/settings/deletionstate/mock_deletionstate"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage/mock_spacestorage"
|
||||||
mock_storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage/mock_storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff/mock_ldiff"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync/mock_periodicsync"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/periodicsync/mock_periodicsync"
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -20,8 +20,8 @@ func TestDiffService(t *testing.T) {
|
||||||
spaceId := "spaceId"
|
spaceId := "spaceId"
|
||||||
l := logger.NewNamed("sync")
|
l := logger.NewNamed("sync")
|
||||||
pSyncMock := mock_periodicsync.NewMockPeriodicSync(ctrl)
|
pSyncMock := mock_periodicsync.NewMockPeriodicSync(ctrl)
|
||||||
storageMock := mock_storage.NewMockSpaceStorage(ctrl)
|
storageMock := mock_spacestorage.NewMockSpaceStorage(ctrl)
|
||||||
treeStorageMock := mock_storage2.NewMockTreeStorage(ctrl)
|
treeStorageMock := mock_treestorage.NewMockTreeStorage(ctrl)
|
||||||
diffMock := mock_ldiff.NewMockDiff(ctrl)
|
diffMock := mock_ldiff.NewMockDiff(ctrl)
|
||||||
syncer := mock_headsync.NewMockDiffSyncer(ctrl)
|
syncer := mock_headsync.NewMockDiffSyncer(ctrl)
|
||||||
delState := mock_deletionstate.NewMockDeletionState(ctrl)
|
delState := mock_deletionstate.NewMockDeletionState(ctrl)
|
||||||
|
|
|
@ -2,8 +2,8 @@ package headsync
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Client interface {
|
type Client interface {
|
||||||
|
|
|
@ -3,8 +3,8 @@ package headsync
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/ldiff"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/ldiff"
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package account
|
package accountdata
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
|
@ -1,9 +1,9 @@
|
||||||
package list
|
package list
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/keychain"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cidutil"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
|
@ -17,10 +17,10 @@ type ACLRecordBuilder interface {
|
||||||
|
|
||||||
type aclRecordBuilder struct {
|
type aclRecordBuilder struct {
|
||||||
id string
|
id string
|
||||||
keychain *common.Keychain
|
keychain *keychain.Keychain
|
||||||
}
|
}
|
||||||
|
|
||||||
func newACLRecordBuilder(id string, keychain *common.Keychain) ACLRecordBuilder {
|
func newACLRecordBuilder(id string, keychain *keychain.Keychain) ACLRecordBuilder {
|
||||||
return &aclRecordBuilder{
|
return &aclRecordBuilder{
|
||||||
id: id,
|
id: id,
|
||||||
keychain: keychain,
|
keychain: keychain,
|
||||||
|
@ -149,7 +149,7 @@ func (a *aclRecordBuilder) ConvertFromRaw(rawIdRecord *aclrecordproto.RawACLReco
|
||||||
}
|
}
|
||||||
|
|
||||||
func verifyRaw(
|
func verifyRaw(
|
||||||
keychain *common.Keychain,
|
keychain *keychain.Keychain,
|
||||||
rawRec *aclrecordproto.RawACLRecord,
|
rawRec *aclrecordproto.RawACLRecord,
|
||||||
recWithId *aclrecordproto.RawACLRecordWithId,
|
recWithId *aclrecordproto.RawACLRecordWithId,
|
||||||
identity []byte) (err error) {
|
identity []byte) (err error) {
|
||||||
|
@ -169,7 +169,7 @@ func verifyRaw(
|
||||||
}
|
}
|
||||||
|
|
||||||
// verifying ID
|
// verifying ID
|
||||||
if !cid.VerifyCID(recWithId.Payload, recWithId.Id) {
|
if !cidutil.VerifyCID(recWithId.Payload, recWithId.Id) {
|
||||||
err = ErrIncorrectCID
|
err = ErrIncorrectCID
|
||||||
}
|
}
|
||||||
return
|
return
|
|
@ -1,25 +1,25 @@
|
||||||
package list
|
package list
|
||||||
|
|
||||||
import (
|
import (
|
||||||
account "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/accountdata"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
|
acllistbuilder2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/testutils/acllistbuilder"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/acllistbuilder"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/keychain"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cidutil"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAclRecordBuilder_BuildUserJoin(t *testing.T) {
|
func TestAclRecordBuilder_BuildUserJoin(t *testing.T) {
|
||||||
st, err := acllistbuilder.NewListStorageWithTestName("userjoinexample.yml")
|
st, err := acllistbuilder2.NewListStorageWithTestName("userjoinexample.yml")
|
||||||
require.NoError(t, err, "building storage should not result in error")
|
require.NoError(t, err, "building storage should not result in error")
|
||||||
|
|
||||||
keychain := st.(*acllistbuilder.ACLListStorageBuilder).GetKeychain()
|
testKeychain := st.(*acllistbuilder2.ACLListStorageBuilder).GetKeychain()
|
||||||
identity := keychain.GeneratedIdentities["D"]
|
identity := testKeychain.GeneratedIdentities["D"]
|
||||||
signPrivKey := keychain.SigningKeysByYAMLName["D"]
|
signPrivKey := testKeychain.SigningKeysByYAMLName["D"]
|
||||||
encPrivKey := keychain.EncryptionKeysByYAMLName["D"]
|
encPrivKey := testKeychain.EncryptionKeysByYAMLName["D"]
|
||||||
acc := &account.AccountData{
|
acc := &accountdata.AccountData{
|
||||||
Identity: []byte(identity),
|
Identity: []byte(identity),
|
||||||
SignKey: signPrivKey,
|
SignKey: signPrivKey,
|
||||||
EncKey: encPrivKey,
|
EncKey: encPrivKey,
|
||||||
|
@ -27,17 +27,17 @@ func TestAclRecordBuilder_BuildUserJoin(t *testing.T) {
|
||||||
|
|
||||||
aclList, err := BuildACLListWithIdentity(acc, st)
|
aclList, err := BuildACLListWithIdentity(acc, st)
|
||||||
require.NoError(t, err, "building acl list should be without error")
|
require.NoError(t, err, "building acl list should be without error")
|
||||||
recordBuilder := newACLRecordBuilder(aclList.ID(), common.NewKeychain())
|
recordBuilder := newACLRecordBuilder(aclList.ID(), keychain.NewKeychain())
|
||||||
rk, err := keychain.GetKey("key.Read.EncKey").(*acllistbuilder.SymKey).Key.Raw()
|
rk, err := testKeychain.GetKey("key.Read.EncKey").(*acllistbuilder2.SymKey).Key.Raw()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
privKey, err := keychain.GetKey("key.Sign.Onetime1").(signingkey.PrivKey).Raw()
|
privKey, err := testKeychain.GetKey("key.Sign.Onetime1").(signingkey.PrivKey).Raw()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
userJoin, err := recordBuilder.BuildUserJoin(privKey, rk, aclList.ACLState())
|
userJoin, err := recordBuilder.BuildUserJoin(privKey, rk, aclList.ACLState())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
marshalledJoin, err := userJoin.Marshal()
|
marshalledJoin, err := userJoin.Marshal()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
id, err := cid.NewCIDFromBytes(marshalledJoin)
|
id, err := cidutil.NewCIDFromBytes(marshalledJoin)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
rawRec := &aclrecordproto.RawACLRecordWithId{
|
rawRec := &aclrecordproto.RawACLRecordWithId{
|
||||||
Payload: marshalledJoin,
|
Payload: marshalledJoin,
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
aclrecordproto2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/keychain"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
|
@ -18,31 +18,33 @@ import (
|
||||||
|
|
||||||
var log = logger.NewNamed("acllist").Sugar()
|
var log = logger.NewNamed("acllist").Sugar()
|
||||||
|
|
||||||
var ErrNoSuchUser = errors.New("no such user")
|
var (
|
||||||
var ErrFailedToDecrypt = errors.New("failed to decrypt key")
|
ErrNoSuchUser = errors.New("no such user")
|
||||||
var ErrUserRemoved = errors.New("user was removed from the document")
|
ErrFailedToDecrypt = errors.New("failed to decrypt key")
|
||||||
var ErrDocumentForbidden = errors.New("your user was forbidden access to the document")
|
ErrUserRemoved = errors.New("user was removed from the document")
|
||||||
var ErrUserAlreadyExists = errors.New("user already exists")
|
ErrDocumentForbidden = errors.New("your user was forbidden access to the document")
|
||||||
var ErrNoSuchRecord = errors.New("no such record")
|
ErrUserAlreadyExists = errors.New("user already exists")
|
||||||
var ErrNoSuchInvite = errors.New("no such invite")
|
ErrNoSuchRecord = errors.New("no such record")
|
||||||
var ErrOldInvite = errors.New("invite is too old")
|
ErrNoSuchInvite = errors.New("no such invite")
|
||||||
var ErrInsufficientPermissions = errors.New("insufficient permissions")
|
ErrOldInvite = errors.New("invite is too old")
|
||||||
var ErrNoReadKey = errors.New("acl state doesn't have a read key")
|
ErrInsufficientPermissions = errors.New("insufficient permissions")
|
||||||
var ErrInvalidSignature = errors.New("signature is invalid")
|
ErrNoReadKey = errors.New("acl state doesn't have a read key")
|
||||||
var ErrIncorrectRoot = errors.New("incorrect root")
|
ErrInvalidSignature = errors.New("signature is invalid")
|
||||||
var ErrIncorrectRecordSequence = errors.New("incorrect prev id of a record")
|
ErrIncorrectRoot = errors.New("incorrect root")
|
||||||
|
ErrIncorrectRecordSequence = errors.New("incorrect prev id of a record")
|
||||||
|
)
|
||||||
|
|
||||||
type UserPermissionPair struct {
|
type UserPermissionPair struct {
|
||||||
Identity string
|
Identity string
|
||||||
Permission aclrecordproto.ACLUserPermissions
|
Permission aclrecordproto2.ACLUserPermissions
|
||||||
}
|
}
|
||||||
|
|
||||||
type ACLState struct {
|
type ACLState struct {
|
||||||
id string
|
id string
|
||||||
currentReadKeyHash uint64
|
currentReadKeyHash uint64
|
||||||
userReadKeys map[uint64]*symmetric.Key
|
userReadKeys map[uint64]*symmetric.Key
|
||||||
userStates map[string]*aclrecordproto.ACLUserState
|
userStates map[string]*aclrecordproto2.ACLUserState
|
||||||
userInvites map[string]*aclrecordproto.ACLUserInvite
|
userInvites map[string]*aclrecordproto2.ACLUserInvite
|
||||||
encryptionKey encryptionkey.PrivKey
|
encryptionKey encryptionkey.PrivKey
|
||||||
signingKey signingkey.PrivKey
|
signingKey signingkey.PrivKey
|
||||||
totalReadKeys int
|
totalReadKeys int
|
||||||
|
@ -51,7 +53,7 @@ type ACLState struct {
|
||||||
permissionsAtRecord map[string][]UserPermissionPair
|
permissionsAtRecord map[string][]UserPermissionPair
|
||||||
lastRecordId string
|
lastRecordId string
|
||||||
|
|
||||||
keychain *common.Keychain
|
keychain *keychain.Keychain
|
||||||
}
|
}
|
||||||
|
|
||||||
func newACLStateWithKeys(
|
func newACLStateWithKeys(
|
||||||
|
@ -68,8 +70,8 @@ func newACLStateWithKeys(
|
||||||
signingKey: signingKey,
|
signingKey: signingKey,
|
||||||
encryptionKey: encryptionKey,
|
encryptionKey: encryptionKey,
|
||||||
userReadKeys: make(map[uint64]*symmetric.Key),
|
userReadKeys: make(map[uint64]*symmetric.Key),
|
||||||
userStates: make(map[string]*aclrecordproto.ACLUserState),
|
userStates: make(map[string]*aclrecordproto2.ACLUserState),
|
||||||
userInvites: make(map[string]*aclrecordproto.ACLUserInvite),
|
userInvites: make(map[string]*aclrecordproto2.ACLUserInvite),
|
||||||
permissionsAtRecord: make(map[string][]UserPermissionPair),
|
permissionsAtRecord: make(map[string][]UserPermissionPair),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
@ -78,8 +80,8 @@ func newACLState(id string) *ACLState {
|
||||||
return &ACLState{
|
return &ACLState{
|
||||||
id: id,
|
id: id,
|
||||||
userReadKeys: make(map[uint64]*symmetric.Key),
|
userReadKeys: make(map[uint64]*symmetric.Key),
|
||||||
userStates: make(map[string]*aclrecordproto.ACLUserState),
|
userStates: make(map[string]*aclrecordproto2.ACLUserState),
|
||||||
userInvites: make(map[string]*aclrecordproto.ACLUserInvite),
|
userInvites: make(map[string]*aclrecordproto2.ACLUserInvite),
|
||||||
permissionsAtRecord: make(map[string][]UserPermissionPair),
|
permissionsAtRecord: make(map[string][]UserPermissionPair),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -126,7 +128,7 @@ func (st *ACLState) applyRecord(record *ACLRecord) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if record.Id == st.id {
|
if record.Id == st.id {
|
||||||
root, ok := record.Model.(*aclrecordproto.ACLRoot)
|
root, ok := record.Model.(*aclrecordproto2.ACLRoot)
|
||||||
if !ok {
|
if !ok {
|
||||||
return ErrIncorrectRoot
|
return ErrIncorrectRoot
|
||||||
}
|
}
|
||||||
|
@ -135,14 +137,14 @@ func (st *ACLState) applyRecord(record *ACLRecord) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
st.permissionsAtRecord[record.Id] = []UserPermissionPair{
|
st.permissionsAtRecord[record.Id] = []UserPermissionPair{
|
||||||
{Identity: string(root.Identity), Permission: aclrecordproto.ACLUserPermissions_Admin},
|
{Identity: string(root.Identity), Permission: aclrecordproto2.ACLUserPermissions_Admin},
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
aclData := &aclrecordproto.ACLData{}
|
aclData := &aclrecordproto2.ACLData{}
|
||||||
|
|
||||||
if record.Model != nil {
|
if record.Model != nil {
|
||||||
aclData = record.Model.(*aclrecordproto.ACLData)
|
aclData = record.Model.(*aclrecordproto2.ACLData)
|
||||||
} else {
|
} else {
|
||||||
err = proto.Unmarshal(record.Data, aclData)
|
err = proto.Unmarshal(record.Data, aclData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -170,7 +172,7 @@ func (st *ACLState) applyRecord(record *ACLRecord) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) {
|
func (st *ACLState) applyRoot(root *aclrecordproto2.ACLRoot) (err error) {
|
||||||
if st.signingKey != nil && st.encryptionKey != nil && st.identity == string(root.Identity) {
|
if st.signingKey != nil && st.encryptionKey != nil && st.identity == string(root.Identity) {
|
||||||
err = st.saveReadKeyFromRoot(root)
|
err = st.saveReadKeyFromRoot(root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -179,10 +181,10 @@ func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// adding user to the list
|
// adding user to the list
|
||||||
userState := &aclrecordproto.ACLUserState{
|
userState := &aclrecordproto2.ACLUserState{
|
||||||
Identity: root.Identity,
|
Identity: root.Identity,
|
||||||
EncryptionKey: root.EncryptionKey,
|
EncryptionKey: root.EncryptionKey,
|
||||||
Permissions: aclrecordproto.ACLUserPermissions_Admin,
|
Permissions: aclrecordproto2.ACLUserPermissions_Admin,
|
||||||
}
|
}
|
||||||
st.currentReadKeyHash = root.CurrentReadKeyHash
|
st.currentReadKeyHash = root.CurrentReadKeyHash
|
||||||
st.userStates[string(root.Identity)] = userState
|
st.userStates[string(root.Identity)] = userState
|
||||||
|
@ -190,7 +192,7 @@ func (st *ACLState) applyRoot(root *aclrecordproto.ACLRoot) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error) {
|
func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto2.ACLRoot) (err error) {
|
||||||
var readKey *symmetric.Key
|
var readKey *symmetric.Key
|
||||||
if len(root.GetDerivationScheme()) != 0 {
|
if len(root.GetDerivationScheme()) != 0 {
|
||||||
var encPrivKey []byte
|
var encPrivKey []byte
|
||||||
|
@ -204,7 +206,7 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
readKey, err = aclrecordproto.ACLReadKeyDerive(signPrivKey, encPrivKey)
|
readKey, err = aclrecordproto2.ACLReadKeyDerive(signPrivKey, encPrivKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -228,7 +230,7 @@ func (st *ACLState) saveReadKeyFromRoot(root *aclrecordproto.ACLRoot) (err error
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uint64, identity []byte) (err error) {
|
func (st *ACLState) applyChangeData(changeData *aclrecordproto2.ACLData, hash uint64, identity []byte) (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
@ -246,7 +248,7 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uin
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !st.HasPermission(identity, aclrecordproto.ACLUserPermissions_Admin) {
|
if !st.HasPermission(identity, aclrecordproto2.ACLUserPermissions_Admin) {
|
||||||
err = fmt.Errorf("user %s must have admin permissions", identity)
|
err = fmt.Errorf("user %s must have admin permissions", identity)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -262,7 +264,7 @@ func (st *ACLState) applyChangeData(changeData *aclrecordproto.ACLData, hash uin
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) applyChangeContent(ch *aclrecordproto.ACLContentValue) error {
|
func (st *ACLState) applyChangeContent(ch *aclrecordproto2.ACLContentValue) error {
|
||||||
switch {
|
switch {
|
||||||
case ch.GetUserPermissionChange() != nil:
|
case ch.GetUserPermissionChange() != nil:
|
||||||
return st.applyUserPermissionChange(ch.GetUserPermissionChange())
|
return st.applyUserPermissionChange(ch.GetUserPermissionChange())
|
||||||
|
@ -279,7 +281,7 @@ func (st *ACLState) applyChangeContent(ch *aclrecordproto.ACLContentValue) error
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto.ACLUserPermissionChange) error {
|
func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto2.ACLUserPermissionChange) error {
|
||||||
chIdentity := string(ch.Identity)
|
chIdentity := string(ch.Identity)
|
||||||
state, exists := st.userStates[chIdentity]
|
state, exists := st.userStates[chIdentity]
|
||||||
if !exists {
|
if !exists {
|
||||||
|
@ -290,12 +292,12 @@ func (st *ACLState) applyUserPermissionChange(ch *aclrecordproto.ACLUserPermissi
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) applyUserInvite(ch *aclrecordproto.ACLUserInvite) error {
|
func (st *ACLState) applyUserInvite(ch *aclrecordproto2.ACLUserInvite) error {
|
||||||
st.userInvites[string(ch.AcceptPublicKey)] = ch
|
st.userInvites[string(ch.AcceptPublicKey)] = ch
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error {
|
func (st *ACLState) applyUserJoin(ch *aclrecordproto2.ACLUserJoin) error {
|
||||||
invite, exists := st.userInvites[string(ch.AcceptPubKey)]
|
invite, exists := st.userInvites[string(ch.AcceptPubKey)]
|
||||||
if !exists {
|
if !exists {
|
||||||
return fmt.Errorf("no such invite with such public key %s", keys.EncodeBytesToString(ch.AcceptPubKey))
|
return fmt.Errorf("no such invite with such public key %s", keys.EncodeBytesToString(ch.AcceptPubKey))
|
||||||
|
@ -334,7 +336,7 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// adding user to the list
|
// adding user to the list
|
||||||
userState := &aclrecordproto.ACLUserState{
|
userState := &aclrecordproto2.ACLUserState{
|
||||||
Identity: ch.Identity,
|
Identity: ch.Identity,
|
||||||
EncryptionKey: ch.EncryptionKey,
|
EncryptionKey: ch.EncryptionKey,
|
||||||
Permissions: invite.Permissions,
|
Permissions: invite.Permissions,
|
||||||
|
@ -343,13 +345,13 @@ func (st *ACLState) applyUserJoin(ch *aclrecordproto.ACLUserJoin) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) applyUserAdd(ch *aclrecordproto.ACLUserAdd) error {
|
func (st *ACLState) applyUserAdd(ch *aclrecordproto2.ACLUserAdd) error {
|
||||||
chIdentity := string(ch.Identity)
|
chIdentity := string(ch.Identity)
|
||||||
if _, exists := st.userStates[chIdentity]; exists {
|
if _, exists := st.userStates[chIdentity]; exists {
|
||||||
return ErrUserAlreadyExists
|
return ErrUserAlreadyExists
|
||||||
}
|
}
|
||||||
|
|
||||||
st.userStates[chIdentity] = &aclrecordproto.ACLUserState{
|
st.userStates[chIdentity] = &aclrecordproto2.ACLUserState{
|
||||||
Identity: ch.Identity,
|
Identity: ch.Identity,
|
||||||
EncryptionKey: ch.EncryptionKey,
|
EncryptionKey: ch.EncryptionKey,
|
||||||
Permissions: ch.Permissions,
|
Permissions: ch.Permissions,
|
||||||
|
@ -369,7 +371,7 @@ func (st *ACLState) applyUserAdd(ch *aclrecordproto.ACLUserAdd) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) applyUserRemove(ch *aclrecordproto.ACLUserRemove) error {
|
func (st *ACLState) applyUserRemove(ch *aclrecordproto2.ACLUserRemove) error {
|
||||||
chIdentity := string(ch.Identity)
|
chIdentity := string(ch.Identity)
|
||||||
if chIdentity == st.identity {
|
if chIdentity == st.identity {
|
||||||
return ErrDocumentForbidden
|
return ErrDocumentForbidden
|
||||||
|
@ -413,7 +415,7 @@ func (st *ACLState) decryptReadKeyAndHash(msg []byte) (*symmetric.Key, uint64, e
|
||||||
return key, hasher.Sum64(), nil
|
return key, hasher.Sum64(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) HasPermission(identity []byte, permission aclrecordproto.ACLUserPermissions) bool {
|
func (st *ACLState) HasPermission(identity []byte, permission aclrecordproto2.ACLUserPermissions) bool {
|
||||||
state, exists := st.userStates[string(identity)]
|
state, exists := st.userStates[string(identity)]
|
||||||
if !exists {
|
if !exists {
|
||||||
return false
|
return false
|
||||||
|
@ -422,22 +424,22 @@ func (st *ACLState) HasPermission(identity []byte, permission aclrecordproto.ACL
|
||||||
return state.Permissions == permission
|
return state.Permissions == permission
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) isUserJoin(data *aclrecordproto.ACLData) bool {
|
func (st *ACLState) isUserJoin(data *aclrecordproto2.ACLData) bool {
|
||||||
// if we have a UserJoin, then it should always be the first one applied
|
// if we have a UserJoin, then it should always be the first one applied
|
||||||
return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil
|
return data.GetAclContent() != nil && data.GetAclContent()[0].GetUserJoin() != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) isUserAdd(data *aclrecordproto.ACLData, identity []byte) bool {
|
func (st *ACLState) isUserAdd(data *aclrecordproto2.ACLData, identity []byte) bool {
|
||||||
// if we have a UserAdd, then it should always be the first one applied
|
// if we have a UserAdd, then it should always be the first one applied
|
||||||
userAdd := data.GetAclContent()[0].GetUserAdd()
|
userAdd := data.GetAclContent()[0].GetUserAdd()
|
||||||
return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0
|
return data.GetAclContent() != nil && userAdd != nil && bytes.Compare(userAdd.GetIdentity(), identity) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) UserStates() map[string]*aclrecordproto.ACLUserState {
|
func (st *ACLState) UserStates() map[string]*aclrecordproto2.ACLUserState {
|
||||||
return st.userStates
|
return st.userStates
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st *ACLState) Invite(acceptPubKey []byte) (invite *aclrecordproto.ACLUserInvite, err error) {
|
func (st *ACLState) Invite(acceptPubKey []byte) (invite *aclrecordproto2.ACLUserInvite, err error) {
|
||||||
invite, exists := st.userInvites[string(acceptPubKey)]
|
invite, exists := st.userInvites[string(acceptPubKey)]
|
||||||
if !exists {
|
if !exists {
|
||||||
err = ErrNoSuchInvite
|
err = ErrNoSuchInvite
|
|
@ -1,7 +1,7 @@
|
||||||
package list
|
package list
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/accountdata"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
)
|
)
|
||||||
|
@ -12,7 +12,7 @@ type aclStateBuilder struct {
|
||||||
id string
|
id string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newACLStateBuilderWithIdentity(accountData *account.AccountData) *aclStateBuilder {
|
func newACLStateBuilderWithIdentity(accountData *accountdata.AccountData) *aclStateBuilder {
|
||||||
return &aclStateBuilder{
|
return &aclStateBuilder{
|
||||||
signPrivKey: accountData.SignKey,
|
signPrivKey: accountData.SignKey,
|
||||||
encPrivKey: accountData.EncKey,
|
encPrivKey: accountData.EncKey,
|
|
@ -1,23 +1,20 @@
|
||||||
//go:generate mockgen -destination mock_list/mock_list.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list ACLList
|
//go:generate mockgen -destination mock_list/mock_list.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list ACLList
|
||||||
package list
|
package list
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/account"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/accountdata"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/keychain"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type IterFunc = func(record *ACLRecord) (IsContinue bool)
|
type IterFunc = func(record *ACLRecord) (IsContinue bool)
|
||||||
|
|
||||||
var (
|
var ErrIncorrectCID = errors.New("incorrect CID")
|
||||||
ErrIncorrectCID = errors.New("incorrect CID")
|
|
||||||
ErrInconsistent = errors.New("inconsistent record")
|
|
||||||
)
|
|
||||||
|
|
||||||
type RWLocker interface {
|
type RWLocker interface {
|
||||||
sync.Locker
|
sync.Locker
|
||||||
|
@ -28,7 +25,7 @@ type RWLocker interface {
|
||||||
type ACLList interface {
|
type ACLList interface {
|
||||||
RWLocker
|
RWLocker
|
||||||
ID() string
|
ID() string
|
||||||
Root() *aclrecordproto.ACLRoot
|
Root() *aclrecordproto.RawACLRecordWithId
|
||||||
Records() []*ACLRecord
|
Records() []*ACLRecord
|
||||||
ACLState() *ACLState
|
ACLState() *ACLState
|
||||||
IsAfter(first string, second string) (bool, error)
|
IsAfter(first string, second string) (bool, error)
|
||||||
|
@ -43,39 +40,30 @@ type ACLList interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type aclList struct {
|
type aclList struct {
|
||||||
root *aclrecordproto.ACLRoot
|
root *aclrecordproto.RawACLRecordWithId
|
||||||
records []*ACLRecord
|
records []*ACLRecord
|
||||||
indexes map[string]int
|
indexes map[string]int
|
||||||
id string
|
id string
|
||||||
|
|
||||||
recBuilder ACLRecordBuilder
|
stateBuilder *aclStateBuilder
|
||||||
builder *aclStateBuilder
|
recordBuilder ACLRecordBuilder
|
||||||
aclState *ACLState
|
aclState *ACLState
|
||||||
keychain *common.Keychain
|
keychain *keychain.Keychain
|
||||||
|
storage liststorage.ListStorage
|
||||||
|
|
||||||
sync.RWMutex
|
sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func BuildACLListWithIdentity(acc *account.AccountData, storage storage.ListStorage) (ACLList, error) {
|
func BuildACLListWithIdentity(acc *accountdata.AccountData, storage liststorage.ListStorage) (ACLList, error) {
|
||||||
builder := newACLStateBuilderWithIdentity(acc)
|
builder := newACLStateBuilderWithIdentity(acc)
|
||||||
return build(storage.Id(), builder, newACLRecordBuilder(storage.Id(), common.NewKeychain()), storage)
|
return build(storage.Id(), builder, newACLRecordBuilder(storage.Id(), keychain.NewKeychain()), storage)
|
||||||
}
|
}
|
||||||
|
|
||||||
func BuildACLList(storage storage.ListStorage) (ACLList, error) {
|
func BuildACLList(storage liststorage.ListStorage) (ACLList, error) {
|
||||||
return build(storage.Id(), newACLStateBuilder(), newACLRecordBuilder(storage.Id(), common.NewKeychain()), storage)
|
return build(storage.Id(), newACLStateBuilder(), newACLRecordBuilder(storage.Id(), keychain.NewKeychain()), storage)
|
||||||
}
|
}
|
||||||
|
|
||||||
func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage storage.ListStorage) (list ACLList, err error) {
|
func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder, storage liststorage.ListStorage) (list ACLList, err error) {
|
||||||
// TODO: need to add context here
|
|
||||||
rootWithId, err := storage.Root()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
aclRecRoot, err := recBuilder.ConvertFromRaw(rootWithId)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
head, err := storage.Head()
|
head, err := storage.Head()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
@ -92,7 +80,7 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder
|
||||||
}
|
}
|
||||||
records := []*ACLRecord{record}
|
records := []*ACLRecord{record}
|
||||||
|
|
||||||
for record.PrevId != "" && record.PrevId != id {
|
for record.PrevId != "" {
|
||||||
rawRecordWithId, err = storage.GetRawRecord(context.Background(), record.PrevId)
|
rawRecordWithId, err = storage.GetRawRecord(context.Background(), record.PrevId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
@ -104,8 +92,6 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder
|
||||||
}
|
}
|
||||||
records = append(records, record)
|
records = append(records, record)
|
||||||
}
|
}
|
||||||
// adding root in the end, because we already parsed it
|
|
||||||
records = append(records, aclRecRoot)
|
|
||||||
|
|
||||||
indexes := make(map[string]int)
|
indexes := make(map[string]int)
|
||||||
for i, j := 0, len(records)-1; i < j; i, j = i+1, j-1 {
|
for i, j := 0, len(records)-1; i < j; i, j = i+1, j-1 {
|
||||||
|
@ -124,14 +110,21 @@ func build(id string, stateBuilder *aclStateBuilder, recBuilder ACLRecordBuilder
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: check if this is correct (raw model instead of unmarshalled)
|
||||||
|
rootWithId, err := storage.Root()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
list = &aclList{
|
list = &aclList{
|
||||||
root: aclRecRoot.Model.(*aclrecordproto.ACLRoot),
|
root: rootWithId,
|
||||||
records: records,
|
records: records,
|
||||||
indexes: indexes,
|
indexes: indexes,
|
||||||
builder: stateBuilder,
|
stateBuilder: stateBuilder,
|
||||||
recBuilder: recBuilder,
|
recordBuilder: recBuilder,
|
||||||
aclState: state,
|
aclState: state,
|
||||||
id: id,
|
storage: storage,
|
||||||
|
id: id,
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -144,34 +137,30 @@ func (a *aclList) AddRawRecord(rawRec *aclrecordproto.RawACLRecordWithId) (added
|
||||||
if _, ok := a.indexes[rawRec.Id]; ok {
|
if _, ok := a.indexes[rawRec.Id]; ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
record, err := a.recBuilder.ConvertFromRaw(rawRec)
|
record, err := a.recordBuilder.ConvertFromRaw(rawRec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var lastId string
|
if err = a.aclState.applyRecord(record); err != nil {
|
||||||
if len(a.records) > 0 {
|
return
|
||||||
lastId = a.records[len(a.records)-1].Id
|
|
||||||
}
|
|
||||||
if record.PrevId != lastId {
|
|
||||||
return false, ErrInconsistent
|
|
||||||
}
|
}
|
||||||
a.records = append(a.records, record)
|
a.records = append(a.records, record)
|
||||||
a.indexes[record.Id] = len(a.records) - 1
|
a.indexes[record.Id] = len(a.records) - 1
|
||||||
|
if err = a.storage.AddRawRecord(context.Background(), rawRec); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = a.storage.SetHead(rawRec.Id); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aclList) IsValidNext(rawRec *aclrecordproto.RawACLRecordWithId) (err error) {
|
func (a *aclList) IsValidNext(rawRec *aclrecordproto.RawACLRecordWithId) (err error) {
|
||||||
rec, err := a.recBuilder.ConvertFromRaw(rawRec)
|
_, err = a.recordBuilder.ConvertFromRaw(rawRec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var lastId string
|
// TODO: change state and add "check" method for records
|
||||||
if len(a.records) > 0 {
|
|
||||||
lastId = a.records[len(a.records)-1].Id
|
|
||||||
}
|
|
||||||
if rec.PrevId != lastId {
|
|
||||||
return ErrInconsistent
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,7 +168,7 @@ func (a *aclList) ID() string {
|
||||||
return a.id
|
return a.id
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *aclList) Root() *aclrecordproto.ACLRoot {
|
func (a *aclList) Root() *aclrecordproto.RawACLRecordWithId {
|
||||||
return a.root
|
return a.root
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package list
|
package list
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/acllistbuilder"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/testutils/acllistbuilder"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"testing"
|
"testing"
|
|
@ -1,5 +1,5 @@
|
||||||
// Code generated by MockGen. DO NOT EDIT.
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list (interfaces: ACLList)
|
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list (interfaces: ACLList)
|
||||||
|
|
||||||
// Package mock_list is a generated GoMock package.
|
// Package mock_list is a generated GoMock package.
|
||||||
package mock_list
|
package mock_list
|
||||||
|
@ -7,8 +7,8 @@ package mock_list
|
||||||
import (
|
import (
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
list "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
list "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
78
common/commonspace/object/acl/liststorage/inmemory.go
Normal file
78
common/commonspace/object/acl/liststorage/inmemory.go
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
package liststorage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type inMemoryACLListStorage struct {
|
||||||
|
id string
|
||||||
|
root *aclrecordproto.RawACLRecordWithId
|
||||||
|
head string
|
||||||
|
records map[string]*aclrecordproto.RawACLRecordWithId
|
||||||
|
|
||||||
|
sync.RWMutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewInMemoryACLListStorage(
|
||||||
|
id string,
|
||||||
|
records []*aclrecordproto.RawACLRecordWithId) (ListStorage, error) {
|
||||||
|
|
||||||
|
allRecords := make(map[string]*aclrecordproto.RawACLRecordWithId)
|
||||||
|
for _, ch := range records {
|
||||||
|
allRecords[ch.Id] = ch
|
||||||
|
}
|
||||||
|
root := records[0]
|
||||||
|
head := records[len(records)-1]
|
||||||
|
|
||||||
|
return &inMemoryACLListStorage{
|
||||||
|
id: root.Id,
|
||||||
|
root: root,
|
||||||
|
head: head.Id,
|
||||||
|
records: allRecords,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryACLListStorage) Id() string {
|
||||||
|
t.RLock()
|
||||||
|
defer t.RUnlock()
|
||||||
|
return t.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryACLListStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) {
|
||||||
|
t.RLock()
|
||||||
|
defer t.RUnlock()
|
||||||
|
return t.root, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryACLListStorage) Head() (string, error) {
|
||||||
|
t.RLock()
|
||||||
|
defer t.RUnlock()
|
||||||
|
return t.head, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryACLListStorage) SetHead(head string) error {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
t.head = head
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryACLListStorage) AddRawRecord(ctx context.Context, record *aclrecordproto.RawACLRecordWithId) error {
|
||||||
|
t.Lock()
|
||||||
|
defer t.Unlock()
|
||||||
|
// TODO: better to do deep copy
|
||||||
|
t.records[record.Id] = record
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *inMemoryACLListStorage) GetRawRecord(ctx context.Context, recordId string) (*aclrecordproto.RawACLRecordWithId, error) {
|
||||||
|
t.RLock()
|
||||||
|
defer t.RUnlock()
|
||||||
|
if res, exists := t.records[recordId]; exists {
|
||||||
|
return res, nil
|
||||||
|
}
|
||||||
|
return nil, fmt.Errorf("could not get record with id: %s", recordId)
|
||||||
|
}
|
|
@ -1,15 +1,17 @@
|
||||||
//go:generate mockgen -destination mock_storage/mock_storage.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage ListStorage,TreeStorage
|
//go:generate mockgen -destination mock_liststorage/mock_liststorage.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage ListStorage
|
||||||
package storage
|
package liststorage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
)
|
)
|
||||||
|
|
||||||
var ErrUnknownACLId = errors.New("acl does not exist")
|
var (
|
||||||
var ErrACLExists = errors.New("acl already exists")
|
ErrUnknownACLId = errors.New("acl does not exist")
|
||||||
var ErrUnknownRecord = errors.New("record doesn't exist")
|
ErrACLExists = errors.New("acl already exists")
|
||||||
|
ErrUnknownRecord = errors.New("record doesn't exist")
|
||||||
|
)
|
||||||
|
|
||||||
type ListStorage interface {
|
type ListStorage interface {
|
||||||
Id() string
|
Id() string
|
|
@ -0,0 +1,123 @@
|
||||||
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
|
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage (interfaces: ListStorage)
|
||||||
|
|
||||||
|
// Package mock_liststorage is a generated GoMock package.
|
||||||
|
package mock_liststorage
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
reflect "reflect"
|
||||||
|
|
||||||
|
aclrecordproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
|
gomock "github.com/golang/mock/gomock"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MockListStorage is a mock of ListStorage interface.
|
||||||
|
type MockListStorage struct {
|
||||||
|
ctrl *gomock.Controller
|
||||||
|
recorder *MockListStorageMockRecorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockListStorageMockRecorder is the mock recorder for MockListStorage.
|
||||||
|
type MockListStorageMockRecorder struct {
|
||||||
|
mock *MockListStorage
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMockListStorage creates a new mock instance.
|
||||||
|
func NewMockListStorage(ctrl *gomock.Controller) *MockListStorage {
|
||||||
|
mock := &MockListStorage{ctrl: ctrl}
|
||||||
|
mock.recorder = &MockListStorageMockRecorder{mock}
|
||||||
|
return mock
|
||||||
|
}
|
||||||
|
|
||||||
|
// EXPECT returns an object that allows the caller to indicate expected use.
|
||||||
|
func (m *MockListStorage) EXPECT() *MockListStorageMockRecorder {
|
||||||
|
return m.recorder
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddRawRecord mocks base method.
|
||||||
|
func (m *MockListStorage) AddRawRecord(arg0 context.Context, arg1 *aclrecordproto.RawACLRecordWithId) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "AddRawRecord", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddRawRecord indicates an expected call of AddRawRecord.
|
||||||
|
func (mr *MockListStorageMockRecorder) AddRawRecord(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddRawRecord", reflect.TypeOf((*MockListStorage)(nil).AddRawRecord), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetRawRecord mocks base method.
|
||||||
|
func (m *MockListStorage) GetRawRecord(arg0 context.Context, arg1 string) (*aclrecordproto.RawACLRecordWithId, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "GetRawRecord", arg0, arg1)
|
||||||
|
ret0, _ := ret[0].(*aclrecordproto.RawACLRecordWithId)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetRawRecord indicates an expected call of GetRawRecord.
|
||||||
|
func (mr *MockListStorageMockRecorder) GetRawRecord(arg0, arg1 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRawRecord", reflect.TypeOf((*MockListStorage)(nil).GetRawRecord), arg0, arg1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Head mocks base method.
|
||||||
|
func (m *MockListStorage) Head() (string, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Head")
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Head indicates an expected call of Head.
|
||||||
|
func (mr *MockListStorageMockRecorder) Head() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Head", reflect.TypeOf((*MockListStorage)(nil).Head))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Id mocks base method.
|
||||||
|
func (m *MockListStorage) Id() string {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Id")
|
||||||
|
ret0, _ := ret[0].(string)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Id indicates an expected call of Id.
|
||||||
|
func (mr *MockListStorageMockRecorder) Id() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Id", reflect.TypeOf((*MockListStorage)(nil).Id))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Root mocks base method.
|
||||||
|
func (m *MockListStorage) Root() (*aclrecordproto.RawACLRecordWithId, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "Root")
|
||||||
|
ret0, _ := ret[0].(*aclrecordproto.RawACLRecordWithId)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// Root indicates an expected call of Root.
|
||||||
|
func (mr *MockListStorageMockRecorder) Root() *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Root", reflect.TypeOf((*MockListStorage)(nil).Root))
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetHead mocks base method.
|
||||||
|
func (m *MockListStorage) SetHead(arg0 string) error {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "SetHead", arg0)
|
||||||
|
ret0, _ := ret[0].(error)
|
||||||
|
return ret0
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetHead indicates an expected call of SetHead.
|
||||||
|
func (mr *MockListStorageMockRecorder) SetHead(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SetHead", reflect.TypeOf((*MockListStorage)(nil).SetHead), arg0)
|
||||||
|
}
|
|
@ -1,18 +1,18 @@
|
||||||
package syncacl
|
package syncacl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync/synchandler"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SyncACL struct {
|
type SyncACL struct {
|
||||||
list.ACLList
|
list.ACLList
|
||||||
synchandler.SyncHandler
|
synchandler.SyncHandler
|
||||||
streamPool syncservice.StreamPool
|
streamPool objectsync.StreamPool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSyncACL(aclList list.ACLList, streamPool syncservice.StreamPool) *SyncACL {
|
func NewSyncACL(aclList list.ACLList, streamPool objectsync.StreamPool) *SyncACL {
|
||||||
return &SyncACL{
|
return &SyncACL{
|
||||||
ACLList: aclList,
|
ACLList: aclList,
|
||||||
SyncHandler: nil,
|
SyncHandler: nil,
|
|
@ -3,9 +3,9 @@ package syncacl
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type syncAclHandler struct {
|
type syncAclHandler struct {
|
|
@ -1,10 +1,10 @@
|
||||||
package acllistbuilder
|
package acllistbuilder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys"
|
||||||
encryptionkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
||||||
signingkey2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -16,9 +16,9 @@ type SymKey struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type YAMLKeychain struct {
|
type YAMLKeychain struct {
|
||||||
SigningKeysByYAMLName map[string]signingkey2.PrivKey
|
SigningKeysByYAMLName map[string]signingkey.PrivKey
|
||||||
SigningKeysByRealIdentity map[string]signingkey2.PrivKey
|
SigningKeysByRealIdentity map[string]signingkey.PrivKey
|
||||||
EncryptionKeysByYAMLName map[string]encryptionkey2.PrivKey
|
EncryptionKeysByYAMLName map[string]encryptionkey.PrivKey
|
||||||
ReadKeysByYAMLName map[string]*SymKey
|
ReadKeysByYAMLName map[string]*SymKey
|
||||||
ReadKeysByHash map[uint64]*SymKey
|
ReadKeysByHash map[uint64]*SymKey
|
||||||
GeneratedIdentities map[string]string
|
GeneratedIdentities map[string]string
|
||||||
|
@ -26,9 +26,9 @@ type YAMLKeychain struct {
|
||||||
|
|
||||||
func NewKeychain() *YAMLKeychain {
|
func NewKeychain() *YAMLKeychain {
|
||||||
return &YAMLKeychain{
|
return &YAMLKeychain{
|
||||||
SigningKeysByYAMLName: map[string]signingkey2.PrivKey{},
|
SigningKeysByYAMLName: map[string]signingkey.PrivKey{},
|
||||||
SigningKeysByRealIdentity: map[string]signingkey2.PrivKey{},
|
SigningKeysByRealIdentity: map[string]signingkey.PrivKey{},
|
||||||
EncryptionKeysByYAMLName: map[string]encryptionkey2.PrivKey{},
|
EncryptionKeysByYAMLName: map[string]encryptionkey.PrivKey{},
|
||||||
GeneratedIdentities: map[string]string{},
|
GeneratedIdentities: map[string]string{},
|
||||||
ReadKeysByYAMLName: map[string]*SymKey{},
|
ReadKeysByYAMLName: map[string]*SymKey{},
|
||||||
ReadKeysByHash: map[uint64]*SymKey{},
|
ReadKeysByHash: map[uint64]*SymKey{},
|
||||||
|
@ -54,16 +54,16 @@ func (k *YAMLKeychain) AddEncryptionKey(key *Key) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var (
|
var (
|
||||||
newPrivKey encryptionkey2.PrivKey
|
newPrivKey encryptionkey.PrivKey
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
if key.Value == "generated" {
|
if key.Value == "generated" {
|
||||||
newPrivKey, _, err = encryptionkey2.GenerateRandomRSAKeyPair(2048)
|
newPrivKey, _, err = encryptionkey.GenerateRandomRSAKeyPair(2048)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
newPrivKey, err = keys.DecodeKeyFromString(key.Value, encryptionkey2.NewEncryptionRsaPrivKeyFromBytes, nil)
|
newPrivKey, err = keys.DecodeKeyFromString(key.Value, encryptionkey.NewEncryptionRsaPrivKeyFromBytes, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@ -76,17 +76,17 @@ func (k *YAMLKeychain) AddSigningKey(key *Key) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var (
|
var (
|
||||||
newPrivKey signingkey2.PrivKey
|
newPrivKey signingkey.PrivKey
|
||||||
pubKey signingkey2.PubKey
|
pubKey signingkey.PubKey
|
||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
if key.Value == "generated" {
|
if key.Value == "generated" {
|
||||||
newPrivKey, pubKey, err = signingkey2.GenerateRandomEd25519KeyPair()
|
newPrivKey, pubKey, err = signingkey.GenerateRandomEd25519KeyPair()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
newPrivKey, err = keys.DecodeKeyFromString(key.Value, signingkey2.NewSigningEd25519PrivKeyFromBytes, nil)
|
newPrivKey, err = keys.DecodeKeyFromString(key.Value, signingkey.NewSigningEd25519PrivKeyFromBytes, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
|
@ -3,13 +3,13 @@ package acllistbuilder
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
aclrecordproto2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/liststorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/yamltests"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/testutils/yamltests"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cidutil"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/encryptionkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
"hash/fnv"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path"
|
"path"
|
||||||
"time"
|
"time"
|
||||||
|
@ -19,25 +19,17 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type ACLListStorageBuilder struct {
|
type ACLListStorageBuilder struct {
|
||||||
aclList string
|
liststorage.ListStorage
|
||||||
records []*aclrecordproto2.ACLRecord
|
keychain *YAMLKeychain
|
||||||
rawRecords []*aclrecordproto2.RawACLRecordWithId
|
|
||||||
indexes map[string]int
|
|
||||||
keychain *YAMLKeychain
|
|
||||||
rawRoot *aclrecordproto2.RawACLRecordWithId
|
|
||||||
root *aclrecordproto2.ACLRoot
|
|
||||||
id string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewACLListStorageBuilder(keychain *YAMLKeychain) *ACLListStorageBuilder {
|
func NewACLListStorageBuilder(keychain *YAMLKeychain) *ACLListStorageBuilder {
|
||||||
return &ACLListStorageBuilder{
|
return &ACLListStorageBuilder{
|
||||||
records: make([]*aclrecordproto2.ACLRecord, 0),
|
|
||||||
indexes: make(map[string]int),
|
|
||||||
keychain: keychain,
|
keychain: keychain,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewListStorageWithTestName(name string) (storage.ListStorage, error) {
|
func NewListStorageWithTestName(name string) (liststorage.ListStorage, error) {
|
||||||
filePath := path.Join(yamltests.Path(), name)
|
filePath := path.Join(yamltests.Path(), name)
|
||||||
return NewACLListStorageBuilderFromFile(filePath)
|
return NewACLListStorageBuilderFromFile(filePath)
|
||||||
}
|
}
|
||||||
|
@ -60,7 +52,7 @@ func NewACLListStorageBuilderFromFile(file string) (*ACLListStorageBuilder, erro
|
||||||
return tb, nil
|
return tb, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) *aclrecordproto2.RawACLRecordWithId {
|
func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte) *aclrecordproto.RawACLRecordWithId {
|
||||||
protoMarshalled, err := rec.Marshal()
|
protoMarshalled, err := rec.Marshal()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("should be able to marshal final acl message!")
|
panic("should be able to marshal final acl message!")
|
||||||
|
@ -71,7 +63,7 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte)
|
||||||
panic("should be able to sign final acl message!")
|
panic("should be able to sign final acl message!")
|
||||||
}
|
}
|
||||||
|
|
||||||
rawRec := &aclrecordproto2.RawACLRecord{
|
rawRec := &aclrecordproto.RawACLRecord{
|
||||||
Payload: protoMarshalled,
|
Payload: protoMarshalled,
|
||||||
Signature: signature,
|
Signature: signature,
|
||||||
}
|
}
|
||||||
|
@ -81,96 +73,64 @@ func (t *ACLListStorageBuilder) createRaw(rec proto.Marshaler, identity []byte)
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
id, _ := cid.NewCIDFromBytes(rawMarshalled)
|
id, _ := cidutil.NewCIDFromBytes(rawMarshalled)
|
||||||
|
|
||||||
return &aclrecordproto2.RawACLRecordWithId{
|
return &aclrecordproto.RawACLRecordWithId{
|
||||||
Payload: rawMarshalled,
|
Payload: rawMarshalled,
|
||||||
Id: id,
|
Id: id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) Head() (string, error) {
|
|
||||||
l := len(t.records)
|
|
||||||
if l > 0 {
|
|
||||||
return t.rawRecords[l-1].Id, nil
|
|
||||||
}
|
|
||||||
return t.rawRoot.Id, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) SetHead(headId string) error {
|
|
||||||
panic("SetHead is not implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) Root() (*aclrecordproto2.RawACLRecordWithId, error) {
|
|
||||||
return t.rawRoot, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) GetRawRecord(ctx context.Context, id string) (*aclrecordproto2.RawACLRecordWithId, error) {
|
|
||||||
recIdx, ok := t.indexes[id]
|
|
||||||
if !ok {
|
|
||||||
if id == t.rawRoot.Id {
|
|
||||||
return t.rawRoot, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("no such record")
|
|
||||||
}
|
|
||||||
return t.rawRecords[recIdx], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) AddRawRecord(ctx context.Context, rec *aclrecordproto2.RawACLRecordWithId) error {
|
|
||||||
panic("implement me")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) Id() string {
|
|
||||||
return t.id
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) GetRawRecords() []*aclrecordproto2.RawACLRecordWithId {
|
|
||||||
return t.rawRecords
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) GetKeychain() *YAMLKeychain {
|
func (t *ACLListStorageBuilder) GetKeychain() *YAMLKeychain {
|
||||||
return t.keychain
|
return t.keychain
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) Parse(tree *YMLList) {
|
func (t *ACLListStorageBuilder) Parse(l *YMLList) {
|
||||||
// Just to clarify - we are generating new identities for the ones that
|
// Just to clarify - we are generating new identities for the ones that
|
||||||
// are specified in the yml file, because our identities should be Ed25519
|
// are specified in the yml file, because our identities should be Ed25519
|
||||||
// the same thing is happening for the encryption keys
|
// the same thing is happening for the encryption keys
|
||||||
t.keychain.ParseKeys(&tree.Keys)
|
t.keychain.ParseKeys(&l.Keys)
|
||||||
t.parseRoot(tree.Root)
|
rawRoot := t.parseRoot(l.Root)
|
||||||
prevId := t.id
|
var err error
|
||||||
for idx, rec := range tree.Records {
|
t.ListStorage, err = liststorage.NewInMemoryACLListStorage(rawRoot.Id, []*aclrecordproto.RawACLRecordWithId{rawRoot})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
prevId := rawRoot.Id
|
||||||
|
for _, rec := range l.Records {
|
||||||
newRecord := t.parseRecord(rec, prevId)
|
newRecord := t.parseRecord(rec, prevId)
|
||||||
rawRecord := t.createRaw(newRecord, newRecord.Identity)
|
rawRecord := t.createRaw(newRecord, newRecord.Identity)
|
||||||
t.records = append(t.records, newRecord)
|
err = t.AddRawRecord(context.Background(), rawRecord)
|
||||||
t.rawRecords = append(t.rawRecords, rawRecord)
|
if err != nil {
|
||||||
t.indexes[rawRecord.Id] = idx
|
panic(err)
|
||||||
|
}
|
||||||
prevId = rawRecord.Id
|
prevId = rawRecord.Id
|
||||||
}
|
}
|
||||||
|
t.SetHead(prevId)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclrecordproto2.ACLRecord {
|
func (t *ACLListStorageBuilder) parseRecord(rec *Record, prevId string) *aclrecordproto.ACLRecord {
|
||||||
k := t.keychain.GetKey(rec.ReadKey).(*SymKey)
|
k := t.keychain.GetKey(rec.ReadKey).(*SymKey)
|
||||||
var aclChangeContents []*aclrecordproto2.ACLContentValue
|
var aclChangeContents []*aclrecordproto.ACLContentValue
|
||||||
for _, ch := range rec.AclChanges {
|
for _, ch := range rec.AclChanges {
|
||||||
aclChangeContent := t.parseACLChange(ch)
|
aclChangeContent := t.parseACLChange(ch)
|
||||||
aclChangeContents = append(aclChangeContents, aclChangeContent)
|
aclChangeContents = append(aclChangeContents, aclChangeContent)
|
||||||
}
|
}
|
||||||
data := &aclrecordproto2.ACLData{
|
data := &aclrecordproto.ACLData{
|
||||||
AclContent: aclChangeContents,
|
AclContent: aclChangeContents,
|
||||||
}
|
}
|
||||||
bytes, _ := data.Marshal()
|
bytes, _ := data.Marshal()
|
||||||
|
|
||||||
return &aclrecordproto2.ACLRecord{
|
return &aclrecordproto.ACLRecord{
|
||||||
PrevId: prevId,
|
PrevId: prevId,
|
||||||
Identity: []byte(t.keychain.GetIdentity(rec.Identity)),
|
Identity: []byte(t.keychain.GetIdentity(rec.Identity)),
|
||||||
Data: bytes,
|
Data: bytes,
|
||||||
CurrentReadKeyHash: k.Hash,
|
CurrentReadKeyHash: k.Hash,
|
||||||
Timestamp: time.Now().Unix(),
|
Timestamp: time.Now().UnixNano(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecordproto2.ACLContentValue) {
|
func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecordproto.ACLContentValue) {
|
||||||
switch {
|
switch {
|
||||||
case ch.UserAdd != nil:
|
case ch.UserAdd != nil:
|
||||||
add := ch.UserAdd
|
add := ch.UserAdd
|
||||||
|
@ -178,12 +138,12 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord
|
||||||
encKey := t.keychain.GetKey(add.EncryptionKey).(encryptionkey.PrivKey)
|
encKey := t.keychain.GetKey(add.EncryptionKey).(encryptionkey.PrivKey)
|
||||||
rawKey, _ := encKey.GetPublic().Raw()
|
rawKey, _ := encKey.GetPublic().Raw()
|
||||||
|
|
||||||
convCh = &aclrecordproto2.ACLContentValue{
|
convCh = &aclrecordproto.ACLContentValue{
|
||||||
Value: &aclrecordproto2.ACLContentValue_UserAdd{
|
Value: &aclrecordproto.ACLContentValue_UserAdd{
|
||||||
UserAdd: &aclrecordproto2.ACLUserAdd{
|
UserAdd: &aclrecordproto.ACLUserAdd{
|
||||||
Identity: []byte(t.keychain.GetIdentity(add.Identity)),
|
Identity: []byte(t.keychain.GetIdentity(add.Identity)),
|
||||||
EncryptionKey: rawKey,
|
EncryptionKey: rawKey,
|
||||||
EncryptedReadKeys: t.encryptReadKeys(add.EncryptedReadKeys, encKey),
|
EncryptedReadKeys: t.encryptReadKeysWithPubKey(add.EncryptedReadKeys, encKey),
|
||||||
Permissions: t.convertPermission(add.Permission),
|
Permissions: t.convertPermission(add.Permission),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -191,52 +151,50 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord
|
||||||
case ch.UserJoin != nil:
|
case ch.UserJoin != nil:
|
||||||
join := ch.UserJoin
|
join := ch.UserJoin
|
||||||
|
|
||||||
encKey := t.keychain.
|
encKey := t.keychain.GetKey(join.EncryptionKey).(encryptionkey.PrivKey)
|
||||||
GetKey(join.EncryptionKey).(encryptionkey.PrivKey)
|
|
||||||
rawKey, _ := encKey.GetPublic().Raw()
|
rawKey, _ := encKey.GetPublic().Raw()
|
||||||
|
|
||||||
idKey, _ := t.keychain.SigningKeysByYAMLIdentity[join.Identity].GetPublic().Raw()
|
idKey, _ := t.keychain.SigningKeysByYAMLName[join.Identity].GetPublic().Raw()
|
||||||
signKey := t.keychain.GetKey(join.AcceptSignature).(signingkey.PrivKey)
|
signKey := t.keychain.GetKey(join.AcceptKey).(signingkey.PrivKey)
|
||||||
signature, err := signKey.Sign(idKey)
|
signature, err := signKey.Sign(idKey)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
acceptPubKey, _ := signKey.GetPublic().Raw()
|
||||||
|
|
||||||
convCh = &aclrecordproto2.ACLContentValue{
|
convCh = &aclrecordproto.ACLContentValue{
|
||||||
Value: &aclrecordproto2.ACLContentValue_UserJoin{
|
Value: &aclrecordproto.ACLContentValue_UserJoin{
|
||||||
UserJoin: &aclrecordproto2.ACLUserJoin{
|
UserJoin: &aclrecordproto.ACLUserJoin{
|
||||||
Identity: []byte(t.keychain.GetIdentity(join.Identity)),
|
Identity: []byte(t.keychain.GetIdentity(join.Identity)),
|
||||||
EncryptionKey: rawKey,
|
EncryptionKey: rawKey,
|
||||||
AcceptSignature: signature,
|
AcceptSignature: signature,
|
||||||
InviteId: join.InviteId,
|
AcceptPubKey: acceptPubKey,
|
||||||
EncryptedReadKeys: t.encryptReadKeys(join.EncryptedReadKeys, encKey),
|
EncryptedReadKeys: t.encryptReadKeysWithPubKey(join.EncryptedReadKeys, encKey),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
case ch.UserInvite != nil:
|
case ch.UserInvite != nil:
|
||||||
invite := ch.UserInvite
|
invite := ch.UserInvite
|
||||||
rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(signingkey.PrivKey).GetPublic().Raw()
|
rawAcceptKey, _ := t.keychain.GetKey(invite.AcceptKey).(signingkey.PrivKey).GetPublic().Raw()
|
||||||
encKey := t.keychain.
|
hash := t.keychain.GetKey(invite.EncryptionKey).(*SymKey).Hash
|
||||||
GetKey(invite.EncryptionKey).(encryptionkey.PrivKey)
|
encKey := t.keychain.ReadKeysByHash[hash]
|
||||||
rawEncKey, _ := encKey.GetPublic().Raw()
|
|
||||||
|
|
||||||
convCh = &aclrecordproto2.ACLContentValue{
|
convCh = &aclrecordproto.ACLContentValue{
|
||||||
Value: &aclrecordproto2.ACLContentValue_UserInvite{
|
Value: &aclrecordproto.ACLContentValue_UserInvite{
|
||||||
UserInvite: &aclrecordproto2.ACLUserInvite{
|
UserInvite: &aclrecordproto.ACLUserInvite{
|
||||||
AcceptPublicKey: rawAcceptKey,
|
AcceptPublicKey: rawAcceptKey,
|
||||||
EncryptPublicKey: rawEncKey,
|
EncryptSymKeyHash: hash,
|
||||||
EncryptedReadKeys: t.encryptReadKeys(invite.EncryptedReadKeys, encKey),
|
EncryptedReadKeys: t.encryptReadKeysWithSymKey(invite.EncryptedReadKeys, encKey.Key),
|
||||||
Permissions: t.convertPermission(invite.Permissions),
|
Permissions: t.convertPermission(invite.Permissions),
|
||||||
InviteId: invite.InviteId,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
case ch.UserPermissionChange != nil:
|
case ch.UserPermissionChange != nil:
|
||||||
permissionChange := ch.UserPermissionChange
|
permissionChange := ch.UserPermissionChange
|
||||||
|
|
||||||
convCh = &aclrecordproto2.ACLContentValue{
|
convCh = &aclrecordproto.ACLContentValue{
|
||||||
Value: &aclrecordproto2.ACLContentValue_UserPermissionChange{
|
Value: &aclrecordproto.ACLContentValue_UserPermissionChange{
|
||||||
UserPermissionChange: &aclrecordproto2.ACLUserPermissionChange{
|
UserPermissionChange: &aclrecordproto.ACLUserPermissionChange{
|
||||||
Identity: []byte(t.keychain.GetIdentity(permissionChange.Identity)),
|
Identity: []byte(t.keychain.GetIdentity(permissionChange.Identity)),
|
||||||
Permissions: t.convertPermission(permissionChange.Permission),
|
Permissions: t.convertPermission(permissionChange.Permission),
|
||||||
},
|
},
|
||||||
|
@ -247,24 +205,24 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord
|
||||||
|
|
||||||
newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey)
|
newReadKey := t.keychain.GetKey(remove.NewReadKey).(*SymKey)
|
||||||
|
|
||||||
var replaces []*aclrecordproto2.ACLReadKeyReplace
|
var replaces []*aclrecordproto.ACLReadKeyReplace
|
||||||
for _, id := range remove.IdentitiesLeft {
|
for _, id := range remove.IdentitiesLeft {
|
||||||
encKey := t.keychain.EncryptionKeysByYAMLIdentity[id]
|
encKey := t.keychain.EncryptionKeysByYAMLName[id]
|
||||||
rawEncKey, _ := encKey.GetPublic().Raw()
|
rawEncKey, _ := encKey.GetPublic().Raw()
|
||||||
encReadKey, err := encKey.GetPublic().Encrypt(newReadKey.Key.Bytes())
|
encReadKey, err := encKey.GetPublic().Encrypt(newReadKey.Key.Bytes())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
replaces = append(replaces, &aclrecordproto2.ACLReadKeyReplace{
|
replaces = append(replaces, &aclrecordproto.ACLReadKeyReplace{
|
||||||
Identity: []byte(t.keychain.GetIdentity(id)),
|
Identity: []byte(t.keychain.GetIdentity(id)),
|
||||||
EncryptionKey: rawEncKey,
|
EncryptionKey: rawEncKey,
|
||||||
EncryptedReadKey: encReadKey,
|
EncryptedReadKey: encReadKey,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
convCh = &aclrecordproto2.ACLContentValue{
|
convCh = &aclrecordproto.ACLContentValue{
|
||||||
Value: &aclrecordproto2.ACLContentValue_UserRemove{
|
Value: &aclrecordproto.ACLContentValue_UserRemove{
|
||||||
UserRemove: &aclrecordproto2.ACLUserRemove{
|
UserRemove: &aclrecordproto.ACLUserRemove{
|
||||||
Identity: []byte(t.keychain.GetIdentity(remove.RemovedIdentity)),
|
Identity: []byte(t.keychain.GetIdentity(remove.RemovedIdentity)),
|
||||||
ReadKeyReplaces: replaces,
|
ReadKeyReplaces: replaces,
|
||||||
},
|
},
|
||||||
|
@ -278,7 +236,7 @@ func (t *ACLListStorageBuilder) parseACLChange(ch *ACLChange) (convCh *aclrecord
|
||||||
return convCh
|
return convCh
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryptionkey.PrivKey) (enc [][]byte) {
|
func (t *ACLListStorageBuilder) encryptReadKeysWithPubKey(keys []string, encKey encryptionkey.PrivKey) (enc [][]byte) {
|
||||||
for _, k := range keys {
|
for _, k := range keys {
|
||||||
realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes()
|
realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes()
|
||||||
res, err := encKey.GetPublic().Encrypt(realKey)
|
res, err := encKey.GetPublic().Encrypt(realKey)
|
||||||
|
@ -291,43 +249,47 @@ func (t *ACLListStorageBuilder) encryptReadKeys(keys []string, encKey encryption
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) convertPermission(perm string) aclrecordproto2.ACLUserPermissions {
|
func (t *ACLListStorageBuilder) encryptReadKeysWithSymKey(keys []string, key *symmetric.Key) (enc [][]byte) {
|
||||||
|
for _, k := range keys {
|
||||||
|
realKey := t.keychain.GetKey(k).(*SymKey).Key.Bytes()
|
||||||
|
res, err := key.Encrypt(realKey)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
enc = append(enc, res)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ACLListStorageBuilder) convertPermission(perm string) aclrecordproto.ACLUserPermissions {
|
||||||
switch perm {
|
switch perm {
|
||||||
case "admin":
|
case "admin":
|
||||||
return aclrecordproto2.ACLUserPermissions_Admin
|
return aclrecordproto.ACLUserPermissions_Admin
|
||||||
case "writer":
|
case "writer":
|
||||||
return aclrecordproto2.ACLUserPermissions_Writer
|
return aclrecordproto.ACLUserPermissions_Writer
|
||||||
case "reader":
|
case "reader":
|
||||||
return aclrecordproto2.ACLUserPermissions_Reader
|
return aclrecordproto.ACLUserPermissions_Reader
|
||||||
default:
|
default:
|
||||||
panic(fmt.Sprintf("incorrect permission: %s", perm))
|
panic(fmt.Sprintf("incorrect permission: %s", perm))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto2.ACLRecord, id string) error) (err error) {
|
func (t *ACLListStorageBuilder) traverseFromHead(f func(rec *aclrecordproto.ACLRecord, id string) error) (err error) {
|
||||||
for i := len(t.records) - 1; i >= 0; i-- {
|
panic("this was removed, add if needed")
|
||||||
err = f(t.records[i], t.rawRecords[i].Id)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *ACLListStorageBuilder) parseRoot(root *Root) {
|
func (t *ACLListStorageBuilder) parseRoot(root *Root) (rawRoot *aclrecordproto.RawACLRecordWithId) {
|
||||||
rawSignKey, _ := t.keychain.SigningKeysByYAMLIdentity[root.Identity].GetPublic().Raw()
|
rawSignKey, _ := t.keychain.SigningKeysByYAMLName[root.Identity].GetPublic().Raw()
|
||||||
rawEncKey, _ := t.keychain.EncryptionKeysByYAMLIdentity[root.Identity].GetPublic().Raw()
|
rawEncKey, _ := t.keychain.EncryptionKeysByYAMLName[root.Identity].GetPublic().Raw()
|
||||||
readKey, _ := aclrecordproto2.ACLReadKeyDerive(rawSignKey, rawEncKey)
|
readKey := t.keychain.ReadKeysByYAMLName[root.Identity]
|
||||||
hasher := fnv.New64()
|
aclRoot := &aclrecordproto.ACLRoot{
|
||||||
hasher.Write(readKey.Bytes())
|
|
||||||
t.root = &aclrecordproto2.ACLRoot{
|
|
||||||
Identity: rawSignKey,
|
Identity: rawSignKey,
|
||||||
EncryptionKey: rawEncKey,
|
EncryptionKey: rawEncKey,
|
||||||
SpaceId: root.SpaceId,
|
SpaceId: root.SpaceId,
|
||||||
EncryptedReadKey: nil,
|
EncryptedReadKey: nil,
|
||||||
DerivationScheme: "scheme",
|
DerivationScheme: "scheme",
|
||||||
CurrentReadKeyHash: hasher.Sum64(),
|
CurrentReadKeyHash: readKey.Hash,
|
||||||
}
|
}
|
||||||
t.rawRoot = t.createRaw(t.root, rawSignKey)
|
return t.createRaw(aclRoot, rawSignKey)
|
||||||
t.id = t.rawRoot.Id
|
|
||||||
}
|
}
|
|
@ -9,7 +9,7 @@ package acllistbuilder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
28
common/commonspace/object/keychain/keychain.go
Normal file
28
common/commonspace/object/keychain/keychain.go
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
package keychain
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Keychain struct {
|
||||||
|
keys map[string]signingkey.PubKey
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewKeychain() *Keychain {
|
||||||
|
return &Keychain{
|
||||||
|
keys: make(map[string]signingkey.PubKey),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (k *Keychain) GetOrAdd(identity string) (signingkey.PubKey, error) {
|
||||||
|
if key, exists := k.keys[identity]; exists {
|
||||||
|
return key, nil
|
||||||
|
}
|
||||||
|
res, err := signingkey.NewSigningEd25519PubKeyFromBytes([]byte(identity))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
k.keys[identity] = res.(signingkey.PubKey)
|
||||||
|
return res.(signingkey.PubKey), nil
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package syncobjectgetter
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync/synchandler"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SyncObject interface {
|
||||||
|
synchandler.SyncHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
type SyncObjectGetter interface {
|
||||||
|
GetObject(ctx context.Context, objectId string) (SyncObject, error)
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
|
@ -1,10 +1,10 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/keychain"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cid"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/cidutil"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
|
@ -45,10 +45,10 @@ type ChangeBuilder interface {
|
||||||
|
|
||||||
type changeBuilder struct {
|
type changeBuilder struct {
|
||||||
rootChange *treechangeproto.RawTreeChangeWithId
|
rootChange *treechangeproto.RawTreeChangeWithId
|
||||||
keys *common.Keychain
|
keys *keychain.Keychain
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewChangeBuilder(keys *common.Keychain, rootChange *treechangeproto.RawTreeChangeWithId) ChangeBuilder {
|
func NewChangeBuilder(keys *keychain.Keychain, rootChange *treechangeproto.RawTreeChangeWithId) ChangeBuilder {
|
||||||
return &changeBuilder{keys: keys, rootChange: rootChange}
|
return &changeBuilder{keys: keys, rootChange: rootChange}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ func (c *changeBuilder) ConvertFromRaw(rawIdChange *treechangeproto.RawTreeChang
|
||||||
|
|
||||||
if verify {
|
if verify {
|
||||||
// verifying ID
|
// verifying ID
|
||||||
if !cid.VerifyCID(rawIdChange.RawChange, rawIdChange.Id) {
|
if !cidutil.VerifyCID(rawIdChange.RawChange, rawIdChange.Id) {
|
||||||
err = ErrIncorrectCID
|
err = ErrIncorrectCID
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -131,7 +131,7 @@ func (c *changeBuilder) BuildInitialContent(payload InitialContent) (ch *Change,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
id, err := cid.NewCIDFromBytes(marshalledRawChange)
|
id, err := cidutil.NewCIDFromBytes(marshalledRawChange)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -186,7 +186,7 @@ func (c *changeBuilder) BuildContent(payload BuilderContent) (ch *Change, rawIdC
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
id, err := cid.NewCIDFromBytes(marshalledRawChange)
|
id, err := cidutil.NewCIDFromBytes(marshalledRawChange)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
|
@ -1,9 +1,9 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ObjectTreeValidator interface {
|
type ObjectTreeValidator interface {
|
|
@ -1,4 +1,4 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
type DescriptionParser interface {
|
type DescriptionParser interface {
|
||||||
ParseChange(*Change) ([]string, error)
|
ParseChange(*Change) ([]string, error)
|
|
@ -1,16 +1,16 @@
|
||||||
// Code generated by MockGen. DO NOT EDIT.
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree (interfaces: ObjectTree)
|
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree (interfaces: ObjectTree)
|
||||||
|
|
||||||
// Package mock_tree is a generated GoMock package.
|
// Package mock_objecttree is a generated GoMock package.
|
||||||
package mock_tree
|
package mock_objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
context "context"
|
context "context"
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
objecttree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -38,10 +38,10 @@ func (m *MockObjectTree) EXPECT() *MockObjectTreeMockRecorder {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddContent mocks base method.
|
// AddContent mocks base method.
|
||||||
func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 tree.SignableChangeContent) (tree.AddResult, error) {
|
func (m *MockObjectTree) AddContent(arg0 context.Context, arg1 objecttree.SignableChangeContent) (objecttree.AddResult, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "AddContent", arg0, arg1)
|
ret := m.ctrl.Call(m, "AddContent", arg0, arg1)
|
||||||
ret0, _ := ret[0].(tree.AddResult)
|
ret0, _ := ret[0].(objecttree.AddResult)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
@ -53,10 +53,10 @@ func (mr *MockObjectTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddRawChanges mocks base method.
|
// AddRawChanges mocks base method.
|
||||||
func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 tree.RawChangesPayload) (tree.AddResult, error) {
|
func (m *MockObjectTree) AddRawChanges(arg0 context.Context, arg1 objecttree.RawChangesPayload) (objecttree.AddResult, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "AddRawChanges", arg0, arg1)
|
ret := m.ctrl.Call(m, "AddRawChanges", arg0, arg1)
|
||||||
ret0, _ := ret[0].(tree.AddResult)
|
ret0, _ := ret[0].(objecttree.AddResult)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
@ -186,7 +186,7 @@ func (mr *MockObjectTreeMockRecorder) ID() *gomock.Call {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterate mocks base method.
|
// Iterate mocks base method.
|
||||||
func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*tree.Change) bool) error {
|
func (m *MockObjectTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*objecttree.Change) bool) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Iterate", arg0, arg1)
|
ret := m.ctrl.Call(m, "Iterate", arg0, arg1)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
@ -200,7 +200,7 @@ func (mr *MockObjectTreeMockRecorder) Iterate(arg0, arg1 interface{}) *gomock.Ca
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterateFrom mocks base method.
|
// IterateFrom mocks base method.
|
||||||
func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*tree.Change) bool) error {
|
func (m *MockObjectTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*objecttree.Change) bool) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "IterateFrom", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "IterateFrom", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
@ -250,10 +250,10 @@ func (mr *MockObjectTreeMockRecorder) RUnlock() *gomock.Call {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Root mocks base method.
|
// Root mocks base method.
|
||||||
func (m *MockObjectTree) Root() *tree.Change {
|
func (m *MockObjectTree) Root() *objecttree.Change {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Root")
|
ret := m.ctrl.Call(m, "Root")
|
||||||
ret0, _ := ret[0].(*tree.Change)
|
ret0, _ := ret[0].(*objecttree.Change)
|
||||||
return ret0
|
return ret0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,10 +278,10 @@ func (mr *MockObjectTreeMockRecorder) SnapshotPath() *gomock.Call {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Storage mocks base method.
|
// Storage mocks base method.
|
||||||
func (m *MockObjectTree) Storage() storage.TreeStorage {
|
func (m *MockObjectTree) Storage() treestorage.TreeStorage {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Storage")
|
ret := m.ctrl.Call(m, "Storage")
|
||||||
ret0, _ := ret[0].(storage.TreeStorage)
|
ret0, _ := ret[0].(treestorage.TreeStorage)
|
||||||
return ret0
|
return ret0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
//go:generate mockgen -destination mock_objecttree/mock_objecttree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree ObjectTree
|
//go:generate mockgen -destination mock_objecttree/mock_objecttree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree ObjectTree
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/aclrecordproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
|
list2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
list "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/keychain"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -59,7 +59,7 @@ type ObjectTree interface {
|
||||||
SnapshotPath() []string
|
SnapshotPath() []string
|
||||||
ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*treechangeproto.RawTreeChangeWithId, error)
|
ChangesAfterCommonSnapshot(snapshotPath, heads []string) ([]*treechangeproto.RawTreeChangeWithId, error)
|
||||||
|
|
||||||
Storage() storage.TreeStorage
|
Storage() treestorage.TreeStorage
|
||||||
|
|
||||||
AddContent(ctx context.Context, content SignableChangeContent) (AddResult, error)
|
AddContent(ctx context.Context, content SignableChangeContent) (AddResult, error)
|
||||||
AddRawChanges(ctx context.Context, changes RawChangesPayload) (AddResult, error)
|
AddRawChanges(ctx context.Context, changes RawChangesPayload) (AddResult, error)
|
||||||
|
@ -69,12 +69,12 @@ type ObjectTree interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type objectTree struct {
|
type objectTree struct {
|
||||||
treeStorage storage.TreeStorage
|
treeStorage treestorage.TreeStorage
|
||||||
changeBuilder ChangeBuilder
|
changeBuilder ChangeBuilder
|
||||||
validator ObjectTreeValidator
|
validator ObjectTreeValidator
|
||||||
rawChangeLoader *rawChangeLoader
|
rawChangeLoader *rawChangeLoader
|
||||||
treeBuilder *treeBuilder
|
treeBuilder *treeBuilder
|
||||||
aclList list.ACLList
|
aclList list2.ACLList
|
||||||
|
|
||||||
id string
|
id string
|
||||||
root *treechangeproto.RawTreeChangeWithId
|
root *treechangeproto.RawTreeChangeWithId
|
||||||
|
@ -96,18 +96,18 @@ type objectTree struct {
|
||||||
type objectTreeDeps struct {
|
type objectTreeDeps struct {
|
||||||
changeBuilder ChangeBuilder
|
changeBuilder ChangeBuilder
|
||||||
treeBuilder *treeBuilder
|
treeBuilder *treeBuilder
|
||||||
treeStorage storage.TreeStorage
|
treeStorage treestorage.TreeStorage
|
||||||
validator ObjectTreeValidator
|
validator ObjectTreeValidator
|
||||||
rawChangeLoader *rawChangeLoader
|
rawChangeLoader *rawChangeLoader
|
||||||
aclList list.ACLList
|
aclList list2.ACLList
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultObjectTreeDeps(
|
func defaultObjectTreeDeps(
|
||||||
rootChange *treechangeproto.RawTreeChangeWithId,
|
rootChange *treechangeproto.RawTreeChangeWithId,
|
||||||
treeStorage storage.TreeStorage,
|
treeStorage treestorage.TreeStorage,
|
||||||
aclList list.ACLList) objectTreeDeps {
|
aclList list2.ACLList) objectTreeDeps {
|
||||||
|
|
||||||
keychain := common.NewKeychain()
|
keychain := keychain.NewKeychain()
|
||||||
changeBuilder := NewChangeBuilder(keychain, rootChange)
|
changeBuilder := NewChangeBuilder(keychain, rootChange)
|
||||||
treeBuilder := newTreeBuilder(treeStorage, changeBuilder)
|
treeBuilder := newTreeBuilder(treeStorage, changeBuilder)
|
||||||
return objectTreeDeps{
|
return objectTreeDeps{
|
||||||
|
@ -145,7 +145,7 @@ func (ot *objectTree) Header() *treechangeproto.RawTreeChangeWithId {
|
||||||
return ot.root
|
return ot.root
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ot *objectTree) Storage() storage.TreeStorage {
|
func (ot *objectTree) Storage() treestorage.TreeStorage {
|
||||||
return ot.treeStorage
|
return ot.treeStorage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ func (ot *objectTree) prepareBuilderContent(content SignableChangeContent) (cnt
|
||||||
canWrite := state.HasPermission(content.Identity, aclrecordproto.ACLUserPermissions_Writer) ||
|
canWrite := state.HasPermission(content.Identity, aclrecordproto.ACLUserPermissions_Writer) ||
|
||||||
state.HasPermission(content.Identity, aclrecordproto.ACLUserPermissions_Admin)
|
state.HasPermission(content.Identity, aclrecordproto.ACLUserPermissions_Admin)
|
||||||
if !canWrite {
|
if !canWrite {
|
||||||
err = list.ErrInsufficientPermissions
|
err = list2.ErrInsufficientPermissions
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,7 +469,7 @@ func (ot *objectTree) IterateFrom(id string, convert ChangeConvertFunc, iterate
|
||||||
}
|
}
|
||||||
readKey, exists := ot.keys[c.ReadKeyHash]
|
readKey, exists := ot.keys[c.ReadKeyHash]
|
||||||
if !exists {
|
if !exists {
|
||||||
err = list.ErrNoReadKey
|
err = list2.ErrNoReadKey
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/testutils/acllistbuilder"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/testutils/acllistbuilder"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"testing"
|
"testing"
|
||||||
|
@ -53,9 +53,9 @@ func (c *mockChangeCreator) createRaw(id, aclId, snapshotId string, isSnapshot b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) storage.TreeStorage {
|
func (c *mockChangeCreator) createNewTreeStorage(treeId, aclHeadId string) treestorage.TreeStorage {
|
||||||
root := c.createRoot(treeId, aclHeadId)
|
root := c.createRoot(treeId, aclHeadId)
|
||||||
treeStorage, _ := storage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root})
|
treeStorage, _ := treestorage.NewInMemoryTreeStorage(root, []string{root.Id}, []*treechangeproto.RawTreeChangeWithId{root})
|
||||||
return treeStorage
|
return treeStorage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,7 +95,7 @@ func (m *mockChangeValidator) ValidateFullTree(tree *Tree, aclList list.ACLList)
|
||||||
|
|
||||||
type testTreeContext struct {
|
type testTreeContext struct {
|
||||||
aclList list.ACLList
|
aclList list.ACLList
|
||||||
treeStorage storage.TreeStorage
|
treeStorage treestorage.TreeStorage
|
||||||
changeBuilder *mockChangeBuilder
|
changeBuilder *mockChangeBuilder
|
||||||
changeCreator *mockChangeCreator
|
changeCreator *mockChangeCreator
|
||||||
objTree ObjectTree
|
objTree ObjectTree
|
|
@ -1,10 +1,10 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/common"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/keychain"
|
||||||
storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/symmetric"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
||||||
|
@ -21,7 +21,7 @@ type ObjectTreeCreatePayload struct {
|
||||||
IsEncrypted bool
|
IsEncrypted bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func BuildObjectTree(treeStorage storage2.TreeStorage, aclList list.ACLList) (ObjectTree, error) {
|
func BuildObjectTree(treeStorage treestorage.TreeStorage, aclList list.ACLList) (ObjectTree, error) {
|
||||||
rootChange, err := treeStorage.Root()
|
rootChange, err := treeStorage.Root()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -33,14 +33,14 @@ func BuildObjectTree(treeStorage storage2.TreeStorage, aclList list.ACLList) (Ob
|
||||||
func CreateDerivedObjectTree(
|
func CreateDerivedObjectTree(
|
||||||
payload ObjectTreeCreatePayload,
|
payload ObjectTreeCreatePayload,
|
||||||
aclList list.ACLList,
|
aclList list.ACLList,
|
||||||
createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) {
|
createStorage treestorage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) {
|
||||||
return createObjectTree(payload, 0, nil, aclList, createStorage)
|
return createObjectTree(payload, 0, nil, aclList, createStorage)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateObjectTree(
|
func CreateObjectTree(
|
||||||
payload ObjectTreeCreatePayload,
|
payload ObjectTreeCreatePayload,
|
||||||
aclList list.ACLList,
|
aclList list.ACLList,
|
||||||
createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) {
|
createStorage treestorage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) {
|
||||||
bytes := make([]byte, 32)
|
bytes := make([]byte, 32)
|
||||||
_, err = rand.Read(bytes)
|
_, err = rand.Read(bytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -54,7 +54,7 @@ func createObjectTree(
|
||||||
timestamp int64,
|
timestamp int64,
|
||||||
seed []byte,
|
seed []byte,
|
||||||
aclList list.ACLList,
|
aclList list.ACLList,
|
||||||
createStorage storage2.TreeStorageCreatorFunc) (objTree ObjectTree, err error) {
|
createStorage treestorage.TreeStorageCreatorFunc) (objTree ObjectTree, err error) {
|
||||||
aclList.RLock()
|
aclList.RLock()
|
||||||
aclHeadId := aclList.Head().Id
|
aclHeadId := aclList.Head().Id
|
||||||
aclList.RUnlock()
|
aclList.RUnlock()
|
||||||
|
@ -72,14 +72,13 @@ func createObjectTree(
|
||||||
Seed: seed,
|
Seed: seed,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, raw, err := NewChangeBuilder(common.NewKeychain(), nil).BuildInitialContent(cnt)
|
_, raw, err := NewChangeBuilder(keychain.NewKeychain(), nil).BuildInitialContent(cnt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// create storage
|
// create storage
|
||||||
st, err := createStorage(storage2.TreeStorageCreatePayload{
|
st, err := createStorage(treestorage.TreeStorageCreatePayload{
|
||||||
TreeId: raw.Id,
|
|
||||||
RootRawChange: raw,
|
RootRawChange: raw,
|
||||||
Changes: []*treechangeproto.RawTreeChangeWithId{raw},
|
Changes: []*treechangeproto.RawTreeChangeWithId{raw},
|
||||||
Heads: []string{raw.Id},
|
Heads: []string{raw.Id},
|
||||||
|
@ -130,6 +129,7 @@ func buildObjectTree(deps objectTreeDeps) (ObjectTree, error) {
|
||||||
|
|
||||||
objTree.id = objTree.treeStorage.Id()
|
objTree.id = objTree.treeStorage.Id()
|
||||||
|
|
||||||
|
objTree.id = objTree.treeStorage.Id()
|
||||||
objTree.root, err = objTree.treeStorage.Root()
|
objTree.root, err = objTree.treeStorage.Root()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
|
@ -1,15 +1,15 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type rawChangeLoader struct {
|
type rawChangeLoader struct {
|
||||||
treeStorage storage.TreeStorage
|
treeStorage treestorage.TreeStorage
|
||||||
changeBuilder ChangeBuilder
|
changeBuilder ChangeBuilder
|
||||||
|
|
||||||
// buffers
|
// buffers
|
||||||
|
@ -23,7 +23,7 @@ type rawCacheEntry struct {
|
||||||
position int
|
position int
|
||||||
}
|
}
|
||||||
|
|
||||||
func newRawChangeLoader(treeStorage storage.TreeStorage, changeBuilder ChangeBuilder) *rawChangeLoader {
|
func newRawChangeLoader(treeStorage treestorage.TreeStorage, changeBuilder ChangeBuilder) *rawChangeLoader {
|
||||||
return &rawChangeLoader{
|
return &rawChangeLoader{
|
||||||
treeStorage: treeStorage,
|
treeStorage: treeStorage,
|
||||||
changeBuilder: changeBuilder,
|
changeBuilder: changeBuilder,
|
|
@ -0,0 +1,17 @@
|
||||||
|
package objecttree
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ValidateRawTree(payload treestorage.TreeStorageCreatePayload, aclList list.ACLList) (err error) {
|
||||||
|
provider := treestorage.NewInMemoryTreeStorageProvider()
|
||||||
|
treeStorage, err := provider.CreateTreeStorage(payload)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = BuildObjectTree(treeStorage, aclList)
|
||||||
|
return
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/keys/asymmetric/signingkey"
|
|
@ -1,4 +1,4 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
|
@ -1,4 +1,4 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
|
@ -1,11 +1,11 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"time"
|
"time"
|
||||||
|
@ -17,7 +17,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
type treeBuilder struct {
|
type treeBuilder struct {
|
||||||
treeStorage storage.TreeStorage
|
treeStorage treestorage.TreeStorage
|
||||||
builder ChangeBuilder
|
builder ChangeBuilder
|
||||||
|
|
||||||
cache map[string]*Change
|
cache map[string]*Change
|
||||||
|
@ -28,7 +28,7 @@ type treeBuilder struct {
|
||||||
loadBuffer []*Change
|
loadBuffer []*Change
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTreeBuilder(storage storage.TreeStorage, builder ChangeBuilder) *treeBuilder {
|
func newTreeBuilder(storage treestorage.TreeStorage, builder ChangeBuilder) *treeBuilder {
|
||||||
return &treeBuilder{
|
return &treeBuilder{
|
||||||
treeStorage: storage,
|
treeStorage: storage,
|
||||||
builder: builder,
|
builder: builder,
|
|
@ -2,7 +2,7 @@
|
||||||
// +build !linux,!darwin android ios nographviz
|
// +build !linux,!darwin android ios nographviz
|
||||||
// +build !amd64
|
// +build !amd64
|
||||||
|
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import "fmt"
|
import "fmt"
|
||||||
|
|
|
@ -5,20 +5,18 @@
|
||||||
// +build !nographviz
|
// +build !nographviz
|
||||||
// +build amd64 arm64
|
// +build amd64 arm64
|
||||||
|
|
||||||
package acltree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
"unicode"
|
|
||||||
|
|
||||||
"github.com/goccy/go-graphviz"
|
"github.com/goccy/go-graphviz"
|
||||||
"github.com/goccy/go-graphviz/cgraph"
|
"github.com/goccy/go-graphviz/cgraph"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (t *Tree) Graph() (data string, err error) {
|
func (t *Tree) Graph(parser DescriptionParser) (data string, err error) {
|
||||||
var order = make(map[string]string)
|
var order = make(map[string]string)
|
||||||
var seq = 0
|
var seq = 0
|
||||||
t.Iterate(t.RootId(), func(c *Change) (isContinue bool) {
|
t.Iterate(t.RootId(), func(c *Change) (isContinue bool) {
|
||||||
|
@ -46,44 +44,15 @@ func (t *Tree) Graph() (data string, err error) {
|
||||||
if e != nil {
|
if e != nil {
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
if c.Content.GetAclData() != nil {
|
n.SetStyle(cgraph.FilledNodeStyle)
|
||||||
n.SetStyle(cgraph.FilledNodeStyle)
|
|
||||||
} else if c.IsSnapshot {
|
|
||||||
n.SetStyle(cgraph.DashedNodeStyle)
|
|
||||||
}
|
|
||||||
nodes[c.Id] = n
|
nodes[c.Id] = n
|
||||||
ord := order[c.Id]
|
ord := order[c.Id]
|
||||||
if ord == "" {
|
if ord == "" {
|
||||||
ord = "miss"
|
ord = "miss"
|
||||||
}
|
}
|
||||||
var chSymbs []string
|
chSymbs, err := parser.ParseChange(c)
|
||||||
if c.Content.AclData != nil {
|
if err != nil {
|
||||||
for _, chc := range c.Content.AclData.AclContent {
|
return err
|
||||||
tp := fmt.Sprintf("%T", chc.Value)
|
|
||||||
tp = strings.Replace(tp, "ACLChange_ACLContent_Value_", "", 1)
|
|
||||||
res := ""
|
|
||||||
for _, ts := range tp {
|
|
||||||
if unicode.IsUpper(ts) {
|
|
||||||
res += string(ts)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
chSymbs = append(chSymbs, res)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if c.DecryptedDocumentChange != nil {
|
|
||||||
// TODO: add some parser to provide custom unmarshalling for the document change
|
|
||||||
//for _, chc := range c.DecryptedDocumentChange.Content {
|
|
||||||
// tp := fmt.Sprintf("%T", chc.Value)
|
|
||||||
// tp = strings.Replace(tp, "ChangeContent_Value_", "", 1)
|
|
||||||
// res := ""
|
|
||||||
// for _, ts := range tp {
|
|
||||||
// if unicode.IsUpper(ts) {
|
|
||||||
// res += string(ts)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// chSymbs = append(chSymbs, res)
|
|
||||||
//}
|
|
||||||
chSymbs = append(chSymbs, "DEC")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
shortId := c.Id
|
shortId := c.Id
|
|
@ -1,4 +1,4 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
|
@ -1,4 +1,4 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
import "math"
|
import "math"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package tree
|
package objecttree
|
||||||
|
|
||||||
func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) {
|
func commonSnapshotForTwoPaths(ourPath []string, theirPath []string) (string, error) {
|
||||||
var i int
|
var i int
|
|
@ -1,5 +1,5 @@
|
||||||
// Code generated by MockGen. DO NOT EDIT.
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree (interfaces: SyncClient,SyncTree,ReceiveQueue,HeadNotifiable)
|
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree (interfaces: SyncClient,SyncTree,ReceiveQueue,HeadNotifiable)
|
||||||
|
|
||||||
// Package mock_synctree is a generated GoMock package.
|
// Package mock_synctree is a generated GoMock package.
|
||||||
package mock_synctree
|
package mock_synctree
|
||||||
|
@ -8,10 +8,10 @@ import (
|
||||||
context "context"
|
context "context"
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
|
objecttree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
|
treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
|
treestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
spacesyncproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
storage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
|
||||||
tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
|
||||||
treechangeproto "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@ func (mr *MockSyncClientMockRecorder) BroadcastAsyncOrSendResponsible(arg0 inter
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateFullSyncRequest mocks base method.
|
// CreateFullSyncRequest mocks base method.
|
||||||
func (m *MockSyncClient) CreateFullSyncRequest(arg0 tree.ObjectTree, arg1, arg2 []string) (*treechangeproto.TreeSyncMessage, error) {
|
func (m *MockSyncClient) CreateFullSyncRequest(arg0 objecttree.ObjectTree, arg1, arg2 []string) (*treechangeproto.TreeSyncMessage, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "CreateFullSyncRequest", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage)
|
ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage)
|
||||||
|
@ -82,7 +82,7 @@ func (mr *MockSyncClientMockRecorder) CreateFullSyncRequest(arg0, arg1, arg2 int
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateFullSyncResponse mocks base method.
|
// CreateFullSyncResponse mocks base method.
|
||||||
func (m *MockSyncClient) CreateFullSyncResponse(arg0 tree.ObjectTree, arg1, arg2 []string) (*treechangeproto.TreeSyncMessage, error) {
|
func (m *MockSyncClient) CreateFullSyncResponse(arg0 objecttree.ObjectTree, arg1, arg2 []string) (*treechangeproto.TreeSyncMessage, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "CreateFullSyncResponse", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "CreateFullSyncResponse", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage)
|
ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage)
|
||||||
|
@ -97,7 +97,7 @@ func (mr *MockSyncClientMockRecorder) CreateFullSyncResponse(arg0, arg1, arg2 in
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateHeadUpdate mocks base method.
|
// CreateHeadUpdate mocks base method.
|
||||||
func (m *MockSyncClient) CreateHeadUpdate(arg0 tree.ObjectTree, arg1 []*treechangeproto.RawTreeChangeWithId) *treechangeproto.TreeSyncMessage {
|
func (m *MockSyncClient) CreateHeadUpdate(arg0 objecttree.ObjectTree, arg1 []*treechangeproto.RawTreeChangeWithId) *treechangeproto.TreeSyncMessage {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "CreateHeadUpdate", arg0, arg1)
|
ret := m.ctrl.Call(m, "CreateHeadUpdate", arg0, arg1)
|
||||||
ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage)
|
ret0, _ := ret[0].(*treechangeproto.TreeSyncMessage)
|
||||||
|
@ -162,10 +162,10 @@ func (m *MockSyncTree) EXPECT() *MockSyncTreeMockRecorder {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddContent mocks base method.
|
// AddContent mocks base method.
|
||||||
func (m *MockSyncTree) AddContent(arg0 context.Context, arg1 tree.SignableChangeContent) (tree.AddResult, error) {
|
func (m *MockSyncTree) AddContent(arg0 context.Context, arg1 objecttree.SignableChangeContent) (objecttree.AddResult, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "AddContent", arg0, arg1)
|
ret := m.ctrl.Call(m, "AddContent", arg0, arg1)
|
||||||
ret0, _ := ret[0].(tree.AddResult)
|
ret0, _ := ret[0].(objecttree.AddResult)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
@ -177,10 +177,10 @@ func (mr *MockSyncTreeMockRecorder) AddContent(arg0, arg1 interface{}) *gomock.C
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddRawChanges mocks base method.
|
// AddRawChanges mocks base method.
|
||||||
func (m *MockSyncTree) AddRawChanges(arg0 context.Context, arg1 tree.RawChangesPayload) (tree.AddResult, error) {
|
func (m *MockSyncTree) AddRawChanges(arg0 context.Context, arg1 objecttree.RawChangesPayload) (objecttree.AddResult, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "AddRawChanges", arg0, arg1)
|
ret := m.ctrl.Call(m, "AddRawChanges", arg0, arg1)
|
||||||
ret0, _ := ret[0].(tree.AddResult)
|
ret0, _ := ret[0].(objecttree.AddResult)
|
||||||
ret1, _ := ret[1].(error)
|
ret1, _ := ret[1].(error)
|
||||||
return ret0, ret1
|
return ret0, ret1
|
||||||
}
|
}
|
||||||
|
@ -324,7 +324,7 @@ func (mr *MockSyncTreeMockRecorder) ID() *gomock.Call {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterate mocks base method.
|
// Iterate mocks base method.
|
||||||
func (m *MockSyncTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*tree.Change) bool) error {
|
func (m *MockSyncTree) Iterate(arg0 func([]byte) (interface{}, error), arg1 func(*objecttree.Change) bool) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Iterate", arg0, arg1)
|
ret := m.ctrl.Call(m, "Iterate", arg0, arg1)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
@ -338,7 +338,7 @@ func (mr *MockSyncTreeMockRecorder) Iterate(arg0, arg1 interface{}) *gomock.Call
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterateFrom mocks base method.
|
// IterateFrom mocks base method.
|
||||||
func (m *MockSyncTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*tree.Change) bool) error {
|
func (m *MockSyncTree) IterateFrom(arg0 string, arg1 func([]byte) (interface{}, error), arg2 func(*objecttree.Change) bool) error {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "IterateFrom", arg0, arg1, arg2)
|
ret := m.ctrl.Call(m, "IterateFrom", arg0, arg1, arg2)
|
||||||
ret0, _ := ret[0].(error)
|
ret0, _ := ret[0].(error)
|
||||||
|
@ -402,10 +402,10 @@ func (mr *MockSyncTreeMockRecorder) RUnlock() *gomock.Call {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Root mocks base method.
|
// Root mocks base method.
|
||||||
func (m *MockSyncTree) Root() *tree.Change {
|
func (m *MockSyncTree) Root() *objecttree.Change {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Root")
|
ret := m.ctrl.Call(m, "Root")
|
||||||
ret0, _ := ret[0].(*tree.Change)
|
ret0, _ := ret[0].(*objecttree.Change)
|
||||||
return ret0
|
return ret0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -430,10 +430,10 @@ func (mr *MockSyncTreeMockRecorder) SnapshotPath() *gomock.Call {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Storage mocks base method.
|
// Storage mocks base method.
|
||||||
func (m *MockSyncTree) Storage() storage.TreeStorage {
|
func (m *MockSyncTree) Storage() treestorage.TreeStorage {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
ret := m.ctrl.Call(m, "Storage")
|
ret := m.ctrl.Call(m, "Storage")
|
||||||
ret0, _ := ret[0].(storage.TreeStorage)
|
ret0, _ := ret[0].(treestorage.TreeStorage)
|
||||||
return ret0
|
return ret0
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
package synctree
|
package synctree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync"
|
||||||
)
|
)
|
||||||
|
|
||||||
type queuedClient struct {
|
type queuedClient struct {
|
||||||
SyncClient
|
SyncClient
|
||||||
queue syncservice.ActionQueue
|
queue objectsync.ActionQueue
|
||||||
}
|
}
|
||||||
|
|
||||||
func newQueuedClient(client SyncClient, queue syncservice.ActionQueue) SyncClient {
|
func newQueuedClient(client SyncClient, queue objectsync.ActionQueue) SyncClient {
|
||||||
return &queuedClient{
|
return &queuedClient{
|
||||||
SyncClient: client,
|
SyncClient: client,
|
||||||
queue: queue,
|
queue: queue,
|
|
@ -2,7 +2,7 @@ package synctree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,16 +2,16 @@ package synctree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
||||||
)
|
)
|
||||||
|
|
||||||
type RequestFactory interface {
|
type RequestFactory interface {
|
||||||
CreateHeadUpdate(t tree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *treechangeproto.TreeSyncMessage)
|
CreateHeadUpdate(t objecttree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *treechangeproto.TreeSyncMessage)
|
||||||
CreateNewTreeRequest() (msg *treechangeproto.TreeSyncMessage)
|
CreateNewTreeRequest() (msg *treechangeproto.TreeSyncMessage)
|
||||||
CreateFullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (req *treechangeproto.TreeSyncMessage, err error)
|
CreateFullSyncRequest(t objecttree.ObjectTree, theirHeads, theirSnapshotPath []string) (req *treechangeproto.TreeSyncMessage, err error)
|
||||||
CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (*treechangeproto.TreeSyncMessage, error)
|
CreateFullSyncResponse(t objecttree.ObjectTree, theirHeads, theirSnapshotPath []string) (*treechangeproto.TreeSyncMessage, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
var sharedFactory = &requestFactory{}
|
var sharedFactory = &requestFactory{}
|
||||||
|
@ -22,7 +22,7 @@ func GetRequestFactory() RequestFactory {
|
||||||
|
|
||||||
type requestFactory struct{}
|
type requestFactory struct{}
|
||||||
|
|
||||||
func (r *requestFactory) CreateHeadUpdate(t tree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *treechangeproto.TreeSyncMessage) {
|
func (r *requestFactory) CreateHeadUpdate(t objecttree.ObjectTree, added []*treechangeproto.RawTreeChangeWithId) (msg *treechangeproto.TreeSyncMessage) {
|
||||||
return treechangeproto.WrapHeadUpdate(&treechangeproto.TreeHeadUpdate{
|
return treechangeproto.WrapHeadUpdate(&treechangeproto.TreeHeadUpdate{
|
||||||
Heads: t.Heads(),
|
Heads: t.Heads(),
|
||||||
Changes: added,
|
Changes: added,
|
||||||
|
@ -34,7 +34,7 @@ func (r *requestFactory) CreateNewTreeRequest() (msg *treechangeproto.TreeSyncMe
|
||||||
return treechangeproto.WrapFullRequest(&treechangeproto.TreeFullSyncRequest{}, nil)
|
return treechangeproto.WrapFullRequest(&treechangeproto.TreeFullSyncRequest{}, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *requestFactory) CreateFullSyncRequest(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (msg *treechangeproto.TreeSyncMessage, err error) {
|
func (r *requestFactory) CreateFullSyncRequest(t objecttree.ObjectTree, theirHeads, theirSnapshotPath []string) (msg *treechangeproto.TreeSyncMessage, err error) {
|
||||||
req := &treechangeproto.TreeFullSyncRequest{}
|
req := &treechangeproto.TreeFullSyncRequest{}
|
||||||
if t == nil {
|
if t == nil {
|
||||||
return nil, fmt.Errorf("tree should not be empty")
|
return nil, fmt.Errorf("tree should not be empty")
|
||||||
|
@ -54,7 +54,7 @@ func (r *requestFactory) CreateFullSyncRequest(t tree.ObjectTree, theirHeads, th
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *requestFactory) CreateFullSyncResponse(t tree.ObjectTree, theirHeads, theirSnapshotPath []string) (msg *treechangeproto.TreeSyncMessage, err error) {
|
func (r *requestFactory) CreateFullSyncResponse(t objecttree.ObjectTree, theirHeads, theirSnapshotPath []string) (msg *treechangeproto.TreeSyncMessage, err error) {
|
||||||
resp := &treechangeproto.TreeFullSyncResponse{
|
resp := &treechangeproto.TreeFullSyncResponse{
|
||||||
Heads: t.Heads(),
|
Heads: t.Heads(),
|
||||||
SnapshotPath: t.SnapshotPath(),
|
SnapshotPath: t.SnapshotPath(),
|
|
@ -1,11 +1,11 @@
|
||||||
//go:generate mockgen -destination mock_synctree/mock_synctree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree SyncClient,SyncTree,ReceiveQueue,HeadNotifiable
|
//go:generate mockgen -destination mock_synctree/mock_synctree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree SyncClient,SyncTree,ReceiveQueue,HeadNotifiable
|
||||||
package synctree
|
package synctree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type SyncClient interface {
|
type SyncClient interface {
|
||||||
|
@ -16,21 +16,21 @@ type SyncClient interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type syncClient struct {
|
type syncClient struct {
|
||||||
syncservice.StreamPool
|
objectsync.StreamPool
|
||||||
RequestFactory
|
RequestFactory
|
||||||
spaceId string
|
spaceId string
|
||||||
connector nodeconf.ConfConnector
|
connector nodeconf.ConfConnector
|
||||||
configuration nodeconf.Configuration
|
configuration nodeconf.Configuration
|
||||||
|
|
||||||
checker syncservice.StreamChecker
|
checker objectsync.StreamChecker
|
||||||
}
|
}
|
||||||
|
|
||||||
func newSyncClient(
|
func newSyncClient(
|
||||||
spaceId string,
|
spaceId string,
|
||||||
pool syncservice.StreamPool,
|
pool objectsync.StreamPool,
|
||||||
factory RequestFactory,
|
factory RequestFactory,
|
||||||
configuration nodeconf.Configuration,
|
configuration nodeconf.Configuration,
|
||||||
checker syncservice.StreamChecker) SyncClient {
|
checker objectsync.StreamChecker) SyncClient {
|
||||||
return &syncClient{
|
return &syncClient{
|
||||||
StreamPool: pool,
|
StreamPool: pool,
|
||||||
RequestFactory: factory,
|
RequestFactory: factory,
|
|
@ -5,17 +5,17 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/app/logger"
|
||||||
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync/synchandler"
|
||||||
|
spacestorage "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/peer"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
@ -31,14 +31,14 @@ type HeadNotifiable interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type SyncTree interface {
|
type SyncTree interface {
|
||||||
tree.ObjectTree
|
objecttree.ObjectTree
|
||||||
synchandler.SyncHandler
|
synchandler.SyncHandler
|
||||||
Ping() (err error)
|
Ping() (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SyncTree sends head updates to sync service and also sends new changes to update listener
|
// SyncTree sends head updates to sync service and also sends new changes to update listener
|
||||||
type syncTree struct {
|
type syncTree struct {
|
||||||
tree.ObjectTree
|
objecttree.ObjectTree
|
||||||
synchandler.SyncHandler
|
synchandler.SyncHandler
|
||||||
syncClient SyncClient
|
syncClient SyncClient
|
||||||
syncStatus syncstatus.SyncStatusUpdater
|
syncStatus syncstatus.SyncStatusUpdater
|
||||||
|
@ -51,16 +51,16 @@ type syncTree struct {
|
||||||
|
|
||||||
var log = logger.NewNamed("commonspace.synctree").Sugar()
|
var log = logger.NewNamed("commonspace.synctree").Sugar()
|
||||||
|
|
||||||
var createDerivedObjectTree = tree.CreateDerivedObjectTree
|
var createDerivedObjectTree = objecttree.CreateDerivedObjectTree
|
||||||
var createObjectTree = tree.CreateObjectTree
|
var createObjectTree = objecttree.CreateObjectTree
|
||||||
var buildObjectTree = tree.BuildObjectTree
|
var buildObjectTree = objecttree.BuildObjectTree
|
||||||
var createSyncClient = newWrappedSyncClient
|
var createSyncClient = newWrappedSyncClient
|
||||||
|
|
||||||
type CreateDeps struct {
|
type CreateDeps struct {
|
||||||
SpaceId string
|
SpaceId string
|
||||||
Payload tree.ObjectTreeCreatePayload
|
Payload objecttree.ObjectTreeCreatePayload
|
||||||
Configuration nodeconf.Configuration
|
Configuration nodeconf.Configuration
|
||||||
SyncService syncservice.SyncService
|
ObjectSync objectsync.ObjectSync
|
||||||
AclList list.ACLList
|
AclList list.ACLList
|
||||||
SpaceStorage spacestorage.SpaceStorage
|
SpaceStorage spacestorage.SpaceStorage
|
||||||
SyncStatus syncstatus.SyncStatusUpdater
|
SyncStatus syncstatus.SyncStatusUpdater
|
||||||
|
@ -69,13 +69,13 @@ type CreateDeps struct {
|
||||||
|
|
||||||
type BuildDeps struct {
|
type BuildDeps struct {
|
||||||
SpaceId string
|
SpaceId string
|
||||||
SyncService syncservice.SyncService
|
ObjectSync objectsync.ObjectSync
|
||||||
Configuration nodeconf.Configuration
|
Configuration nodeconf.Configuration
|
||||||
HeadNotifiable HeadNotifiable
|
HeadNotifiable HeadNotifiable
|
||||||
Listener updatelistener.UpdateListener
|
Listener updatelistener.UpdateListener
|
||||||
AclList list.ACLList
|
AclList list.ACLList
|
||||||
SpaceStorage spacestorage.SpaceStorage
|
SpaceStorage spacestorage.SpaceStorage
|
||||||
TreeStorage storage.TreeStorage
|
TreeStorage treestorage.TreeStorage
|
||||||
TreeUsage *atomic.Int32
|
TreeUsage *atomic.Int32
|
||||||
SyncStatus syncstatus.SyncStatusUpdater
|
SyncStatus syncstatus.SyncStatusUpdater
|
||||||
}
|
}
|
||||||
|
@ -83,10 +83,10 @@ type BuildDeps struct {
|
||||||
func newWrappedSyncClient(
|
func newWrappedSyncClient(
|
||||||
spaceId string,
|
spaceId string,
|
||||||
factory RequestFactory,
|
factory RequestFactory,
|
||||||
syncService syncservice.SyncService,
|
objectSync objectsync.ObjectSync,
|
||||||
configuration nodeconf.Configuration) SyncClient {
|
configuration nodeconf.Configuration) SyncClient {
|
||||||
syncClient := newSyncClient(spaceId, syncService.StreamPool(), factory, configuration, syncService.StreamChecker())
|
syncClient := newSyncClient(spaceId, objectSync.StreamPool(), factory, configuration, objectSync.StreamChecker())
|
||||||
return newQueuedClient(syncClient, syncService.ActionQueue())
|
return newQueuedClient(syncClient, objectSync.ActionQueue())
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error) {
|
func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error) {
|
||||||
|
@ -98,7 +98,7 @@ func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
|
||||||
syncClient := createSyncClient(
|
syncClient := createSyncClient(
|
||||||
deps.SpaceId,
|
deps.SpaceId,
|
||||||
sharedFactory,
|
sharedFactory,
|
||||||
deps.SyncService,
|
deps.ObjectSync,
|
||||||
deps.Configuration)
|
deps.Configuration)
|
||||||
|
|
||||||
id = objTree.ID()
|
id = objTree.ID()
|
||||||
|
@ -119,7 +119,7 @@ func CreateSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
|
||||||
syncClient := createSyncClient(
|
syncClient := createSyncClient(
|
||||||
deps.SpaceId,
|
deps.SpaceId,
|
||||||
sharedFactory,
|
sharedFactory,
|
||||||
deps.SyncService,
|
deps.ObjectSync,
|
||||||
deps.Configuration)
|
deps.Configuration)
|
||||||
|
|
||||||
id = objTree.ID()
|
id = objTree.ID()
|
||||||
|
@ -145,12 +145,12 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = deps.SyncService.StreamChecker().CheckPeerConnection(peerId)
|
err = deps.ObjectSync.StreamChecker().CheckPeerConnection(peerId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := deps.SyncService.StreamPool().SendSync(peerId, objMsg)
|
resp, err := deps.ObjectSync.StreamPool().SendSync(peerId, objMsg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t
|
||||||
return buildSyncTree(ctx, false, deps)
|
return buildSyncTree(ctx, false, deps)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil && err != storage.ErrUnknownTreeId {
|
if err != nil && err != treestorage.ErrUnknownTreeId {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,7 +188,7 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t
|
||||||
}
|
}
|
||||||
fullSyncResp := resp.GetContent().GetFullSyncResponse()
|
fullSyncResp := resp.GetContent().GetFullSyncResponse()
|
||||||
|
|
||||||
payload := storage.TreeStorageCreatePayload{
|
payload := treestorage.TreeStorageCreatePayload{
|
||||||
RootRawChange: resp.RootChange,
|
RootRawChange: resp.RootChange,
|
||||||
Changes: fullSyncResp.Changes,
|
Changes: fullSyncResp.Changes,
|
||||||
Heads: fullSyncResp.Heads,
|
Heads: fullSyncResp.Heads,
|
||||||
|
@ -196,7 +196,7 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t
|
||||||
|
|
||||||
// basically building tree with in-memory storage and validating that it was without errors
|
// basically building tree with in-memory storage and validating that it was without errors
|
||||||
log.With(zap.String("id", id)).Debug("validating tree")
|
log.With(zap.String("id", id)).Debug("validating tree")
|
||||||
err = tree.ValidateRawTree(payload, deps.AclList)
|
err = objecttree.ValidateRawTree(payload, deps.AclList)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -216,7 +216,7 @@ func buildSyncTree(ctx context.Context, isFirstBuild bool, deps BuildDeps) (t Sy
|
||||||
syncClient := createSyncClient(
|
syncClient := createSyncClient(
|
||||||
deps.SpaceId,
|
deps.SpaceId,
|
||||||
sharedFactory,
|
sharedFactory,
|
||||||
deps.SyncService,
|
deps.ObjectSync,
|
||||||
deps.Configuration)
|
deps.Configuration)
|
||||||
syncTree := &syncTree{
|
syncTree := &syncTree{
|
||||||
ObjectTree: objTree,
|
ObjectTree: objTree,
|
||||||
|
@ -241,21 +241,21 @@ func buildSyncTree(ctx context.Context, isFirstBuild bool, deps BuildDeps) (t Sy
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncTree) IterateFrom(id string, convert tree.ChangeConvertFunc, iterate tree.ChangeIterateFunc) (err error) {
|
func (s *syncTree) IterateFrom(id string, convert objecttree.ChangeConvertFunc, iterate objecttree.ChangeIterateFunc) (err error) {
|
||||||
if err = s.checkAlive(); err != nil {
|
if err = s.checkAlive(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return s.ObjectTree.IterateFrom(id, convert, iterate)
|
return s.ObjectTree.IterateFrom(id, convert, iterate)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncTree) Iterate(convert tree.ChangeConvertFunc, iterate tree.ChangeIterateFunc) (err error) {
|
func (s *syncTree) Iterate(convert objecttree.ChangeConvertFunc, iterate objecttree.ChangeIterateFunc) (err error) {
|
||||||
if err = s.checkAlive(); err != nil {
|
if err = s.checkAlive(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return s.ObjectTree.Iterate(convert, iterate)
|
return s.ObjectTree.Iterate(convert, iterate)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncTree) AddContent(ctx context.Context, content tree.SignableChangeContent) (res tree.AddResult, err error) {
|
func (s *syncTree) AddContent(ctx context.Context, content objecttree.SignableChangeContent) (res objecttree.AddResult, err error) {
|
||||||
if err = s.checkAlive(); err != nil {
|
if err = s.checkAlive(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -272,7 +272,7 @@ func (s *syncTree) AddContent(ctx context.Context, content tree.SignableChangeCo
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncTree) AddRawChanges(ctx context.Context, changesPayload tree.RawChangesPayload) (res tree.AddResult, err error) {
|
func (s *syncTree) AddRawChanges(ctx context.Context, changesPayload objecttree.RawChangesPayload) (res objecttree.AddResult, err error) {
|
||||||
if err = s.checkAlive(); err != nil {
|
if err = s.checkAlive(); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -282,15 +282,15 @@ func (s *syncTree) AddRawChanges(ctx context.Context, changesPayload tree.RawCha
|
||||||
}
|
}
|
||||||
if s.listener != nil {
|
if s.listener != nil {
|
||||||
switch res.Mode {
|
switch res.Mode {
|
||||||
case tree.Nothing:
|
case objecttree.Nothing:
|
||||||
return
|
return
|
||||||
case tree.Append:
|
case objecttree.Append:
|
||||||
s.listener.Update(s)
|
s.listener.Update(s)
|
||||||
case tree.Rebuild:
|
case objecttree.Rebuild:
|
||||||
s.listener.Rebuild(s)
|
s.listener.Rebuild(s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if res.Mode != tree.Nothing {
|
if res.Mode != objecttree.Nothing {
|
||||||
if s.notifiable != nil {
|
if s.notifiable != nil {
|
||||||
s.notifiable.UpdateHeads(s.ID(), res.Heads)
|
s.notifiable.UpdateHeads(s.ID(), res.Heads)
|
||||||
}
|
}
|
|
@ -2,26 +2,26 @@ package synctree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/storage/mock_storage"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/acl/list/mock_list"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree/mock_objecttree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/mock_synctree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener/mock_updatelistener"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treestorage"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacestorage/mock_spacestorage"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener/mock_updatelistener"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/list/mock_list"
|
|
||||||
storage2 "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/storage"
|
|
||||||
tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
type syncTreeMatcher struct {
|
type syncTreeMatcher struct {
|
||||||
objTree tree.ObjectTree
|
objTree objecttree.ObjectTree
|
||||||
client SyncClient
|
client SyncClient
|
||||||
listener updatelistener.UpdateListener
|
listener updatelistener.UpdateListener
|
||||||
}
|
}
|
||||||
|
@ -38,8 +38,8 @@ func (s syncTreeMatcher) String() string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncClientFuncCreator(client SyncClient) func(spaceId string, factory RequestFactory, syncService syncservice.SyncService, configuration nodeconf.Configuration) SyncClient {
|
func syncClientFuncCreator(client SyncClient) func(spaceId string, factory RequestFactory, objectSync objectsync.ObjectSync, configuration nodeconf.Configuration) SyncClient {
|
||||||
return func(spaceId string, factory RequestFactory, syncService syncservice.SyncService, configuration nodeconf.Configuration) SyncClient {
|
return func(spaceId string, factory RequestFactory, objectSync objectsync.ObjectSync, configuration nodeconf.Configuration) SyncClient {
|
||||||
return client
|
return client
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,12 +51,12 @@ func Test_DeriveSyncTree(t *testing.T) {
|
||||||
|
|
||||||
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
||||||
aclListMock := mock_list.NewMockACLList(ctrl)
|
aclListMock := mock_list.NewMockACLList(ctrl)
|
||||||
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
objTreeMock := newTestObjMock(mock_objecttree.NewMockObjectTree(ctrl))
|
||||||
spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl)
|
spaceStorageMock := mock_spacestorage.NewMockSpaceStorage(ctrl)
|
||||||
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
|
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
|
||||||
spaceId := "spaceId"
|
spaceId := "spaceId"
|
||||||
expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId}
|
expectedPayload := objecttree.ObjectTreeCreatePayload{SpaceId: spaceId}
|
||||||
createDerivedObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) {
|
createDerivedObjectTree = func(payload objecttree.ObjectTreeCreatePayload, l list.ACLList, create treestorage.TreeStorageCreatorFunc) (objTree objecttree.ObjectTree, err error) {
|
||||||
require.Equal(t, l, aclListMock)
|
require.Equal(t, l, aclListMock)
|
||||||
require.Equal(t, expectedPayload, payload)
|
require.Equal(t, expectedPayload, payload)
|
||||||
return objTreeMock, nil
|
return objTreeMock, nil
|
||||||
|
@ -88,12 +88,12 @@ func Test_CreateSyncTree(t *testing.T) {
|
||||||
|
|
||||||
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
||||||
aclListMock := mock_list.NewMockACLList(ctrl)
|
aclListMock := mock_list.NewMockACLList(ctrl)
|
||||||
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
objTreeMock := newTestObjMock(mock_objecttree.NewMockObjectTree(ctrl))
|
||||||
spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl)
|
spaceStorageMock := mock_spacestorage.NewMockSpaceStorage(ctrl)
|
||||||
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
|
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
|
||||||
spaceId := "spaceId"
|
spaceId := "spaceId"
|
||||||
expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId}
|
expectedPayload := objecttree.ObjectTreeCreatePayload{SpaceId: spaceId}
|
||||||
createObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) {
|
createObjectTree = func(payload objecttree.ObjectTreeCreatePayload, l list.ACLList, create treestorage.TreeStorageCreatorFunc) (objTree objecttree.ObjectTree, err error) {
|
||||||
require.Equal(t, l, aclListMock)
|
require.Equal(t, l, aclListMock)
|
||||||
require.Equal(t, expectedPayload, payload)
|
require.Equal(t, expectedPayload, payload)
|
||||||
return objTreeMock, nil
|
return objTreeMock, nil
|
||||||
|
@ -126,7 +126,7 @@ func Test_BuildSyncTree(t *testing.T) {
|
||||||
|
|
||||||
updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl)
|
updateListenerMock := mock_updatelistener.NewMockUpdateListener(ctrl)
|
||||||
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
||||||
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
objTreeMock := newTestObjMock(mock_objecttree.NewMockObjectTree(ctrl))
|
||||||
tr := &syncTree{
|
tr := &syncTree{
|
||||||
ObjectTree: objTreeMock,
|
ObjectTree: objTreeMock,
|
||||||
SyncHandler: nil,
|
SyncHandler: nil,
|
||||||
|
@ -139,13 +139,13 @@ func Test_BuildSyncTree(t *testing.T) {
|
||||||
headUpdate := &treechangeproto.TreeSyncMessage{}
|
headUpdate := &treechangeproto.TreeSyncMessage{}
|
||||||
t.Run("AddRawChanges update", func(t *testing.T) {
|
t.Run("AddRawChanges update", func(t *testing.T) {
|
||||||
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
||||||
payload := tree.RawChangesPayload{
|
payload := objecttree.RawChangesPayload{
|
||||||
NewHeads: nil,
|
NewHeads: nil,
|
||||||
RawChanges: changes,
|
RawChanges: changes,
|
||||||
}
|
}
|
||||||
expectedRes := tree.AddResult{
|
expectedRes := objecttree.AddResult{
|
||||||
Added: changes,
|
Added: changes,
|
||||||
Mode: tree.Append,
|
Mode: objecttree.Append,
|
||||||
}
|
}
|
||||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
||||||
Return(expectedRes, nil)
|
Return(expectedRes, nil)
|
||||||
|
@ -160,14 +160,14 @@ func Test_BuildSyncTree(t *testing.T) {
|
||||||
|
|
||||||
t.Run("AddRawChanges rebuild", func(t *testing.T) {
|
t.Run("AddRawChanges rebuild", func(t *testing.T) {
|
||||||
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
||||||
payload := tree.RawChangesPayload{
|
payload := objecttree.RawChangesPayload{
|
||||||
NewHeads: nil,
|
NewHeads: nil,
|
||||||
RawChanges: changes,
|
RawChanges: changes,
|
||||||
}
|
}
|
||||||
|
|
||||||
expectedRes := tree.AddResult{
|
expectedRes := objecttree.AddResult{
|
||||||
Added: changes,
|
Added: changes,
|
||||||
Mode: tree.Rebuild,
|
Mode: objecttree.Rebuild,
|
||||||
}
|
}
|
||||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
||||||
Return(expectedRes, nil)
|
Return(expectedRes, nil)
|
||||||
|
@ -182,13 +182,13 @@ func Test_BuildSyncTree(t *testing.T) {
|
||||||
|
|
||||||
t.Run("AddRawChanges nothing", func(t *testing.T) {
|
t.Run("AddRawChanges nothing", func(t *testing.T) {
|
||||||
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
||||||
payload := tree.RawChangesPayload{
|
payload := objecttree.RawChangesPayload{
|
||||||
NewHeads: nil,
|
NewHeads: nil,
|
||||||
RawChanges: changes,
|
RawChanges: changes,
|
||||||
}
|
}
|
||||||
expectedRes := tree.AddResult{
|
expectedRes := objecttree.AddResult{
|
||||||
Added: changes,
|
Added: changes,
|
||||||
Mode: tree.Nothing,
|
Mode: objecttree.Nothing,
|
||||||
}
|
}
|
||||||
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
objTreeMock.EXPECT().AddRawChanges(gomock.Any(), gomock.Eq(payload)).
|
||||||
Return(expectedRes, nil)
|
Return(expectedRes, nil)
|
||||||
|
@ -200,11 +200,11 @@ func Test_BuildSyncTree(t *testing.T) {
|
||||||
|
|
||||||
t.Run("AddContent", func(t *testing.T) {
|
t.Run("AddContent", func(t *testing.T) {
|
||||||
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
changes := []*treechangeproto.RawTreeChangeWithId{{Id: "some"}}
|
||||||
content := tree.SignableChangeContent{
|
content := objecttree.SignableChangeContent{
|
||||||
Data: []byte("abcde"),
|
Data: []byte("abcde"),
|
||||||
}
|
}
|
||||||
expectedRes := tree.AddResult{
|
expectedRes := objecttree.AddResult{
|
||||||
Mode: tree.Append,
|
Mode: objecttree.Append,
|
||||||
Added: changes,
|
Added: changes,
|
||||||
}
|
}
|
||||||
objTreeMock.EXPECT().ID().Return("id").AnyTimes()
|
objTreeMock.EXPECT().ID().Return("id").AnyTimes()
|
|
@ -2,11 +2,11 @@ package synctree
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/objectsync/synchandler"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/spacesyncproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncservice/synchandler"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/util/slice"
|
||||||
"github.com/gogo/protobuf/proto"
|
"github.com/gogo/protobuf/proto"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
@ -14,7 +14,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type syncTreeHandler struct {
|
type syncTreeHandler struct {
|
||||||
objTree tree.ObjectTree
|
objTree objecttree.ObjectTree
|
||||||
syncClient SyncClient
|
syncClient SyncClient
|
||||||
syncStatus syncstatus.SyncStatusUpdater
|
syncStatus syncstatus.SyncStatusUpdater
|
||||||
handlerLock sync.Mutex
|
handlerLock sync.Mutex
|
||||||
|
@ -23,7 +23,7 @@ type syncTreeHandler struct {
|
||||||
|
|
||||||
const maxQueueSize = 5
|
const maxQueueSize = 5
|
||||||
|
|
||||||
func newSyncTreeHandler(objTree tree.ObjectTree, syncClient SyncClient, syncStatus syncstatus.SyncStatusUpdater) synchandler.SyncHandler {
|
func newSyncTreeHandler(objTree objecttree.ObjectTree, syncClient SyncClient, syncStatus syncstatus.SyncStatusUpdater) synchandler.SyncHandler {
|
||||||
return &syncTreeHandler{
|
return &syncTreeHandler{
|
||||||
objTree: objTree,
|
objTree: objTree,
|
||||||
syncClient: syncClient,
|
syncClient: syncClient,
|
||||||
|
@ -118,7 +118,7 @@ func (s *syncTreeHandler) handleHeadUpdate(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = objTree.AddRawChanges(ctx, tree.RawChangesPayload{
|
_, err = objTree.AddRawChanges(ctx, objecttree.RawChangesPayload{
|
||||||
NewHeads: update.Heads,
|
NewHeads: update.Heads,
|
||||||
RawChanges: update.Changes,
|
RawChanges: update.Changes,
|
||||||
})
|
})
|
||||||
|
@ -167,7 +167,7 @@ func (s *syncTreeHandler) handleFullSyncRequest(
|
||||||
}()
|
}()
|
||||||
|
|
||||||
if len(request.Changes) != 0 && !s.alreadyHasHeads(objTree, request.Heads) {
|
if len(request.Changes) != 0 && !s.alreadyHasHeads(objTree, request.Heads) {
|
||||||
_, err = objTree.AddRawChanges(ctx, tree.RawChangesPayload{
|
_, err = objTree.AddRawChanges(ctx, objecttree.RawChangesPayload{
|
||||||
NewHeads: request.Heads,
|
NewHeads: request.Heads,
|
||||||
RawChanges: request.Changes,
|
RawChanges: request.Changes,
|
||||||
})
|
})
|
||||||
|
@ -207,13 +207,13 @@ func (s *syncTreeHandler) handleFullSyncResponse(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = objTree.AddRawChanges(ctx, tree.RawChangesPayload{
|
_, err = objTree.AddRawChanges(ctx, objecttree.RawChangesPayload{
|
||||||
NewHeads: response.Heads,
|
NewHeads: response.Heads,
|
||||||
RawChanges: response.Changes,
|
RawChanges: response.Changes,
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *syncTreeHandler) alreadyHasHeads(t tree.ObjectTree, heads []string) bool {
|
func (s *syncTreeHandler) alreadyHasHeads(t objecttree.ObjectTree, heads []string) bool {
|
||||||
return slice.UnsortedEquals(t.Heads(), heads) || t.HasChanges(heads...)
|
return slice.UnsortedEquals(t.Heads(), heads) || t.HasChanges(heads...)
|
||||||
}
|
}
|
|
@ -3,11 +3,11 @@ package synctree
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree/mock_objecttree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/mock_synctree"
|
||||||
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/treechangeproto"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/syncstatus"
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/mock_synctree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree/mock_objecttree"
|
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto"
|
|
||||||
"github.com/golang/mock/gomock"
|
"github.com/golang/mock/gomock"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
@ -16,11 +16,11 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type testObjTreeMock struct {
|
type testObjTreeMock struct {
|
||||||
*mock_tree.MockObjectTree
|
*mock_objecttree.MockObjectTree
|
||||||
m sync.Mutex
|
m sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTestObjMock(mockTree *mock_tree.MockObjectTree) *testObjTreeMock {
|
func newTestObjMock(mockTree *mock_objecttree.MockObjectTree) *testObjTreeMock {
|
||||||
return &testObjTreeMock{
|
return &testObjTreeMock{
|
||||||
MockObjectTree: mockTree,
|
MockObjectTree: mockTree,
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ type syncHandlerFixture struct {
|
||||||
func newSyncHandlerFixture(t *testing.T) *syncHandlerFixture {
|
func newSyncHandlerFixture(t *testing.T) *syncHandlerFixture {
|
||||||
ctrl := gomock.NewController(t)
|
ctrl := gomock.NewController(t)
|
||||||
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
syncClientMock := mock_synctree.NewMockSyncClient(ctrl)
|
||||||
objectTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
|
objectTreeMock := newTestObjMock(mock_objecttree.NewMockObjectTree(ctrl))
|
||||||
receiveQueueMock := mock_synctree.NewMockReceiveQueue(ctrl)
|
receiveQueueMock := mock_synctree.NewMockReceiveQueue(ctrl)
|
||||||
|
|
||||||
syncHandler := &syncTreeHandler{
|
syncHandler := &syncTreeHandler{
|
||||||
|
@ -93,11 +93,11 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
|
||||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).Times(2)
|
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).Times(2)
|
||||||
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
||||||
fx.objectTreeMock.EXPECT().
|
fx.objectTreeMock.EXPECT().
|
||||||
AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
|
AddRawChanges(gomock.Any(), gomock.Eq(objecttree.RawChangesPayload{
|
||||||
NewHeads: []string{"h1"},
|
NewHeads: []string{"h1"},
|
||||||
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
||||||
})).
|
})).
|
||||||
Return(tree.AddResult{}, nil)
|
Return(objecttree.AddResult{}, nil)
|
||||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2", "h1"})
|
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2", "h1"})
|
||||||
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(true)
|
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(true)
|
||||||
|
|
||||||
|
@ -127,11 +127,11 @@ func TestSyncHandler_HandleHeadUpdate(t *testing.T) {
|
||||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
|
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
|
||||||
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
||||||
fx.objectTreeMock.EXPECT().
|
fx.objectTreeMock.EXPECT().
|
||||||
AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
|
AddRawChanges(gomock.Any(), gomock.Eq(objecttree.RawChangesPayload{
|
||||||
NewHeads: []string{"h1"},
|
NewHeads: []string{"h1"},
|
||||||
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
||||||
})).
|
})).
|
||||||
Return(tree.AddResult{}, nil)
|
Return(objecttree.AddResult{}, nil)
|
||||||
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
||||||
fx.syncClientMock.EXPECT().
|
fx.syncClientMock.EXPECT().
|
||||||
CreateFullSyncRequest(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
CreateFullSyncRequest(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||||
|
@ -247,11 +247,11 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
|
||||||
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
|
fx.objectTreeMock.EXPECT().Heads().Return([]string{"h2"}).AnyTimes()
|
||||||
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
fx.objectTreeMock.EXPECT().HasChanges(gomock.Eq([]string{"h1"})).Return(false)
|
||||||
fx.objectTreeMock.EXPECT().
|
fx.objectTreeMock.EXPECT().
|
||||||
AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
|
AddRawChanges(gomock.Any(), gomock.Eq(objecttree.RawChangesPayload{
|
||||||
NewHeads: []string{"h1"},
|
NewHeads: []string{"h1"},
|
||||||
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
||||||
})).
|
})).
|
||||||
Return(tree.AddResult{}, nil)
|
Return(objecttree.AddResult{}, nil)
|
||||||
fx.syncClientMock.EXPECT().
|
fx.syncClientMock.EXPECT().
|
||||||
CreateFullSyncResponse(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
CreateFullSyncResponse(gomock.Eq(fx.objectTreeMock), gomock.Eq([]string{"h1"}), gomock.Eq([]string{"h1"})).
|
||||||
Return(fullResponse, nil)
|
Return(fullResponse, nil)
|
||||||
|
@ -351,11 +351,11 @@ func TestSyncHandler_HandleFullSyncRequest(t *testing.T) {
|
||||||
HasChanges(gomock.Eq([]string{"h1"})).
|
HasChanges(gomock.Eq([]string{"h1"})).
|
||||||
Return(false)
|
Return(false)
|
||||||
fx.objectTreeMock.EXPECT().
|
fx.objectTreeMock.EXPECT().
|
||||||
AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
|
AddRawChanges(gomock.Any(), gomock.Eq(objecttree.RawChangesPayload{
|
||||||
NewHeads: []string{"h1"},
|
NewHeads: []string{"h1"},
|
||||||
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
||||||
})).
|
})).
|
||||||
Return(tree.AddResult{}, fmt.Errorf(""))
|
Return(objecttree.AddResult{}, fmt.Errorf(""))
|
||||||
fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Any(), gomock.Eq(""))
|
fx.syncClientMock.EXPECT().SendAsync(gomock.Eq(senderId), gomock.Any(), gomock.Eq(""))
|
||||||
|
|
||||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||||
|
@ -393,11 +393,11 @@ func TestSyncHandler_HandleFullSyncResponse(t *testing.T) {
|
||||||
HasChanges(gomock.Eq([]string{"h1"})).
|
HasChanges(gomock.Eq([]string{"h1"})).
|
||||||
Return(false)
|
Return(false)
|
||||||
fx.objectTreeMock.EXPECT().
|
fx.objectTreeMock.EXPECT().
|
||||||
AddRawChanges(gomock.Any(), gomock.Eq(tree.RawChangesPayload{
|
AddRawChanges(gomock.Any(), gomock.Eq(objecttree.RawChangesPayload{
|
||||||
NewHeads: []string{"h1"},
|
NewHeads: []string{"h1"},
|
||||||
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
RawChanges: []*treechangeproto.RawTreeChangeWithId{chWithId},
|
||||||
})).
|
})).
|
||||||
Return(tree.AddResult{}, nil)
|
Return(objecttree.AddResult{}, nil)
|
||||||
|
|
||||||
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
fx.receiveQueueMock.EXPECT().ClearQueue(senderId)
|
||||||
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
err := fx.syncHandler.HandleMessage(ctx, senderId, objectMsg)
|
|
@ -1,5 +1,5 @@
|
||||||
// Code generated by MockGen. DO NOT EDIT.
|
// Code generated by MockGen. DO NOT EDIT.
|
||||||
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener (interfaces: UpdateListener)
|
// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener (interfaces: UpdateListener)
|
||||||
|
|
||||||
// Package mock_updatelistener is a generated GoMock package.
|
// Package mock_updatelistener is a generated GoMock package.
|
||||||
package mock_updatelistener
|
package mock_updatelistener
|
||||||
|
@ -7,7 +7,7 @@ package mock_updatelistener
|
||||||
import (
|
import (
|
||||||
reflect "reflect"
|
reflect "reflect"
|
||||||
|
|
||||||
tree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
objecttree "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
gomock "github.com/golang/mock/gomock"
|
gomock "github.com/golang/mock/gomock"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ func (m *MockUpdateListener) EXPECT() *MockUpdateListenerMockRecorder {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rebuild mocks base method.
|
// Rebuild mocks base method.
|
||||||
func (m *MockUpdateListener) Rebuild(arg0 tree.ObjectTree) {
|
func (m *MockUpdateListener) Rebuild(arg0 objecttree.ObjectTree) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
m.ctrl.Call(m, "Rebuild", arg0)
|
m.ctrl.Call(m, "Rebuild", arg0)
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ func (mr *MockUpdateListenerMockRecorder) Rebuild(arg0 interface{}) *gomock.Call
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update mocks base method.
|
// Update mocks base method.
|
||||||
func (m *MockUpdateListener) Update(arg0 tree.ObjectTree) {
|
func (m *MockUpdateListener) Update(arg0 objecttree.ObjectTree) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
m.ctrl.Call(m, "Update", arg0)
|
m.ctrl.Call(m, "Update", arg0)
|
||||||
}
|
}
|
|
@ -1,11 +1,11 @@
|
||||||
//go:generate mockgen -destination mock_updatelistener/mock_updatelistener.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree/updatelistener UpdateListener
|
//go:generate mockgen -destination mock_updatelistener/mock_updatelistener.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/synctree/updatelistener UpdateListener
|
||||||
package updatelistener
|
package updatelistener
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/tree"
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/object/tree/objecttree"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UpdateListener interface {
|
type UpdateListener interface {
|
||||||
Update(tree tree.ObjectTree)
|
Update(tree objecttree.ObjectTree)
|
||||||
Rebuild(tree tree.ObjectTree)
|
Rebuild(tree objecttree.ObjectTree)
|
||||||
}
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package storage
|
package treestorage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue