Send head notify message on object create

This commit is contained in:
mcrakhman 2022-12-21 19:50:46 +01:00 committed by Mikhail Iudin
parent 56f35c1a73
commit 86359af3be
No known key found for this signature in database
GPG Key ID: FAAAA8BAABDFF1C0
5 changed files with 85 additions and 35 deletions

View File

@ -225,13 +225,14 @@ func (s *space) DeriveTree(ctx context.Context, payload tree.ObjectTreeCreatePay
return return
} }
deps := synctree.CreateDeps{ deps := synctree.CreateDeps{
SpaceId: s.id, SpaceId: s.id,
Payload: payload, Payload: payload,
SyncService: s.syncService, SyncService: s.syncService,
Configuration: s.configuration, Configuration: s.configuration,
AclList: s.aclList, AclList: s.aclList,
SpaceStorage: s.storage, SpaceStorage: s.storage,
StatusService: s.statusService, StatusService: s.statusService,
HeadNotifiable: s.diffService,
} }
return synctree.DeriveSyncTree(ctx, deps) return synctree.DeriveSyncTree(ctx, deps)
} }
@ -242,13 +243,14 @@ func (s *space) CreateTree(ctx context.Context, payload tree.ObjectTreeCreatePay
return return
} }
deps := synctree.CreateDeps{ deps := synctree.CreateDeps{
SpaceId: s.id, SpaceId: s.id,
Payload: payload, Payload: payload,
SyncService: s.syncService, SyncService: s.syncService,
Configuration: s.configuration, Configuration: s.configuration,
AclList: s.aclList, AclList: s.aclList,
SpaceStorage: s.storage, SpaceStorage: s.storage,
StatusService: s.statusService, StatusService: s.statusService,
HeadNotifiable: s.diffService,
} }
return synctree.CreateSyncTree(ctx, deps) return synctree.CreateSyncTree(ctx, deps)
} }

View File

@ -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) // 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 is a generated GoMock package.
package mock_synctree package mock_synctree
@ -519,3 +519,38 @@ func (mr *MockReceiveQueueMockRecorder) GetMessage(arg0 interface{}) *gomock.Cal
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMessage", reflect.TypeOf((*MockReceiveQueue)(nil).GetMessage), arg0) 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)
}

View File

@ -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 package synctree
import ( import (

View File

@ -57,13 +57,14 @@ var buildObjectTree = tree.BuildObjectTree
var createSyncClient = newWrappedSyncClient var createSyncClient = newWrappedSyncClient
type CreateDeps struct { type CreateDeps struct {
SpaceId string SpaceId string
Payload tree.ObjectTreeCreatePayload Payload tree.ObjectTreeCreatePayload
Configuration nodeconf.Configuration Configuration nodeconf.Configuration
SyncService syncservice.SyncService SyncService syncservice.SyncService
AclList list.ACLList AclList list.ACLList
SpaceStorage spacestorage.SpaceStorage SpaceStorage spacestorage.SpaceStorage
StatusService statusservice.StatusService StatusService statusservice.StatusService
HeadNotifiable HeadNotifiable
} }
type BuildDeps struct { type BuildDeps struct {
@ -101,8 +102,11 @@ func DeriveSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
deps.Configuration) deps.Configuration)
id = objTree.ID() id = objTree.ID()
heads := objTree.Heads()
deps.HeadNotifiable.UpdateHeads(id, heads)
headUpdate := syncClient.CreateHeadUpdate(objTree, nil) headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
deps.StatusService.HeadsChange(id, objTree.Heads()) deps.StatusService.HeadsChange(id, heads)
syncClient.BroadcastAsync(headUpdate) syncClient.BroadcastAsync(headUpdate)
return return
} }
@ -119,8 +123,11 @@ func CreateSyncTree(ctx context.Context, deps CreateDeps) (id string, err error)
deps.Configuration) deps.Configuration)
id = objTree.ID() id = objTree.ID()
heads := objTree.Heads()
deps.HeadNotifiable.UpdateHeads(id, heads)
headUpdate := syncClient.CreateHeadUpdate(objTree, nil) headUpdate := syncClient.CreateHeadUpdate(objTree, nil)
deps.StatusService.HeadsChange(id, objTree.Heads()) deps.StatusService.HeadsChange(id, heads)
syncClient.BroadcastAsync(headUpdate) syncClient.BroadcastAsync(headUpdate)
return return
} }

