Create methods for deleting space

This commit is contained in:
mcrakhman 2023-02-20 23:47:32 +01:00
parent 75d503b94c
commit 1565f7e509
No known key found for this signature in database
GPG Key ID: DED12CFEF5B8396B
17 changed files with 193 additions and 98 deletions

View File

@ -8,7 +8,7 @@ import (
"github.com/anytypeio/any-sync/commonspace/object/tree/synctree" "github.com/anytypeio/any-sync/commonspace/object/tree/synctree"
"github.com/anytypeio/any-sync/commonspace/object/treegetter" "github.com/anytypeio/any-sync/commonspace/object/treegetter"
"github.com/anytypeio/any-sync/commonspace/peermanager" "github.com/anytypeio/any-sync/commonspace/peermanager"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate"
"github.com/anytypeio/any-sync/commonspace/spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage"
"github.com/anytypeio/any-sync/commonspace/spacesyncproto" "github.com/anytypeio/any-sync/commonspace/spacesyncproto"
"github.com/anytypeio/any-sync/commonspace/syncstatus" "github.com/anytypeio/any-sync/commonspace/syncstatus"
@ -22,7 +22,7 @@ type DiffSyncer interface {
Sync(ctx context.Context) error Sync(ctx context.Context) error
RemoveObjects(ids []string) RemoveObjects(ids []string)
UpdateHeads(id string, heads []string) UpdateHeads(id string, heads []string)
Init(deletionState deletionstate.DeletionState) Init(deletionState settingsstate.ObjectDeletionState)
} }
func newDiffSyncer( func newDiffSyncer(
@ -54,11 +54,11 @@ type diffSyncer struct {
storage spacestorage.SpaceStorage storage spacestorage.SpaceStorage
clientFactory spacesyncproto.ClientFactory clientFactory spacesyncproto.ClientFactory
log logger.CtxLogger log logger.CtxLogger
deletionState deletionstate.DeletionState deletionState settingsstate.ObjectDeletionState
syncStatus syncstatus.StatusUpdater syncStatus syncstatus.StatusUpdater
} }
func (d *diffSyncer) Init(deletionState deletionstate.DeletionState) { func (d *diffSyncer) Init(deletionState settingsstate.ObjectDeletionState) {
d.deletionState = deletionState d.deletionState = deletionState
d.deletionState.AddObserver(d.RemoveObjects) d.deletionState.AddObserver(d.RemoveObjects)
} }

View File

@ -12,7 +12,7 @@ import (
mock_treestorage "github.com/anytypeio/any-sync/commonspace/object/tree/treestorage/mock_treestorage" mock_treestorage "github.com/anytypeio/any-sync/commonspace/object/tree/treestorage/mock_treestorage"
"github.com/anytypeio/any-sync/commonspace/object/treegetter/mock_treegetter" "github.com/anytypeio/any-sync/commonspace/object/treegetter/mock_treegetter"
"github.com/anytypeio/any-sync/commonspace/peermanager/mock_peermanager" "github.com/anytypeio/any-sync/commonspace/peermanager/mock_peermanager"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate/mock_deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate/mock_settingsstate"
"github.com/anytypeio/any-sync/commonspace/spacestorage/mock_spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage/mock_spacestorage"
"github.com/anytypeio/any-sync/commonspace/spacesyncproto" "github.com/anytypeio/any-sync/commonspace/spacesyncproto"
"github.com/anytypeio/any-sync/commonspace/spacesyncproto/mock_spacesyncproto" "github.com/anytypeio/any-sync/commonspace/spacesyncproto/mock_spacesyncproto"
@ -106,7 +106,7 @@ func TestDiffSyncer_Sync(t *testing.T) {
factory := spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceSyncClient { factory := spacesyncproto.ClientFactoryFunc(func(cc drpc.Conn) spacesyncproto.DRPCSpaceSyncClient {
return clientMock return clientMock
}) })
delState := mock_deletionstate.NewMockDeletionState(ctrl) delState := mock_settingsstate.NewMockDeletionState(ctrl)
spaceId := "spaceId" spaceId := "spaceId"
aclRootId := "aclRootId" aclRootId := "aclRootId"
l := logger.NewNamed(spaceId) l := logger.NewNamed(spaceId)

View File

@ -7,7 +7,7 @@ import (
"github.com/anytypeio/any-sync/app/logger" "github.com/anytypeio/any-sync/app/logger"
"github.com/anytypeio/any-sync/commonspace/object/treegetter" "github.com/anytypeio/any-sync/commonspace/object/treegetter"
"github.com/anytypeio/any-sync/commonspace/peermanager" "github.com/anytypeio/any-sync/commonspace/peermanager"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate"
"github.com/anytypeio/any-sync/commonspace/spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage"
"github.com/anytypeio/any-sync/commonspace/spacesyncproto" "github.com/anytypeio/any-sync/commonspace/spacesyncproto"
"github.com/anytypeio/any-sync/commonspace/syncstatus" "github.com/anytypeio/any-sync/commonspace/syncstatus"
@ -24,7 +24,7 @@ type TreeHeads struct {
} }
type HeadSync interface { type HeadSync interface {
Init(objectIds []string, deletionState deletionstate.DeletionState) Init(objectIds []string, deletionState settingsstate.ObjectDeletionState)
UpdateHeads(id string, heads []string) UpdateHeads(id string, heads []string)
HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error) HandleRangeRequest(ctx context.Context, req *spacesyncproto.HeadSyncRequest) (resp *spacesyncproto.HeadSyncResponse, err error)
@ -81,7 +81,7 @@ func NewHeadSync(
} }
} }
func (d *headSync) Init(objectIds []string, deletionState deletionstate.DeletionState) { func (d *headSync) Init(objectIds []string, deletionState settingsstate.ObjectDeletionState) {
d.fillDiff(objectIds) d.fillDiff(objectIds)
d.syncer.Init(deletionState) d.syncer.Init(deletionState)
d.periodicSync.Run() d.periodicSync.Run()

View File

@ -6,7 +6,7 @@ import (
"github.com/anytypeio/any-sync/app/logger" "github.com/anytypeio/any-sync/app/logger"
"github.com/anytypeio/any-sync/commonspace/headsync/mock_headsync" "github.com/anytypeio/any-sync/commonspace/headsync/mock_headsync"
"github.com/anytypeio/any-sync/commonspace/object/tree/treestorage/mock_treestorage" "github.com/anytypeio/any-sync/commonspace/object/tree/treestorage/mock_treestorage"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate/mock_deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate/mock_settingsstate"
"github.com/anytypeio/any-sync/commonspace/spacestorage/mock_spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage/mock_spacestorage"
"github.com/anytypeio/any-sync/util/periodicsync/mock_periodicsync" "github.com/anytypeio/any-sync/util/periodicsync/mock_periodicsync"
"github.com/golang/mock/gomock" "github.com/golang/mock/gomock"
@ -24,7 +24,7 @@ func TestDiffService(t *testing.T) {
treeStorageMock := mock_treestorage.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_settingsstate.NewMockDeletionState(ctrl)
syncPeriod := 1 syncPeriod := 1
initId := "initId" initId := "initId"

View File

@ -8,7 +8,7 @@ import (
context "context" context "context"
reflect "reflect" reflect "reflect"
deletionstate "github.com/anytypeio/any-sync/commonspace/settings/deletionstate" deletionstate "github.com/anytypeio/any-sync/commonspace/settings/settingsstate"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
) )
@ -36,7 +36,7 @@ func (m *MockDiffSyncer) EXPECT() *MockDiffSyncerMockRecorder {
} }
// Init mocks base method. // Init mocks base method.
func (m *MockDiffSyncer) Init(arg0 deletionstate.DeletionState) { func (m *MockDiffSyncer) Init(arg0 deletionstate.ObjectDeletionState) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
m.ctrl.Call(m, "Init", arg0) m.ctrl.Call(m, "Init", arg0)
} }

View File

@ -3,7 +3,7 @@ package settings
import ( import (
"context" "context"
"github.com/anytypeio/any-sync/commonspace/object/treegetter" "github.com/anytypeio/any-sync/commonspace/object/treegetter"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate"
"github.com/anytypeio/any-sync/commonspace/spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage"
"go.uber.org/zap" "go.uber.org/zap"
) )
@ -14,11 +14,11 @@ type Deleter interface {
type deleter struct { type deleter struct {
st spacestorage.SpaceStorage st spacestorage.SpaceStorage
state deletionstate.DeletionState state settingsstate.ObjectDeletionState
getter treegetter.TreeGetter getter treegetter.TreeGetter
} }
func newDeleter(st spacestorage.SpaceStorage, state deletionstate.DeletionState, getter treegetter.TreeGetter) Deleter { func newDeleter(st spacestorage.SpaceStorage, state settingsstate.ObjectDeletionState, getter treegetter.TreeGetter) Deleter {
return &deleter{st, state, getter} return &deleter{st, state, getter}
} }

View File

@ -3,7 +3,7 @@ package settings
import ( import (
"fmt" "fmt"
"github.com/anytypeio/any-sync/commonspace/object/treegetter/mock_treegetter" "github.com/anytypeio/any-sync/commonspace/object/treegetter/mock_treegetter"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate/mock_deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate/mock_settingsstate"
"github.com/anytypeio/any-sync/commonspace/spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage"
"github.com/anytypeio/any-sync/commonspace/spacestorage/mock_spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage/mock_spacestorage"
"github.com/golang/mock/gomock" "github.com/golang/mock/gomock"
@ -14,7 +14,7 @@ func TestDeleter_Delete(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
treeGetter := mock_treegetter.NewMockTreeGetter(ctrl) treeGetter := mock_treegetter.NewMockTreeGetter(ctrl)
st := mock_spacestorage.NewMockSpaceStorage(ctrl) st := mock_spacestorage.NewMockSpaceStorage(ctrl)
delState := mock_deletionstate.NewMockDeletionState(ctrl) delState := mock_settingsstate.NewMockDeletionState(ctrl)
deleter := newDeleter(st, delState, treeGetter) deleter := newDeleter(st, delState, treeGetter)

View File

@ -2,7 +2,7 @@ package settings
import ( import (
"github.com/anytypeio/any-sync/commonspace/object/treegetter" "github.com/anytypeio/any-sync/commonspace/object/treegetter"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate"
"time" "time"
) )
@ -15,13 +15,13 @@ type SpaceDeleter interface {
} }
type DeletionManager interface { type DeletionManager interface {
UpdateState(state *State) (err error) UpdateState(state *settingsstate.State) (err error)
} }
func newDeletionManager( func newDeletionManager(
spaceId string, spaceId string,
deletionInterval time.Duration, deletionInterval time.Duration,
deletionState deletionstate.DeletionState, deletionState settingsstate.ObjectDeletionState,
provider SpaceIdsProvider, provider SpaceIdsProvider,
onSpaceDelete func()) DeletionManager { onSpaceDelete func()) DeletionManager {
return &deletionManager{ return &deletionManager{
@ -34,7 +34,7 @@ func newDeletionManager(
} }
type deletionManager struct { type deletionManager struct {
deletionState deletionstate.DeletionState deletionState settingsstate.ObjectDeletionState
provider SpaceIdsProvider provider SpaceIdsProvider
treeGetter treegetter.TreeGetter treeGetter treegetter.TreeGetter
deletionInterval time.Duration deletionInterval time.Duration
@ -42,7 +42,7 @@ type deletionManager struct {
onSpaceDelete func() onSpaceDelete func()
} }
func (d *deletionManager) UpdateState(state *State) (err error) { func (d *deletionManager) UpdateState(state *settingsstate.State) (err error) {
err = d.deletionState.Add(state.DeletedIds) err = d.deletionState.Add(state.DeletedIds)
if err != nil { if err != nil {
log.Warn("failed to add deleted ids to deletion state") log.Warn("failed to add deleted ids to deletion state")

View File

@ -10,7 +10,7 @@ import (
"github.com/anytypeio/any-sync/commonspace/object/tree/synctree" "github.com/anytypeio/any-sync/commonspace/object/tree/synctree"
"github.com/anytypeio/any-sync/commonspace/object/tree/synctree/updatelistener" "github.com/anytypeio/any-sync/commonspace/object/tree/synctree/updatelistener"
"github.com/anytypeio/any-sync/commonspace/object/treegetter" "github.com/anytypeio/any-sync/commonspace/object/treegetter"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate"
spacestorage "github.com/anytypeio/any-sync/commonspace/spacestorage" spacestorage "github.com/anytypeio/any-sync/commonspace/spacestorage"
"go.uber.org/zap" "go.uber.org/zap"
"time" "time"
@ -24,12 +24,16 @@ type SettingsObject interface {
synctree.SyncTree synctree.SyncTree
Init(ctx context.Context) (err error) Init(ctx context.Context) (err error)
DeleteObject(id string) (err error) DeleteObject(id string) (err error)
DeleteSpace(t time.Time) (err error)
RestoreSpace() (err error)
} }
var ( var (
ErrDeleteSelf = errors.New("cannot delete self") ErrDeleteSelf = errors.New("cannot delete self")
ErrAlreadyDeleted = errors.New("the object is already deleted") ErrAlreadyDeleted = errors.New("the object is already deleted")
ErrObjDoesNotExist = errors.New("the object does not exist") ErrObjDoesNotExist = errors.New("the object does not exist")
ErrMarkedDeleted = errors.New("this space is already marked deleted")
ErrMarkedNotDeleted = errors.New("this space is not marked not deleted")
) )
type BuildTreeFunc func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) type BuildTreeFunc func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error)
@ -39,13 +43,14 @@ type Deps struct {
Account accountservice.Service Account accountservice.Service
TreeGetter treegetter.TreeGetter TreeGetter treegetter.TreeGetter
Store spacestorage.SpaceStorage Store spacestorage.SpaceStorage
DeletionState deletionstate.DeletionState DeletionState settingsstate.ObjectDeletionState
Provider SpaceIdsProvider Provider SpaceIdsProvider
OnSpaceDelete func() OnSpaceDelete func()
// testing dependencies // testing dependencies
builder StateBuilder builder settingsstate.StateBuilder
del Deleter del Deleter
delManager DeletionManager delManager DeletionManager
changeFactory settingsstate.ChangeFactory
} }
type settingsObject struct { type settingsObject struct {
@ -54,19 +59,22 @@ type settingsObject struct {
spaceId string spaceId string
treeGetter treegetter.TreeGetter treeGetter treegetter.TreeGetter
store spacestorage.SpaceStorage store spacestorage.SpaceStorage
builder StateBuilder builder settingsstate.StateBuilder
buildFunc BuildTreeFunc buildFunc BuildTreeFunc
loop *deleteLoop loop *deleteLoop
deletionState deletionstate.DeletionState state *settingsstate.State
deletionState settingsstate.ObjectDeletionState
deletionManager DeletionManager deletionManager DeletionManager
changeFactory settingsstate.ChangeFactory
} }
func NewSettingsObject(deps Deps, spaceId string) (obj SettingsObject) { func NewSettingsObject(deps Deps, spaceId string) (obj SettingsObject) {
var ( var (
deleter Deleter deleter Deleter
deletionManager DeletionManager deletionManager DeletionManager
builder StateBuilder builder settingsstate.StateBuilder
changeFactory settingsstate.ChangeFactory
) )
if deps.del == nil { if deps.del == nil {
deleter = newDeleter(deps.Store, deps.DeletionState, deps.TreeGetter) deleter = newDeleter(deps.Store, deps.DeletionState, deps.TreeGetter)
@ -79,10 +87,15 @@ func NewSettingsObject(deps Deps, spaceId string) (obj SettingsObject) {
deletionManager = deps.delManager deletionManager = deps.delManager
} }
if deps.builder == nil { if deps.builder == nil {
builder = newStateBuilder() builder = settingsstate.NewStateBuilder()
} else { } else {
builder = deps.builder builder = deps.builder
} }
if deps.changeFactory == nil {
changeFactory = settingsstate.NewChangeFactory()
} else {
changeFactory = deps.changeFactory
}
loop := newDeleteLoop(func() { loop := newDeleteLoop(func() {
deleter.Delete() deleter.Delete()
@ -101,18 +114,20 @@ func NewSettingsObject(deps Deps, spaceId string) (obj SettingsObject) {
buildFunc: deps.BuildFunc, buildFunc: deps.BuildFunc,
builder: builder, builder: builder,
deletionManager: deletionManager, deletionManager: deletionManager,
changeFactory: changeFactory,
} }
obj = s obj = s
return return
} }
func (s *settingsObject) updateIds(tr objecttree.ObjectTree, isUpdate bool) { func (s *settingsObject) updateIds(tr objecttree.ObjectTree, isUpdate bool) {
state, err := s.builder.Build(tr, isUpdate) var err error
s.state, err = s.builder.Build(tr, s.state, isUpdate)
if err != nil { if err != nil {
log.Error("failed to build state", zap.Error(err)) log.Error("failed to build state", zap.Error(err))
return return
} }
if err = s.deletionManager.UpdateState(state); err != nil { if err = s.deletionManager.UpdateState(s.state); err != nil {
log.Error("failed to update state", zap.Error(err)) log.Error("failed to update state", zap.Error(err))
} }
} }
@ -145,12 +160,36 @@ func (s *settingsObject) Close() error {
return s.SyncTree.Close() return s.SyncTree.Close()
} }
func (s *settingsObject) DeleteAccount() (err error) { func (s *settingsObject) DeleteSpace(t time.Time) (err error) {
return nil s.Lock()
defer s.Unlock()
if !s.state.SpaceDeletionDate.IsZero() {
return ErrMarkedDeleted
}
// TODO: add snapshot logic
res, err := s.changeFactory.CreateSpaceDeleteChange(t, s.state, false)
if err != nil {
return
}
return s.addContent(res)
} }
func (s *settingsObject) RestoreAccount() (err error) { func (s *settingsObject) RestoreSpace() (err error) {
return nil s.Lock()
defer s.Unlock()
if s.state.SpaceDeletionDate.IsZero() {
return ErrMarkedNotDeleted
}
// TODO: add snapshot logic
res, err := s.changeFactory.CreateSpaceRestoreChange(s.state, false)
if err != nil {
return
}
return s.addContent(res)
} }
func (s *settingsObject) DeleteObject(id string) (err error) { func (s *settingsObject) DeleteObject(id string) (err error) {
@ -171,14 +210,18 @@ func (s *settingsObject) DeleteObject(id string) (err error) {
} }
// TODO: add snapshot logic // TODO: add snapshot logic
res, err := s.deletionState.CreateDeleteChange(id, false) res, err := s.changeFactory.CreateObjectDeleteChange(id, s.state, false)
if err != nil { if err != nil {
return return
} }
return s.addContent(res)
}
func (s *settingsObject) addContent(data []byte) (err error) {
accountData := s.account.Account() accountData := s.account.Account()
_, err = s.AddContent(context.Background(), objecttree.SignableChangeContent{ _, err = s.AddContent(context.Background(), objecttree.SignableChangeContent{
Data: res, Data: data,
Key: accountData.SignKey, Key: accountData.SignKey,
Identity: accountData.Identity, Identity: accountData.Identity,
IsSnapshot: false, IsSnapshot: false,

View File

@ -9,7 +9,7 @@ import (
"github.com/anytypeio/any-sync/commonspace/object/tree/synctree/mock_synctree" "github.com/anytypeio/any-sync/commonspace/object/tree/synctree/mock_synctree"
"github.com/anytypeio/any-sync/commonspace/object/tree/synctree/updatelistener" "github.com/anytypeio/any-sync/commonspace/object/tree/synctree/updatelistener"
"github.com/anytypeio/any-sync/commonspace/object/treegetter/mock_treegetter" "github.com/anytypeio/any-sync/commonspace/object/treegetter/mock_treegetter"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate/mock_deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate/mock_settingsstate"
"github.com/anytypeio/any-sync/commonspace/settings/mock_settings" "github.com/anytypeio/any-sync/commonspace/settings/mock_settings"
"github.com/anytypeio/any-sync/commonspace/spacestorage/mock_spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage/mock_spacestorage"
"github.com/anytypeio/any-sync/util/keys/asymmetric/signingkey" "github.com/anytypeio/any-sync/util/keys/asymmetric/signingkey"
@ -49,7 +49,7 @@ type settingsFixture struct {
provider *mock_settings.MockDeletedIdsProvider provider *mock_settings.MockDeletedIdsProvider
deleter *mock_settings.MockDeleter deleter *mock_settings.MockDeleter
syncTree *mock_synctree.MockSyncTree syncTree *mock_synctree.MockSyncTree
delState *mock_deletionstate.MockDeletionState delState *mock_settingsstate.MockDeletionState
account *mock_accountservice.MockService account *mock_accountservice.MockService
} }
@ -61,7 +61,7 @@ func newSettingsFixture(t *testing.T) *settingsFixture {
acc := mock_accountservice.NewMockService(ctrl) acc := mock_accountservice.NewMockService(ctrl)
treeGetter := mock_treegetter.NewMockTreeGetter(ctrl) treeGetter := mock_treegetter.NewMockTreeGetter(ctrl)
st := mock_spacestorage.NewMockSpaceStorage(ctrl) st := mock_spacestorage.NewMockSpaceStorage(ctrl)
delState := mock_deletionstate.NewMockDeletionState(ctrl) delState := mock_settingsstate.NewMockDeletionState(ctrl)
prov := mock_settings.NewMockDeletedIdsProvider(ctrl) prov := mock_settings.NewMockDeletedIdsProvider(ctrl)
syncTree := mock_synctree.NewMockSyncTree(ctrl) syncTree := mock_synctree.NewMockSyncTree(ctrl)
del := mock_settings.NewMockDeleter(ctrl) del := mock_settings.NewMockDeleter(ctrl)

View File

@ -0,0 +1,64 @@
package settingsstate
import (
"github.com/anytypeio/any-sync/commonspace/spacesyncproto"
"time"
)
type ChangeFactory interface {
CreateObjectDeleteChange(id string, state *State, isSnapshot bool) (res []byte, err error)
CreateSpaceDeleteChange(t time.Time, state *State, isSnapshot bool) (res []byte, err error)
CreateSpaceRestoreChange(state *State, isSnapshot bool) (res []byte, err error)
}
func NewChangeFactory() ChangeFactory {
return &changeFactory{}
}
type changeFactory struct {
}
func (c *changeFactory) CreateObjectDeleteChange(id string, state *State, isSnapshot bool) (res []byte, err error) {
content := &spacesyncproto.SpaceSettingsContent_ObjectDelete{
ObjectDelete: &spacesyncproto.ObjectDelete{Id: id},
}
change := &spacesyncproto.SettingsData{
Content: []*spacesyncproto.SpaceSettingsContent{
{Value: content},
},
Snapshot: nil,
}
// TODO: add snapshot logic
res, err = change.Marshal()
return
}
func (c *changeFactory) CreateSpaceDeleteChange(t time.Time, state *State, isSnapshot bool) (res []byte, err error) {
content := &spacesyncproto.SpaceSettingsContent_SpaceDelete{
SpaceDelete: &spacesyncproto.SpaceDelete{Timestamp: t.UnixNano()},
}
change := &spacesyncproto.SettingsData{
Content: []*spacesyncproto.SpaceSettingsContent{
{Value: content},
},
Snapshot: nil,
}
// TODO: add snapshot logic
res, err = change.Marshal()
return
}
func (c *changeFactory) CreateSpaceRestoreChange(state *State, isSnapshot bool) (res []byte, err error) {
content := &spacesyncproto.SpaceSettingsContent_SpaceDelete{
SpaceDelete: &spacesyncproto.SpaceDelete{},
}
change := &spacesyncproto.SettingsData{
Content: []*spacesyncproto.SpaceSettingsContent{
{Value: content},
},
Snapshot: nil,
}
// TODO: add snapshot logic
res, err = change.Marshal()
return
}

View File

@ -1,25 +1,23 @@
//go:generate mockgen -destination mock_deletionstate/mock_deletionstate.go github.com/anytypeio/any-sync/commonspace/settings/deletionstate DeletionState //go:generate mockgen -destination mock_deletionstate/mock_deletionstate.go github.com/anytypeio/any-sync/commonspace/settings/deletionstate DeletionState
package deletionstate package settingsstate
import ( import (
"github.com/anytypeio/any-sync/commonspace/spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage"
"github.com/anytypeio/any-sync/commonspace/spacesyncproto"
"sync" "sync"
) )
type StateUpdateObserver func(ids []string) type StateUpdateObserver func(ids []string)
type DeletionState interface { type ObjectDeletionState interface {
AddObserver(observer StateUpdateObserver) AddObserver(observer StateUpdateObserver)
Add(ids []string) (err error) Add(ids []string) (err error)
GetQueued() (ids []string) GetQueued() (ids []string)
Delete(id string) (err error) Delete(id string) (err error)
Exists(id string) bool Exists(id string) bool
FilterJoin(ids ...[]string) (filtered []string) FilterJoin(ids ...[]string) (filtered []string)
CreateDeleteChange(id string, isSnapshot bool) (res []byte, err error)
} }
type deletionState struct { type objectDeletionState struct {
sync.RWMutex sync.RWMutex
queued map[string]struct{} queued map[string]struct{}
deleted map[string]struct{} deleted map[string]struct{}
@ -27,21 +25,21 @@ type deletionState struct {
storage spacestorage.SpaceStorage storage spacestorage.SpaceStorage
} }
func NewDeletionState(storage spacestorage.SpaceStorage) DeletionState { func NewObjectDeletionState(storage spacestorage.SpaceStorage) ObjectDeletionState {
return &deletionState{ return &objectDeletionState{
queued: map[string]struct{}{}, queued: map[string]struct{}{},
deleted: map[string]struct{}{}, deleted: map[string]struct{}{},
storage: storage, storage: storage,
} }
} }
func (st *deletionState) AddObserver(observer StateUpdateObserver) { func (st *objectDeletionState) AddObserver(observer StateUpdateObserver) {
st.Lock() st.Lock()
defer st.Unlock() defer st.Unlock()
st.stateUpdateObservers = append(st.stateUpdateObservers, observer) st.stateUpdateObservers = append(st.stateUpdateObservers, observer)
} }
func (st *deletionState) Add(ids []string) (err error) { func (st *objectDeletionState) Add(ids []string) (err error) {
st.Lock() st.Lock()
defer func() { defer func() {
st.Unlock() st.Unlock()
@ -83,7 +81,7 @@ func (st *deletionState) Add(ids []string) (err error) {
return return
} }
func (st *deletionState) GetQueued() (ids []string) { func (st *objectDeletionState) GetQueued() (ids []string) {
st.RLock() st.RLock()
defer st.RUnlock() defer st.RUnlock()
ids = make([]string, 0, len(st.queued)) ids = make([]string, 0, len(st.queued))
@ -93,7 +91,7 @@ func (st *deletionState) GetQueued() (ids []string) {
return return
} }
func (st *deletionState) Delete(id string) (err error) { func (st *objectDeletionState) Delete(id string) (err error) {
st.Lock() st.Lock()
defer st.Unlock() defer st.Unlock()
delete(st.queued, id) delete(st.queued, id)
@ -105,13 +103,13 @@ func (st *deletionState) Delete(id string) (err error) {
return return
} }
func (st *deletionState) Exists(id string) bool { func (st *objectDeletionState) Exists(id string) bool {
st.RLock() st.RLock()
defer st.RUnlock() defer st.RUnlock()
return st.exists(id) return st.exists(id)
} }
func (st *deletionState) FilterJoin(ids ...[]string) (filtered []string) { func (st *objectDeletionState) FilterJoin(ids ...[]string) (filtered []string) {
st.RLock() st.RLock()
defer st.RUnlock() defer st.RUnlock()
filter := func(ids []string) { filter := func(ids []string) {
@ -127,22 +125,7 @@ func (st *deletionState) FilterJoin(ids ...[]string) (filtered []string) {
return return
} }
func (st *deletionState) CreateDeleteChange(id string, isSnapshot bool) (res []byte, err error) { func (st *objectDeletionState) exists(id string) bool {
content := &spacesyncproto.SpaceSettingsContent_ObjectDelete{
ObjectDelete: &spacesyncproto.ObjectDelete{Id: id},
}
change := &spacesyncproto.SettingsData{
Content: []*spacesyncproto.SpaceSettingsContent{
{Value: content},
},
Snapshot: nil,
}
// TODO: add snapshot logic
res, err = change.Marshal()
return
}
func (st *deletionState) exists(id string) bool {
if _, exists := st.deleted[id]; exists { if _, exists := st.deleted[id]; exists {
return true return true
} }

View File

@ -1,4 +1,4 @@
package deletionstate package settingsstate
import ( import (
"github.com/anytypeio/any-sync/commonspace/spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage"
@ -11,14 +11,14 @@ import (
type fixture struct { type fixture struct {
ctrl *gomock.Controller ctrl *gomock.Controller
delState *deletionState delState *objectDeletionState
spaceStorage *mock_spacestorage.MockSpaceStorage spaceStorage *mock_spacestorage.MockSpaceStorage
} }
func newFixture(t *testing.T) *fixture { func newFixture(t *testing.T) *fixture {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
spaceStorage := mock_spacestorage.NewMockSpaceStorage(ctrl) spaceStorage := mock_spacestorage.NewMockSpaceStorage(ctrl)
delState := NewDeletionState(spaceStorage).(*deletionState) delState := NewObjectDeletionState(spaceStorage).(*objectDeletionState)
return &fixture{ return &fixture{
ctrl: ctrl, ctrl: ctrl,
delState: delState, delState: delState,

View File

@ -1,17 +1,17 @@
// Code generated by MockGen. DO NOT EDIT. // Code generated by MockGen. DO NOT EDIT.
// Source: github.com/anytypeio/any-sync/commonspace/settings/deletionstate (interfaces: DeletionState) // Source: github.com/anytypeio/any-sync/commonspace/settings/deletionstate (interfaces: ObjectDeletionState)
// Package mock_deletionstate is a generated GoMock package. // Package mock_deletionstate is a generated GoMock package.
package mock_deletionstate package mock_settingsstate
import ( import (
reflect "reflect" reflect "reflect"
deletionstate "github.com/anytypeio/any-sync/commonspace/settings/deletionstate" deletionstate "github.com/anytypeio/any-sync/commonspace/settings/settingsstate"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
) )
// MockDeletionState is a mock of DeletionState interface. // MockDeletionState is a mock of ObjectDeletionState interface.
type MockDeletionState struct { type MockDeletionState struct {
ctrl *gomock.Controller ctrl *gomock.Controller
recorder *MockDeletionStateMockRecorder recorder *MockDeletionStateMockRecorder
@ -61,7 +61,7 @@ func (mr *MockDeletionStateMockRecorder) AddObserver(arg0 interface{}) *gomock.C
} }
// CreateDeleteChange mocks base method. // CreateDeleteChange mocks base method.
func (m *MockDeletionState) CreateDeleteChange(arg0 string, arg1 bool) ([]byte, error) { func (m *MockDeletionState) CreateObjectDeleteChange(arg0 string, arg1 bool) ([]byte, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "CreateDeleteChange", arg0, arg1) ret := m.ctrl.Call(m, "CreateDeleteChange", arg0, arg1)
ret0, _ := ret[0].([]byte) ret0, _ := ret[0].([]byte)
@ -72,7 +72,7 @@ func (m *MockDeletionState) CreateDeleteChange(arg0 string, arg1 bool) ([]byte,
// CreateDeleteChange indicates an expected call of CreateDeleteChange. // CreateDeleteChange indicates an expected call of CreateDeleteChange.
func (mr *MockDeletionStateMockRecorder) CreateDeleteChange(arg0, arg1 interface{}) *gomock.Call { func (mr *MockDeletionStateMockRecorder) CreateDeleteChange(arg0, arg1 interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateDeleteChange", reflect.TypeOf((*MockDeletionState)(nil).CreateDeleteChange), arg0, arg1) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateDeleteChange", reflect.TypeOf((*MockDeletionState)(nil).CreateObjectDeleteChange), arg0, arg1)
} }
// Delete mocks base method. // Delete mocks base method.

View File

@ -1,4 +1,4 @@
package settings package settingsstate
import "time" import "time"

View File

@ -1,4 +1,4 @@
package settings package settingsstate
import ( import (
"github.com/anytypeio/any-sync/commonspace/object/tree/objecttree" "github.com/anytypeio/any-sync/commonspace/object/tree/objecttree"
@ -8,24 +8,18 @@ import (
) )
type StateBuilder interface { type StateBuilder interface {
Build(tree objecttree.ObjectTree, isUpdate bool) (*State, error) Build(tree objecttree.ObjectTree, state *State, isUpdate bool) (*State, error)
} }
func newStateBuilder() StateBuilder { func NewStateBuilder() StateBuilder {
return &stateBuilder{} return &stateBuilder{}
} }
type stateBuilder struct { type stateBuilder struct {
state *State
} }
func (s *stateBuilder) Build(tr objecttree.ObjectTree, isUpdate bool) (state *State, err error) { func (s *stateBuilder) Build(tr objecttree.ObjectTree, oldState *State, isUpdate bool) (state *State, err error) {
state = s.state state = oldState
defer func() {
if err == nil {
s.state = state
}
}()
if !isUpdate || state == nil { if !isUpdate || state == nil {
state = &State{} state = &State{}

View File

@ -18,7 +18,7 @@ import (
"github.com/anytypeio/any-sync/commonspace/objectsync" "github.com/anytypeio/any-sync/commonspace/objectsync"
"github.com/anytypeio/any-sync/commonspace/peermanager" "github.com/anytypeio/any-sync/commonspace/peermanager"
"github.com/anytypeio/any-sync/commonspace/settings" "github.com/anytypeio/any-sync/commonspace/settings"
"github.com/anytypeio/any-sync/commonspace/settings/deletionstate" "github.com/anytypeio/any-sync/commonspace/settings/settingsstate"
"github.com/anytypeio/any-sync/commonspace/spacestorage" "github.com/anytypeio/any-sync/commonspace/spacestorage"
"github.com/anytypeio/any-sync/commonspace/spacesyncproto" "github.com/anytypeio/any-sync/commonspace/spacesyncproto"
"github.com/anytypeio/any-sync/commonspace/syncstatus" "github.com/anytypeio/any-sync/commonspace/syncstatus"
@ -99,6 +99,9 @@ type Space interface {
DeleteTree(ctx context.Context, id string) (err error) DeleteTree(ctx context.Context, id string) (err error)
BuildHistoryTree(ctx context.Context, id string, opts HistoryTreeOpts) (t objecttree.HistoryTree, err error) BuildHistoryTree(ctx context.Context, id string, opts HistoryTreeOpts) (t objecttree.HistoryTree, err error)
DeleteSpace(ctx context.Context, t time.Time) (err error)
RestoreSpace(ctx context.Context) (err error)
HeadSync() headsync.HeadSync HeadSync() headsync.HeadSync
ObjectSync() objectsync.ObjectSync ObjectSync() objectsync.ObjectSync
SyncStatus() syncstatus.StatusUpdater SyncStatus() syncstatus.StatusUpdater
@ -191,7 +194,7 @@ func (s *space) Init(ctx context.Context) (err error) {
s.aclList = syncacl.NewSyncAcl(aclList, s.objectSync.MessagePool()) s.aclList = syncacl.NewSyncAcl(aclList, s.objectSync.MessagePool())
s.cache.AddObject(s.aclList) s.cache.AddObject(s.aclList)
deletionState := deletionstate.NewDeletionState(s.storage) deletionState := settingsstate.NewObjectDeletionState(s.storage)
deps := settings.Deps{ deps := settings.Deps{
BuildFunc: func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) { BuildFunc: func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) {
res, err := s.BuildTree(ctx, id, BuildTreeOpts{ res, err := s.BuildTree(ctx, id, BuildTreeOpts{
@ -363,6 +366,14 @@ func (s *space) DeleteTree(ctx context.Context, id string) (err error) {
return s.settingsObject.DeleteObject(id) return s.settingsObject.DeleteObject(id)
} }
func (s *space) DeleteSpace(ctx context.Context, t time.Time) (err error) {
return s.settingsObject.DeleteSpace(t)
}
func (s *space) RestoreSpace(ctx context.Context) (err error) {
return s.settingsObject.RestoreSpace()
}
func (s *space) HandleMessage(ctx context.Context, hm HandleMessage) (err error) { func (s *space) HandleMessage(ctx context.Context, hm HandleMessage) (err error) {
threadId := hm.Message.ObjectId threadId := hm.Message.ObjectId
if hm.Message.ReplyId != "" { if hm.Message.ReplyId != "" {