diff --git a/commonspace/settings/settings.go b/commonspace/settings/settings.go index 1cc6c7fc..0cb4591d 100644 --- a/commonspace/settings/settings.go +++ b/commonspace/settings/settings.go @@ -4,6 +4,7 @@ package settings import ( "context" "errors" + "fmt" "github.com/anytypeio/any-sync/accountservice" "github.com/anytypeio/any-sync/app/logger" "github.com/anytypeio/any-sync/commonspace/object/tree/objecttree" @@ -26,16 +27,15 @@ type SettingsObject interface { synctree.SyncTree Init(ctx context.Context) (err error) DeleteObject(id string) (err error) - DeleteSpace(ctx context.Context, deleterId string, raw *treechangeproto.RawTreeChangeWithId) (err error) - SpaceDeleteRawChange(deleterId string) (raw *treechangeproto.RawTreeChangeWithId, err error) + DeleteSpace(ctx context.Context, raw *treechangeproto.RawTreeChangeWithId) (err error) + SpaceDeleteRawChange() (raw *treechangeproto.RawTreeChangeWithId, err error) } var ( - ErrDeleteSelf = errors.New("cannot delete self") - ErrAlreadyDeleted = errors.New("the object is already deleted") - ErrObjDoesNotExist = errors.New("the object does not exist") - ErrCantDeleteSpace = errors.New("not able to delete space") - ErrIncorrectDeleteChange = errors.New("incorrect delete change") + ErrDeleteSelf = errors.New("cannot delete self") + ErrAlreadyDeleted = errors.New("the object is already deleted") + ErrObjDoesNotExist = errors.New("the object does not exist") + ErrCantDeleteSpace = errors.New("not able to delete space") ) type BuildTreeFunc func(ctx context.Context, id string, listener updatelistener.UpdateListener) (t synctree.SyncTree, err error) @@ -137,7 +137,7 @@ func (s *settingsObject) updateIds(tr objecttree.ObjectTree) { log.Error("failed to build state", zap.Error(err)) return } - log.Debug("updating object state", zap.String("deleterId", s.state.DeleterId)) + log.Debug("updating object state", zap.String("deleted by", s.state.DeleterId)) if err = s.deletionManager.UpdateState(context.Background(), s.state); err != nil { log.Error("failed to update state", zap.Error(err)) } @@ -172,13 +172,13 @@ func (s *settingsObject) Close() error { return s.SyncTree.Close() } -func (s *settingsObject) DeleteSpace(ctx context.Context, deleterId string, raw *treechangeproto.RawTreeChangeWithId) (err error) { +func (s *settingsObject) DeleteSpace(ctx context.Context, raw *treechangeproto.RawTreeChangeWithId) (err error) { s.Lock() defer s.Unlock() defer func() { log.Debug("finished adding delete change", zap.Error(err)) }() - err = s.verifyDeleteSpace(deleterId, raw) + err = s.verifyDeleteSpace(raw) if err != nil { return } @@ -196,12 +196,12 @@ func (s *settingsObject) DeleteSpace(ctx context.Context, deleterId string, raw return } -func (s *settingsObject) SpaceDeleteRawChange(deleterId string) (raw *treechangeproto.RawTreeChangeWithId, err error) { - data, err := s.changeFactory.CreateSpaceDeleteChange(deleterId, s.state, false) +func (s *settingsObject) SpaceDeleteRawChange() (raw *treechangeproto.RawTreeChangeWithId, err error) { + accountData := s.account.Account() + data, err := s.changeFactory.CreateSpaceDeleteChange(accountData.PeerId, s.state, false) if err != nil { return } - accountData := s.account.Account() return s.PrepareChange(objecttree.SignableChangeContent{ Data: data, Key: accountData.SignKey, @@ -237,7 +237,7 @@ func (s *settingsObject) DeleteObject(id string) (err error) { return s.addContent(res) } -func (s *settingsObject) verifyDeleteSpace(peerId string, raw *treechangeproto.RawTreeChangeWithId) (err error) { +func (s *settingsObject) verifyDeleteSpace(raw *treechangeproto.RawTreeChangeWithId) (err error) { data, err := s.UnpackChange(raw) if err != nil { return @@ -249,8 +249,8 @@ func (s *settingsObject) verifyDeleteSpace(peerId string, raw *treechangeproto.R } if len(content.GetContent()) != 1 || content.GetContent()[0].GetSpaceDelete() == nil || - content.GetContent()[0].GetSpaceDelete().GetDeleterPeerId() != peerId { - return ErrIncorrectDeleteChange + content.GetContent()[0].GetSpaceDelete().GetDeleterPeerId() == "" { + return fmt.Errorf("incorrect delete change payload") } return } diff --git a/commonspace/settings/settings_test.go b/commonspace/settings/settings_test.go index 184e1ea3..ce14ff3f 100644 --- a/commonspace/settings/settings_test.go +++ b/commonspace/settings/settings_test.go @@ -235,11 +235,11 @@ func TestSettingsObject_DeleteSpace(t *testing.T) { Heads: []string{rawCh.Id}, }, nil) - err = fx.doc.DeleteSpace(context.Background(), deleterId, rawCh) + err = fx.doc.DeleteSpace(context.Background(), rawCh) require.NoError(t, err) } -func TestSettingsObject_DeleteSpaceIncorrectPeerId(t *testing.T) { +func TestSettingsObject_DeleteSpaceIncorrectChange(t *testing.T) { fx := newSettingsFixture(t) defer fx.stop() @@ -250,15 +250,29 @@ func TestSettingsObject_DeleteSpaceIncorrectPeerId(t *testing.T) { require.NoError(t, err) time.Sleep(100 * time.Millisecond) - deleterId := "delId" - rawCh := &treechangeproto.RawTreeChangeWithId{ - RawChange: []byte{1}, - Id: "id", - } - changeFactory := settingsstate.NewChangeFactory() - delChange, _ := changeFactory.CreateSpaceDeleteChange("otherId", &settingsstate.State{}, false) + t.Run("incorrect change type", func(t *testing.T) { + rawCh := &treechangeproto.RawTreeChangeWithId{ + RawChange: []byte{1}, + Id: "id", + } + changeFactory := settingsstate.NewChangeFactory() + delChange, _ := changeFactory.CreateObjectDeleteChange("otherId", &settingsstate.State{}, false) - fx.syncTree.EXPECT().UnpackChange(rawCh).Return(delChange, nil) - err = fx.doc.DeleteSpace(context.Background(), deleterId, rawCh) - require.Equal(t, err, ErrIncorrectDeleteChange) + fx.syncTree.EXPECT().UnpackChange(rawCh).Return(delChange, nil) + err = fx.doc.DeleteSpace(context.Background(), rawCh) + require.NotNil(t, err) + }) + + t.Run("empty peer", func(t *testing.T) { + rawCh := &treechangeproto.RawTreeChangeWithId{ + RawChange: []byte{1}, + Id: "id", + } + changeFactory := settingsstate.NewChangeFactory() + delChange, _ := changeFactory.CreateSpaceDeleteChange("", &settingsstate.State{}, false) + + fx.syncTree.EXPECT().UnpackChange(rawCh).Return(delChange, nil) + err = fx.doc.DeleteSpace(context.Background(), rawCh) + require.NotNil(t, err) + }) } diff --git a/commonspace/space.go b/commonspace/space.go index 58e28575..d18c9e8a 100644 --- a/commonspace/space.go +++ b/commonspace/space.go @@ -38,8 +38,7 @@ import ( ) var ( - ErrSpaceClosed = errors.New("space is closed") - ErrPutNotImplemented = errors.New("put tree is not implemented") + ErrSpaceClosed = errors.New("space is closed") ) type SpaceCreatePayload struct { @@ -99,8 +98,8 @@ type Space interface { DeleteTree(ctx context.Context, id string) (err error) BuildHistoryTree(ctx context.Context, id string, opts HistoryTreeOpts) (t objecttree.HistoryTree, err error) - SpaceDeleteRawChange(ctx context.Context, deleterPeer string) (raw *treechangeproto.RawTreeChangeWithId, err error) - DeleteSpace(ctx context.Context, deleterPeer string, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) + SpaceDeleteRawChange(ctx context.Context) (raw *treechangeproto.RawTreeChangeWithId, err error) + DeleteSpace(ctx context.Context, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) HeadSync() headsync.HeadSync ObjectSync() objectsync.ObjectSync @@ -369,12 +368,12 @@ func (s *space) DeleteTree(ctx context.Context, id string) (err error) { return s.settingsObject.DeleteObject(id) } -func (s *space) SpaceDeleteRawChange(ctx context.Context, deleterPeer string) (raw *treechangeproto.RawTreeChangeWithId, err error) { - return s.settingsObject.SpaceDeleteRawChange(deleterPeer) +func (s *space) SpaceDeleteRawChange(ctx context.Context) (raw *treechangeproto.RawTreeChangeWithId, err error) { + return s.settingsObject.SpaceDeleteRawChange() } -func (s *space) DeleteSpace(ctx context.Context, deleterPeer string, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) { - return s.settingsObject.DeleteSpace(ctx, deleterPeer, deleteChange) +func (s *space) DeleteSpace(ctx context.Context, deleteChange *treechangeproto.RawTreeChangeWithId) (err error) { + return s.settingsObject.DeleteSpace(ctx, deleteChange) } func (s *space) HandleMessage(ctx context.Context, hm HandleMessage) (err error) {