mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-10 04:36:43 +00:00
feat(GODT-2829): Integrate new sync service
Update imap service to use the new sync service. The new sync state is stored as simple file on disk to avoid contention with concurrent vault writes.
This commit is contained in:
@ -138,7 +138,10 @@ func (apm DiagnosticMetadata) BuildMailboxToMessageMap(ctx context.Context, user
|
||||
}
|
||||
|
||||
func (user *User) GetDiagnosticMetadata(ctx context.Context) (DiagnosticMetadata, error) {
|
||||
failedMessages := xmaps.SetFromSlice(user.vault.SyncStatus().FailedMessageIDs)
|
||||
failedMessages, err := user.imapService.GetSyncFailedMessageIDs(ctx)
|
||||
if err != nil {
|
||||
return DiagnosticMetadata{}, err
|
||||
}
|
||||
|
||||
messageIDs, err := user.client.GetAllMessageIDs(ctx, "")
|
||||
if err != nil {
|
||||
@ -159,7 +162,7 @@ func (user *User) GetDiagnosticMetadata(ctx context.Context) (DiagnosticMetadata
|
||||
return DiagnosticMetadata{
|
||||
MessageIDs: messageIDs,
|
||||
Metadata: meta,
|
||||
FailedMessageIDs: failedMessages,
|
||||
FailedMessageIDs: xmaps.SetFromSlice(failedMessages),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
@ -34,6 +34,7 @@ import (
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/services/orderedtasks"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/services/sendrecorder"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/services/smtp"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/services/syncservice"
|
||||
telemetryservice "github.com/ProtonMail/proton-bridge/v3/internal/services/telemetry"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/services/userevents"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/services/useridentity"
|
||||
@ -102,6 +103,8 @@ func New(
|
||||
imapServerManager imapservice.IMAPServerManager,
|
||||
smtpServerManager smtp.ServerManager,
|
||||
eventSubscription events.Subscription,
|
||||
syncService syncservice.Regulator,
|
||||
syncConfigDir string,
|
||||
) (*User, error) {
|
||||
user, err := newImpl(
|
||||
ctx,
|
||||
@ -117,6 +120,8 @@ func New(
|
||||
imapServerManager,
|
||||
smtpServerManager,
|
||||
eventSubscription,
|
||||
syncService,
|
||||
syncConfigDir,
|
||||
)
|
||||
if err != nil {
|
||||
// Cleanup any pending resources on error
|
||||
@ -145,9 +150,27 @@ func newImpl(
|
||||
imapServerManager imapservice.IMAPServerManager,
|
||||
smtpServerManager smtp.ServerManager,
|
||||
eventSubscription events.Subscription,
|
||||
syncService syncservice.Regulator,
|
||||
syncConfigDir string,
|
||||
) (*User, error) {
|
||||
logrus.WithField("userID", apiUser.ID).Info("Creating new user")
|
||||
|
||||
// Migrate Sync Status from Vault.
|
||||
{
|
||||
syncStatus := encVault.SyncStatus()
|
||||
|
||||
migrated, err := imapservice.MigrateVaultSettings(syncConfigDir, apiUser.ID, syncStatus.HasLabels, syncStatus.HasMessages, syncStatus.FailedMessageIDs)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to migrate user sync settings: %w", err)
|
||||
}
|
||||
|
||||
if migrated {
|
||||
if err := encVault.ClearSyncStatus(); err != nil {
|
||||
return nil, fmt.Errorf("failed to clear sync settings from vault: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get the user's API addresses.
|
||||
apiAddrs, err := client.GetAddresses(ctx)
|
||||
if err != nil {
|
||||
@ -238,7 +261,6 @@ func newImpl(
|
||||
client,
|
||||
identityState.Clone(),
|
||||
user,
|
||||
encVault,
|
||||
user.eventService,
|
||||
imapServerManager,
|
||||
user,
|
||||
@ -250,6 +272,7 @@ func newImpl(
|
||||
reporter,
|
||||
addressMode,
|
||||
eventSubscription,
|
||||
syncConfigDir,
|
||||
user.maxSyncMemory,
|
||||
showAllMail,
|
||||
)
|
||||
@ -299,7 +322,7 @@ func newImpl(
|
||||
}
|
||||
|
||||
// Start IMAP Service
|
||||
if err := user.imapService.Start(ctx, user.serviceGroup); err != nil {
|
||||
if err := user.imapService.Start(ctx, user.serviceGroup, syncService); err != nil {
|
||||
return user, fmt.Errorf("failed to start imap service: %w", err)
|
||||
}
|
||||
|
||||
|
||||
@ -156,6 +156,8 @@ func withUser(tb testing.TB, ctx context.Context, _ *server.Server, m *proton.Ma
|
||||
nullIMAPServerManager,
|
||||
nullSMTPServerManager,
|
||||
nullEventSubscription,
|
||||
nil,
|
||||
"",
|
||||
)
|
||||
require.NoError(tb, err)
|
||||
defer user.Close()
|
||||
|
||||
Reference in New Issue
Block a user