diff --git a/client/clientspace/rpchandler.go b/client/clientspace/rpchandler.go index 8f6a7989..bef22138 100644 --- a/client/clientspace/rpchandler.go +++ b/client/clientspace/rpchandler.go @@ -19,20 +19,31 @@ func (r *rpcHandler) PullSpace(ctx context.Context, request *spacesyncproto.Pull return } - description := sp.Description() + spaceDesc, err := sp.Description() + if err != nil { + err = spacesyncproto.ErrUnexpected + return + } + resp = &spacesyncproto.PullSpaceResponse{ - SpaceHeader: description.SpaceHeader, - AclPayload: description.AclPayload, - AclPayloadId: description.AclId, + Payload: &spacesyncproto.SpacePayload{ + SpaceHeader: spaceDesc.SpaceHeader, + AclPayloadId: spaceDesc.AclId, + AclPayload: spaceDesc.AclPayload, + SpaceSettingsPayload: spaceDesc.SpaceSettingsPayload, + SpaceSettingsPayloadId: spaceDesc.SpaceSettingsId, + }, } return } func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { description := commonspace.SpaceDescription{ - SpaceHeader: req.SpaceHeader, - AclId: req.AclPayloadId, - AclPayload: req.AclPayload, + SpaceHeader: req.Payload.SpaceHeader, + AclId: req.Payload.AclPayloadId, + AclPayload: req.Payload.AclPayload, + SpaceSettingsPayload: req.Payload.SpaceSettingsPayload, + SpaceSettingsId: req.Payload.SpaceSettingsPayloadId, } err = r.s.AddSpace(ctx, description) if err != nil { diff --git a/common/commonspace/diffservice/diffsyncer.go b/common/commonspace/diffservice/diffsyncer.go index f9ca9f26..9610a787 100644 --- a/common/commonspace/diffservice/diffsyncer.go +++ b/common/commonspace/diffservice/diffsyncer.go @@ -108,10 +108,24 @@ func (d *diffSyncer) sendPushSpaceRequest(ctx context.Context, cl spacesyncproto return } + spaceSettingsTreeStorage, err := d.storage.TreeStorage(d.storage.SpaceSettingsId()) + if err != nil { + return + } + spaceSettingsRoot, err := spaceSettingsTreeStorage.Root() + if err != nil { + return + } + + spacePayload := &spacesyncproto.SpacePayload{ + SpaceHeader: header, + AclPayload: root.Payload, + AclPayloadId: root.Id, + SpaceSettingsPayload: spaceSettingsRoot.RawChange, + SpaceSettingsPayloadId: spaceSettingsRoot.Id, + } _, err = cl.PushSpace(ctx, &spacesyncproto.PushSpaceRequest{ - SpaceHeader: header, - AclPayload: root.Payload, - AclPayloadId: root.Id, + Payload: spacePayload, }) return } diff --git a/common/commonspace/service.go b/common/commonspace/service.go index 6947fa83..dc4d4b83 100644 --- a/common/commonspace/service.go +++ b/common/commonspace/service.go @@ -15,6 +15,7 @@ import ( "github.com/anytypeio/go-anytype-infrastructure-experiments/common/net/pool" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/nodeconf" "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/aclrecordproto" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/pkg/acl/treechangeproto" ) const CName = "common.commonspace" @@ -161,12 +162,17 @@ func (s *service) getSpaceStorageFromRemote(ctx context.Context, id string) (st if err != nil { return } + st, err = s.storageProvider.CreateSpaceStorage(storage.SpaceStorageCreatePayload{ AclWithId: &aclrecordproto.RawACLRecordWithId{ - Payload: res.AclPayload, - Id: res.AclPayloadId, + Payload: res.Payload.AclPayload, + Id: res.Payload.AclPayloadId, }, - SpaceHeaderWithId: res.SpaceHeader, + SpaceSettingsWithId: &treechangeproto.RawTreeChangeWithId{ + RawChange: res.Payload.SpaceSettingsPayload, + Id: res.Payload.SpaceSettingsPayloadId, + }, + SpaceHeaderWithId: res.Payload.SpaceHeader, }) return } diff --git a/common/commonspace/space.go b/common/commonspace/space.go index 8b72008d..c63f854c 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -48,9 +48,11 @@ type SpaceDerivePayload struct { } type SpaceDescription struct { - SpaceHeader *spacesyncproto.RawSpaceHeaderWithId - AclId string - AclPayload []byte + SpaceHeader *spacesyncproto.RawSpaceHeaderWithId + AclId string + AclPayload []byte + SpaceSettingsId string + SpaceSettingsPayload []byte } func NewSpaceId(id string, repKey uint64) string { @@ -62,7 +64,7 @@ type Space interface { Init(ctx context.Context) error StoredIds() []string - Description() SpaceDescription + Description() (SpaceDescription, error) SpaceSyncRpc() RpcHandler @@ -99,13 +101,25 @@ func (s *space) Id() string { return s.id } -func (s *space) Description() SpaceDescription { +func (s *space) Description() (desc SpaceDescription, err error) { root := s.aclList.Root() - return SpaceDescription{ - SpaceHeader: s.header, - AclId: root.Id, - AclPayload: root.Payload, + settingsStorage, err := s.storage.TreeStorage(s.storage.SpaceSettingsId()) + if err != nil { + return } + settingsRoot, err := settingsStorage.Root() + if err != nil { + return + } + + desc = SpaceDescription{ + SpaceHeader: s.header, + AclId: root.Id, + AclPayload: root.Payload, + SpaceSettingsId: settingsRoot.Id, + SpaceSettingsPayload: settingsRoot.RawChange, + } + return } func (s *space) Init(ctx context.Context) (err error) { diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 21a017b8..4121b3ae 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -164,7 +164,6 @@ func BuildSyncTreeOrGetRemote(ctx context.Context, id string, deps BuildDeps) (t } func buildSyncTree(ctx context.Context, isFirstBuild bool, deps BuildDeps) (t tree.ObjectTree, err error) { - t, err = buildObjectTree(deps.TreeStorage, deps.AclList) if err != nil { return @@ -197,7 +196,7 @@ func buildSyncTree(ctx context.Context, isFirstBuild bool, deps BuildDeps) (t tr } func (s *SyncTree) AddContent(ctx context.Context, content tree.SignableChangeContent) (res tree.AddResult, err error) { - if s.isClosed { + if s.isClosed { // checkAlive err err = ErrSyncTreeClosed return } diff --git a/node/nodespace/rpchandler.go b/node/nodespace/rpchandler.go index a05b5efc..901f0a3e 100644 --- a/node/nodespace/rpchandler.go +++ b/node/nodespace/rpchandler.go @@ -2,42 +2,54 @@ package nodespace import ( "context" + "github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace" "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/pkg/acl/aclrecordproto" ) type rpcHandler struct { s *service } -func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { - _, err = r.s.GetSpace(ctx, req.SpaceHeader.Id) - if err == nil { - err = spacesyncproto.ErrSpaceExists +func (r *rpcHandler) PullSpace(ctx context.Context, request *spacesyncproto.PullSpaceRequest) (resp *spacesyncproto.PullSpaceResponse, err error) { + sp, err := r.s.GetSpace(ctx, request.Id) + if err != nil { + if err != spacesyncproto.ErrSpaceMissing { + err = spacesyncproto.ErrUnexpected + } return } - if err != storage.ErrSpaceStorageMissing { + + spaceDesc, err := sp.Description() + if err != nil { err = spacesyncproto.ErrUnexpected return } - payload := storage.SpaceStorageCreatePayload{ - RecWithId: &aclrecordproto.RawACLRecordWithId{ - Payload: req.AclPayload, - Id: req.AclPayloadId, + resp = &spacesyncproto.PullSpaceResponse{ + Payload: &spacesyncproto.SpacePayload{ + SpaceHeader: spaceDesc.SpaceHeader, + AclPayloadId: spaceDesc.AclId, + AclPayload: spaceDesc.AclPayload, + SpaceSettingsPayload: spaceDesc.SpaceSettingsPayload, + SpaceSettingsPayloadId: spaceDesc.SpaceSettingsId, }, - SpaceHeaderWithId: req.SpaceHeader, } - st, err := r.s.spaceStorageProvider.CreateSpaceStorage(payload) + return +} + +func (r *rpcHandler) PushSpace(ctx context.Context, req *spacesyncproto.PushSpaceRequest) (resp *spacesyncproto.PushSpaceResponse, err error) { + description := commonspace.SpaceDescription{ + SpaceHeader: req.Payload.SpaceHeader, + AclId: req.Payload.AclPayloadId, + AclPayload: req.Payload.AclPayload, + SpaceSettingsPayload: req.Payload.SpaceSettingsPayload, + SpaceSettingsId: req.Payload.SpaceSettingsPayloadId, + } + err = r.s.AddSpace(ctx, description) if err != nil { - err = spacesyncproto.ErrUnexpected - if err == storage.ErrSpaceStorageExists { - err = spacesyncproto.ErrSpaceExists - } return } - err = st.Close() + resp = &spacesyncproto.PushSpaceResponse{} return }