View File

@ -53,6 +53,7 @@ func Test_DeriveSyncTree(t *testing.T) {
aclListMock := mock_list.NewMockACLList(ctrl) aclListMock := mock_list.NewMockACLList(ctrl)
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl) spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl)
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
spaceId := "spaceId" spaceId := "spaceId"
expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId} expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId}
createDerivedObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { 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) createSyncClient = syncClientFuncCreator(syncClientMock)
headUpdate := &treechangeproto.TreeSyncMessage{} headUpdate := &treechangeproto.TreeSyncMessage{}
objTreeMock.EXPECT().Heads().AnyTimes().Return([]string{"h1"}) objTreeMock.EXPECT().Heads().AnyTimes().Return([]string{"h1"})
headNotifiableMock.EXPECT().UpdateHeads("id", []string{"h1"})
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate)
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
deps := CreateDeps{ deps := CreateDeps{
AclList: aclListMock, AclList: aclListMock,
SpaceId: spaceId, SpaceId: spaceId,
Payload: expectedPayload, Payload: expectedPayload,
SpaceStorage: spaceStorageMock, SpaceStorage: spaceStorageMock,
StatusService: statusservice.NewNoOpStatusService(), StatusService: statusservice.NewNoOpStatusService(),
HeadNotifiable: headNotifiableMock,
} }
objTreeMock.EXPECT().ID().Return("id") objTreeMock.EXPECT().ID().Return("id")
@ -87,6 +90,7 @@ func Test_CreateSyncTree(t *testing.T) {
aclListMock := mock_list.NewMockACLList(ctrl) aclListMock := mock_list.NewMockACLList(ctrl)
objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl)) objTreeMock := newTestObjMock(mock_tree.NewMockObjectTree(ctrl))
spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl) spaceStorageMock := mock_storage.NewMockSpaceStorage(ctrl)
headNotifiableMock := mock_synctree.NewMockHeadNotifiable(ctrl)
spaceId := "spaceId" spaceId := "spaceId"
expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId} expectedPayload := tree.ObjectTreeCreatePayload{SpaceId: spaceId}
createObjectTree = func(payload tree.ObjectTreeCreatePayload, l list.ACLList, create storage2.TreeStorageCreatorFunc) (objTree tree.ObjectTree, err error) { 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) createSyncClient = syncClientFuncCreator(syncClientMock)
objTreeMock.EXPECT().Heads().AnyTimes().Return([]string{"h1"}) objTreeMock.EXPECT().Heads().AnyTimes().Return([]string{"h1"})
headUpdate := &treechangeproto.TreeSyncMessage{} headUpdate := &treechangeproto.TreeSyncMessage{}
headNotifiableMock.EXPECT().UpdateHeads("id", []string{"h1"})
syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate) syncClientMock.EXPECT().CreateHeadUpdate(gomock.Any(), gomock.Nil()).Return(headUpdate)
syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil) syncClientMock.EXPECT().BroadcastAsync(gomock.Eq(headUpdate)).Return(nil)
objTreeMock.EXPECT().ID().Return("id") objTreeMock.EXPECT().ID().Return("id")
deps := CreateDeps{ deps := CreateDeps{
AclList: aclListMock, AclList: aclListMock,
SpaceId: spaceId, SpaceId: spaceId,
Payload: expectedPayload, Payload: expectedPayload,
SpaceStorage: spaceStorageMock, SpaceStorage: spaceStorageMock,
StatusService: statusservice.NewNoOpStatusService(), StatusService: statusservice.NewNoOpStatusService(),
HeadNotifiable: headNotifiableMock,
} }
_, err := CreateSyncTree(ctx, deps) _, err := CreateSyncTree(ctx, deps)