Skip to content

Commit 529680e

Browse files
committed
refactor(accounts): remove duplication for backed up settings
Fixes status-im/status-desktop#18344 Removes the duplication in the accounts service by moving the shared code to the syncing module. Removes as much as much as possible the use of the Messenger. The signal sending still uses the Messenger for now.
1 parent 7046592 commit 529680e

File tree

11 files changed

+123
-150
lines changed

11 files changed

+123
-150
lines changed

api/geth_backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2362,7 +2362,7 @@ func (b *GethStatusBackend) initProtocol() error {
23622362
messenger := st.Messenger()
23632363
// Init public status api
23642364
b.statusNode.StatusPublicService().Init(messenger)
2365-
b.statusNode.AccountService().Init(messenger)
2365+
b.statusNode.AccountService().Init(messenger, acc)
23662366
// Init chat service
23672367
accDB, err := accounts.NewDB(b.appDB)
23682368
if err != nil {

node/status_node_services.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ func (b *StatusNode) accountsService(accDB *accounts.Database, mediaServer *serv
189189
b.config,
190190
b.accountsPublisher,
191191
mediaServer,
192+
b.logger.Named("AccountsService"),
192193
)
193194
}
194195

protocol/messenger_backup_handler.go

Lines changed: 9 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -174,53 +174,6 @@ func (m *Messenger) handleBackedUpProfile(message *protobuf.BackedUpProfile, bac
174174
return err
175175
}
176176

177-
// TODO move this to the AccountsService
178-
func (m *Messenger) HandleBackedUpSettings(message *protobuf.SyncSetting) error {
179-
if message == nil {
180-
return nil
181-
}
182-
183-
// DisplayName is recovered via `protobuf.BackedUpProfile` message
184-
if message.GetType() == protobuf.SyncSetting_DISPLAY_NAME {
185-
return nil
186-
}
187-
188-
settingField, err := m.extractAndSaveSyncSetting(message)
189-
if err != nil {
190-
m.logger.Warn("failed to handle SyncSetting from backed up message", zap.Error(err))
191-
return nil
192-
}
193-
194-
if settingField != nil {
195-
if message.GetType() == protobuf.SyncSetting_PREFERRED_NAME && message.GetValueString() != "" {
196-
displayNameClock, err := m.settings.GetSettingLastSynced(settings.DisplayName)
197-
if err != nil {
198-
m.logger.Warn("failed to get last synced clock for display name", zap.Error(err))
199-
return nil
200-
}
201-
// there is a race condition between display name and preferred name on updating m.account.Name, so we need to check the clock
202-
// there is also a similar check within SaveSyncDisplayName
203-
if displayNameClock < message.GetClock() {
204-
m.account.Name = message.GetValueString()
205-
err = m.multiAccounts.SaveAccount(*m.account)
206-
if err != nil {
207-
m.logger.Warn("[HandleBackedUpSettings] failed to save account", zap.Error(err))
208-
return nil
209-
}
210-
}
211-
}
212-
213-
if m.config.messengerSignalsHandler != nil {
214-
response := wakusync.WakuBackedUpDataResponse{
215-
Setting: settingField,
216-
}
217-
m.config.messengerSignalsHandler.SendWakuBackedUpSettings(&response)
218-
}
219-
}
220-
221-
return nil
222-
}
223-
224177
func syncInstallationCommunitiesSet(communities []*protobuf.SyncInstallationCommunity) map[string]*protobuf.SyncInstallationCommunity {
225178
ret := map[string]*protobuf.SyncInstallationCommunity{}
226179
for _, c := range communities {
@@ -250,6 +203,15 @@ func (m *Messenger) handleLocalBackupCommunities(state *ReceivedMessageState, co
250203
return errors
251204
}
252205

206+
func (m *Messenger) PublishSettingEvent(settingField *settings.SyncSettingField) {
207+
if m.config.messengerSignalsHandler != nil {
208+
response := wakusync.WakuBackedUpDataResponse{
209+
Setting: settingField,
210+
}
211+
m.config.messengerSignalsHandler.SendWakuBackedUpSettings(&response)
212+
}
213+
}
214+
253215
func (m *Messenger) requestCommunityKeysAndSharedAddresses(syncCommunity *protobuf.SyncInstallationCommunity) error {
254216
if !syncCommunity.Joined {
255217
return nil

protocol/messenger_config.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ type MessengerSignalsHandler interface {
5454
DiscordChannelImportProgress(importProgress *discord.ImportProgress)
5555
DiscordChannelImportFinished(communityID string, channelID string)
5656
DiscordChannelImportCancelled(channelID string)
57-
SendWakuFetchingBackupProgress(response *wakusync.WakuBackedUpDataResponse)
5857
SendWakuBackedUpProfile(response *wakusync.WakuBackedUpDataResponse)
5958
SendWakuBackedUpSettings(response *wakusync.WakuBackedUpDataResponse)
6059
SendWakuBackedUpKeypair(response *wakusync.WakuBackedUpDataResponse)

protocol/messenger_handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2538,7 +2538,7 @@ func (m *Messenger) HandleRequestAddressForTransaction(messageState *ReceivedMes
25382538
}
25392539

25402540
func (m *Messenger) HandleSyncSetting(messageState *ReceivedMessageState, message *protobuf.SyncSetting, statusMessage *messagingtypes.Message) error {
2541-
settingField, err := m.extractAndSaveSyncSetting(message)
2541+
settingField, err := syncing.ExtractAndSaveSyncSetting(m.settings, m.logger, message)
25422542
if err != nil {
25432543
return err
25442544
}

protocol/messenger_sync_settings.go

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ package protocol
22

33
import (
44
"context"
5-
"encoding/json"
65
errorsLib "errors"
76

87
"go.uber.org/zap"
98

109
gocommon "github.com/status-im/status-go/common"
1110
messagingtypes "github.com/status-im/status-go/messaging/types"
12-
"github.com/status-im/status-go/multiaccounts/errors"
1311
"github.com/status-im/status-go/multiaccounts/settings"
1412
"github.com/status-im/status-go/protocol/protobuf"
1513
)
@@ -83,46 +81,6 @@ func (m *Messenger) syncSettings(rawMessageHandler RawMessageHandler) error {
8381
return nil
8482
}
8583

86-
// extractSyncSetting parses incoming *protobuf.SyncSetting and stores the setting data if needed
87-
func (m *Messenger) extractAndSaveSyncSetting(syncSetting *protobuf.SyncSetting) (*settings.SyncSettingField, error) {
88-
sf, err := settings.GetFieldFromProtobufType(syncSetting.Type)
89-
if err != nil {
90-
m.logger.Error(
91-
"extractSyncSetting - settings.GetFieldFromProtobufType",
92-
zap.Error(err),
93-
zap.Any("syncSetting", syncSetting),
94-
)
95-
return nil, err
96-
}
97-
98-
spf := sf.SyncProtobufFactory()
99-
if spf == nil {
100-
m.logger.Warn("extractSyncSetting - received protobuf for setting with no SyncProtobufFactory", zap.Any("SettingField", sf))
101-
return nil, nil
102-
}
103-
if spf.Inactive() {
104-
m.logger.Warn("extractSyncSetting - received protobuf for inactive sync setting", zap.Any("SettingField", sf))
105-
return nil, nil
106-
}
107-
108-
value := spf.ExtractValueFromProtobuf()(syncSetting)
109-
110-
err = m.settings.SaveSyncSetting(sf, value, syncSetting.Clock)
111-
if err == errors.ErrNewClockOlderThanCurrent {
112-
m.logger.Info("extractSyncSetting - SaveSyncSetting :", zap.Error(err))
113-
return nil, nil
114-
}
115-
if err != nil {
116-
return nil, err
117-
}
118-
119-
if v, ok := value.([]byte); ok {
120-
value = json.RawMessage(v)
121-
}
122-
123-
return &settings.SyncSettingField{SettingField: sf, Value: value}, nil
124-
}
125-
12684
// startSyncSettingsLoop watches the m.settings.SyncQueue and sends a sync message in response to a settings update
12785
func (m *Messenger) startSyncSettingsLoop() {
12886
go func() {

protocol/messenger_testing_utils.go

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,10 @@ func WaitOnMessengerResponse(m *Messenger, condition func(*MessengerResponse) bo
5050
type MessengerSignalsHandlerMock struct {
5151
MessengerSignalsHandler
5252

53-
responseChan chan *MessengerResponse
54-
communityFoundChan chan *communities.Community
55-
wakuBackedUpDataResponseChan chan *wakusync.WakuBackedUpDataResponse
53+
responseChan chan *MessengerResponse
54+
communityFoundChan chan *communities.Community
5655
}
5756

58-
func (m *MessengerSignalsHandlerMock) SendWakuFetchingBackupProgress(response *wakusync.WakuBackedUpDataResponse) {
59-
m.wakuBackedUpDataResponseChan <- response
60-
}
6157
func (m *MessengerSignalsHandlerMock) SendWakuBackedUpProfile(*wakusync.WakuBackedUpDataResponse) {}
6258
func (m *MessengerSignalsHandlerMock) SendWakuBackedUpSettings(*wakusync.WakuBackedUpDataResponse) {}
6359
func (m *MessengerSignalsHandlerMock) SendWakuBackedUpKeypair(*wakusync.WakuBackedUpDataResponse) {}
@@ -93,42 +89,6 @@ func (m *MessengerSignalsHandlerMock) CommunityInfoFound(community *communities.
9389
}
9490
}
9591

96-
func WaitOnSignaledSendWakuFetchingBackupProgress(m *Messenger, condition func(*wakusync.WakuBackedUpDataResponse) bool, errorMessage string) (*wakusync.WakuBackedUpDataResponse, error) {
97-
interval := 500 * time.Millisecond
98-
timeoutChan := time.After(10 * time.Second)
99-
100-
if m.config.messengerSignalsHandler != nil {
101-
return nil, errors.New("messengerSignalsHandler already provided/mocked")
102-
}
103-
104-
responseChan := make(chan *wakusync.WakuBackedUpDataResponse, 1000)
105-
m.config.messengerSignalsHandler = &MessengerSignalsHandlerMock{
106-
wakuBackedUpDataResponseChan: responseChan,
107-
}
108-
109-
defer func() {
110-
m.config.messengerSignalsHandler = nil
111-
}()
112-
113-
for {
114-
_, err := m.RetrieveAll()
115-
if err != nil {
116-
return nil, err
117-
}
118-
119-
select {
120-
case r := <-responseChan:
121-
if condition(r) {
122-
return r, nil
123-
}
124-
case <-timeoutChan:
125-
return nil, errors.New("timed out: " + errorMessage)
126-
default: // No immediate response, rest & loop back to retrieve again
127-
time.Sleep(interval)
128-
}
129-
}
130-
}
131-
13292
func WaitOnSignaledMessengerResponse(m *Messenger, condition func(*MessengerResponse) bool, errorMessage string) (*MessengerResponse, error) {
13393
interval := 500 * time.Millisecond
13494
timeoutChan := time.After(10 * time.Second)

protocol/syncing/syncing.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
11
package syncing
22

33
import (
4+
"encoding/json"
45
"errors"
56

7+
"go.uber.org/zap"
8+
69
gethcommon "github.com/ethereum/go-ethereum/common"
710

811
accsmanagementtypes "github.com/status-im/status-go/accounts-management/types"
912
"github.com/status-im/status-go/crypto/types"
1013
"github.com/status-im/status-go/multiaccounts/accounts"
1114
multiaccountscommon "github.com/status-im/status-go/multiaccounts/common"
15+
maErrors "github.com/status-im/status-go/multiaccounts/errors"
16+
"github.com/status-im/status-go/multiaccounts/settings"
1217
"github.com/status-im/status-go/pkg/pubsub"
1318
"github.com/status-im/status-go/protocol/protobuf"
1419
"github.com/status-im/status-go/services/accounts/accountsevent"
1520
)
1621

22+
// TODO move this code out of the protocol package
23+
// https://github.com/status-im/status-go/pull/6967#discussion_r2391383496
24+
1725
var (
1826
ErrNotWatchOnlyAccount = errors.New("an account is not a watch only account")
1927
ErrTryingToStoreOldWalletAccount = errors.New("trying to store an old wallet account")
@@ -96,3 +104,43 @@ func HandleSyncWatchOnlyAccount(accountsDB *accounts.Database, message *protobuf
96104
}
97105
return acc, nil
98106
}
107+
108+
// extractSyncSetting parses incoming *protobuf.SyncSetting and stores the setting data if needed
109+
func ExtractAndSaveSyncSetting(accountsDB *accounts.Database, logger *zap.Logger, syncSetting *protobuf.SyncSetting) (*settings.SyncSettingField, error) {
110+
sf, err := settings.GetFieldFromProtobufType(syncSetting.Type)
111+
if err != nil {
112+
logger.Error(
113+
"extractSyncSetting - settings.GetFieldFromProtobufType",
114+
zap.Error(err),
115+
zap.Any("syncSetting", syncSetting),
116+
)
117+
return nil, err
118+
}
119+
120+
spf := sf.SyncProtobufFactory()
121+
if spf == nil {
122+
logger.Warn("extractSyncSetting - received protobuf for setting with no SyncProtobufFactory")
123+
return nil, nil
124+
}
125+
if spf.Inactive() {
126+
logger.Warn("extractSyncSetting - received protobuf for inactive sync setting")
127+
return nil, nil
128+
}
129+
130+
value := spf.ExtractValueFromProtobuf()(syncSetting)
131+
132+
err = accountsDB.SaveSyncSetting(sf, value, syncSetting.Clock)
133+
if err == maErrors.ErrNewClockOlderThanCurrent {
134+
logger.Info("extractSyncSetting - SaveSyncSetting :", zap.Error(err))
135+
return nil, nil
136+
}
137+
if err != nil {
138+
return nil, err
139+
}
140+
141+
if v, ok := value.([]byte); ok {
142+
value = json.RawMessage(v)
143+
}
144+
145+
return &settings.SyncSettingField{SettingField: sf, Value: value}, nil
146+
}

0 commit comments

Comments
 (0)