From 86359af3be906859417c0e57c37658922d07f56b Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Wed, 21 Dec 2022 19:50:46 +0100 Subject: [PATCH] Send head notify message on object create --- common/commonspace/space.go | 30 ++++++++------- .../synctree/mock_synctree/mock_synctree.go | 37 ++++++++++++++++++- common/commonspace/synctree/syncclient.go | 2 +- common/commonspace/synctree/synctree.go | 25 ++++++++----- common/commonspace/synctree/synctree_test.go | 26 ++++++++----- 5 files changed, 85 insertions(+), 35 deletions(-) diff --git a/common/commonspace/space.go b/common/commonspace/space.go index d243e265..512eb054 100644 --- a/common/commonspace/space.go +++ b/common/commonspace/space.go @@ -225,13 +225,14 @@ func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePay return } deps := synctree.CreateDeps{ - SpaceId: s.id, - Payload: payload, - SyncService: s.syncService, - Configuration: s.configuration, - AclList: s.aclList, - SpaceStorage: s.storage, - StatusService: s.statusService, + SpaceId: s.id, + Payload: payload, + SyncService: s.syncService, + Configuration: s.configuration, + AclList: s.aclList, + SpaceStorage: s.storage, + StatusService: s.statusService, + HeadNotifiable: s.diffService, } return synctree.DeriveSyncTree(ctx, deps) } @@ -242,13 +243,14 @@ func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePay return } deps := synctree.CreateDeps{ - SpaceId: s.id, - Payload: payload, - SyncService: s.syncService, - Configuration: s.configuration, - AclList: s.aclList, - SpaceStorage: s.storage, - StatusService: s.statusService, + SpaceId: s.id, + Payload: payload, + SyncService: s.syncService, + Configuration: s.configuration, + AclList: s.aclList, + SpaceStorage: s.storage, + StatusService: s.statusService, + HeadNotifiable: s.diffService, } return synctree.CreateSyncTree(ctx, deps) } diff --git a/common/commonspace/synctree/mock_synctree/mock_synctree.go b/common/commonspace/synctree/mock_synctree/mock_synctree.go index cbb6e976..5916216c 100644 --- a/common/commonspace/synctree/mock_synctree/mock_synctree.go +++ b/common/commonspace/synctree/mock_synctree/mock_synctree.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree (interfaces: SyncClient,SyncTree,ReceiveQueue) +// Source: github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree (interfaces: SyncClient,SyncTree,ReceiveQueue,HeadNotifiable) // Package mock_synctree is a generated GoMock package. package mock_synctree @@ -519,3 +519,38 @@ func (mr *MockReceiveQueueMockRecorder) GetMessage(arg0 interface{}) *gomock.Cal mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMessage", reflect.TypeOf((*MockReceiveQueue)(nil).GetMessage), arg0) } + +// MockHeadNotifiable is a mock of HeadNotifiable interface. +type MockHeadNotifiable struct { + ctrl *gomock.Controller + recorder *MockHeadNotifiableMockRecorder +} + +// MockHeadNotifiableMockRecorder is the mock recorder for MockHeadNotifiable. +type MockHeadNotifiableMockRecorder struct { + mock *MockHeadNotifiable +} + +// NewMockHeadNotifiable creates a new mock instance. +func NewMockHeadNotifiable(ctrl *gomock.Controller) *MockHeadNotifiable { + mock := &MockHeadNotifiable{ctrl: ctrl} + mock.recorder = &MockHeadNotifiableMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockHeadNotifiable) EXPECT() *MockHeadNotifiableMockRecorder { + return m.recorder +} + +// UpdateHeads mocks base method. +func (m *MockHeadNotifiable) UpdateHeads(arg0 string, arg1 []string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "UpdateHeads", arg0, arg1) +} + +// UpdateHeads indicates an expected call of UpdateHeads. +func (mr *MockHeadNotifiableMockRecorder) UpdateHeads(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateHeads", reflect.TypeOf((*MockHeadNotifiable)(nil).UpdateHeads), arg0, arg1) +} diff --git a/common/commonspace/synctree/syncclient.go b/common/commonspace/synctree/syncclient.go index a4eeaed0..ee49b14c 100644 --- a/common/commonspace/synctree/syncclient.go +++ b/common/commonspace/synctree/syncclient.go @@ -1,4 +1,4 @@ -//go:generate mockgen -destination mock_synctree/mock_synctree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree SyncClient,SyncTree,ReceiveQueue +//go:generate mockgen -destination mock_synctree/mock_synctree.go github.com/anytypeio/go-anytype-infrastructure-experiments/common/commonspace/synctree SyncClient,SyncTree,ReceiveQueue,HeadNotifiable package synctree import ( diff --git a/common/commonspace/synctree/synctree.go b/common/commonspace/synctree/synctree.go index 0fbf3e6f..3490acbd 100644 --- a/common/commonspace/synctree/synctree.go +++ b/common/commonspace/synctree/synctree.go @@ -57,13 +57,14 @@ var buildObjectTree = tree.BuildObjectTree var createSyncClient = newWrappedSyncClient type CreateDeps struct { - SpaceId string - Payload tree.ObjectTreeCreatePayload - Configuration nodeconf.Configuration - SyncService syncservice.SyncService - AclList list.ACLList - SpaceStorage spacestorage.SpaceStorage - StatusService statusservice.StatusService + SpaceId string + Payload tree.ObjectTreeCreatePayload + Configuration nodeconf.Configuration + SyncService syncservice.SyncService + AclList list.ACLList + SpaceStorage spacestorage.SpaceStorage + StatusService statusservice.StatusService + HeadNotifiable HeadNotifiable } type BuildDeps struct { @@ -101,8 +102,11 @@ func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error) deps.Configuration) id = objTree.ID() + heads := objTree.Heads() + + deps.HeadNotifiable.UpdateHeads(id, heads) headUpdate := syncClient.CreateHeadUpdate(objTree, nil) - deps.StatusService.HeadsChange(id, objTree.Heads()) + deps.StatusService.HeadsChange(id, heads) syncClient.BroadcastAsync(headUpdate) return } @@ -119,8 +123,11 @@ func CreateSyncTree(ctx context.Context, deps CreateDeps) (id string, err error) deps.Configuration) id = objTree.ID() + heads := objTree.Heads() + + deps.HeadNotifiable.UpdateHeads(id, heads) headUpdate := syncClient.CreateHeadUpdate(objTree, nil) - deps.StatusService.HeadsChange(id, objTree.Heads()) + deps.StatusService.HeadsChange(id, heads) syncClient.BroadcastAsync(headUpdate) return } diff --git a/common/commonspace/synctree/synctree_test.go b/common/commonspace/synctree/synctree_test.go index df0a29f0..e005c9e7 100644 --- a/common/commonspace/synctree/synctree_test.go +++ b/common/commonspace/synctree/synctree_test.go @@ -53,6 +53,7 @@ func Test_DeriveSyncTree(t *testing.T) { aclListMock := mock_list.NewMockACLList(ctrl) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl) + headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl) spaceId := "spaceId" expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId} createDerivedObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { @@ -63,14 +64,16 @@ func Test_DeriveSyncTree(t *testing.T) { createSyncClient = syncClientFuncCreator(syncClientMock) headUpdate := &treechangeproto.TreeSyncMessage{} objTreeMock.EXPECT().Heads().AnyTimes().Return([]string{"h1"}) + headNotifiableMock.EXPECT().UpdateHeads("id", []string{"h1"}) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) deps := CreateDeps{ - AclList: aclListMock, - SpaceId: spaceId, - Payload: expectedPayload, - SpaceStorage: spaceStorageMock, - StatusService: statusservice.NewNoOpStatusService(), + AclList: aclListMock, + SpaceId: spaceId, + Payload: expectedPayload, + SpaceStorage: spaceStorageMock, + StatusService: statusservice.NewNoOpStatusService(), + HeadNotifiable: headNotifiableMock, } objTreeMock.EXPECT().ID().Return("id") @@ -87,6 +90,7 @@ func Test_CreateSyncTree(t *testing.T) { aclListMock := mock_list.NewMockACLList(ctrl) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl) + headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl) spaceId := "spaceId" expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId} createObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { @@ -98,15 +102,17 @@ func Test_CreateSyncTree(t *testing.T) { createSyncClient = syncClientFuncCreator(syncClientMock) objTreeMock.EXPECT().Heads().AnyTimes().Return([]string{"h1"}) headUpdate := &treechangeproto.TreeSyncMessage{} + headNotifiableMock.EXPECT().UpdateHeads("id", []string{"h1"}) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) objTreeMock.EXPECT().ID().Return("id") deps := CreateDeps{ - AclList: aclListMock, - SpaceId: spaceId, - Payload: expectedPayload, - SpaceStorage: spaceStorageMock, - StatusService: statusservice.NewNoOpStatusService(), + AclList: aclListMock, + SpaceId: spaceId, + Payload: expectedPayload, + SpaceStorage: spaceStorageMock, + StatusService: statusservice.NewNoOpStatusService(), + HeadNotifiable: headNotifiableMock, } _, err := CreateSyncTree(ctx, deps)