diff --git a/internal/bridge/user_events.go b/internal/bridge/user_events.go index fd5214f6..16253642 100644 --- a/internal/bridge/user_events.go +++ b/internal/bridge/user_events.go @@ -56,19 +56,7 @@ func (bridge *Bridge) handleUserEvent(ctx context.Context, user *user.User, even } func (bridge *Bridge) handleUserAddressCreated(ctx context.Context, user *user.User, event events.UserAddressCreated) error { - switch user.GetAddressMode() { - case vault.CombinedMode: - for addrID, gluonID := range user.GetGluonIDs() { - if err := bridge.imapServer.RemoveUser(ctx, gluonID, false); err != nil { - return fmt.Errorf("failed to remove user from IMAP server: %w", err) - } - - if err := bridge.imapServer.LoadUser(ctx, user.NewIMAPConnector(addrID), gluonID, user.GluonKey()); err != nil { - return fmt.Errorf("failed to add user to IMAP server: %w", err) - } - } - - case vault.SplitMode: + if user.GetAddressMode() == vault.SplitMode { gluonID, err := bridge.imapServer.AddUser(ctx, user.NewIMAPConnector(event.AddressID), user.GluonKey()) if err != nil { return fmt.Errorf("failed to add user to IMAP server: %w", err) @@ -96,19 +84,7 @@ func (bridge *Bridge) handleUserAddressUpdated(_ context.Context, user *user.Use } func (bridge *Bridge) handleUserAddressDeleted(ctx context.Context, user *user.User, event events.UserAddressDeleted) error { - switch user.GetAddressMode() { - case vault.CombinedMode: - for addrID, gluonID := range user.GetGluonIDs() { - if err := bridge.imapServer.RemoveUser(ctx, gluonID, false); err != nil { - return fmt.Errorf("failed to remove user from IMAP server: %w", err) - } - - if err := bridge.imapServer.LoadUser(ctx, user.NewIMAPConnector(addrID), gluonID, user.GluonKey()); err != nil { - return fmt.Errorf("failed to add user to IMAP server: %w", err) - } - } - - case vault.SplitMode: + if user.GetAddressMode() == vault.SplitMode { gluonID, ok := user.GetGluonID(event.AddressID) if !ok { return fmt.Errorf("gluon ID not found for address %s", event.AddressID) diff --git a/internal/user/events.go b/internal/user/events.go index 6d652f2a..59c90f0c 100644 --- a/internal/user/events.go +++ b/internal/user/events.go @@ -99,7 +99,7 @@ func (user *User) handleAddressEvents(ctx context.Context, addressEvents []litea } func (user *User) handleCreateAddressEvent(ctx context.Context, event liteapi.AddressEvent) error { - return safe.LockRet(func() error { + if err := safe.LockRet(func() error { if _, ok := user.apiAddrs[event.Address.ID]; ok { return fmt.Errorf("address %q already exists", event.ID) } @@ -119,18 +119,24 @@ func (user *User) handleCreateAddressEvent(ctx context.Context, event liteapi.Ad user.updateCh[event.Address.ID] = queue.NewQueuedChannel[imap.Update](0, 0) } + return nil + }, user.apiAddrsLock, user.updateChLock); err != nil { + return fmt.Errorf("failed to handle create address event: %w", err) + } + + user.eventCh.Enqueue(events.UserAddressCreated{ + UserID: user.ID(), + AddressID: event.Address.ID, + Email: event.Address.Email, + }) + + return safe.RLockRet(func() error { if user.vault.AddressMode() == vault.SplitMode { if err := syncLabels(ctx, user.client, user.updateCh[event.Address.ID]); err != nil { return fmt.Errorf("failed to sync labels to new address: %w", err) } } - user.eventCh.Enqueue(events.UserAddressCreated{ - UserID: user.ID(), - AddressID: event.Address.ID, - Email: event.Address.Email, - }) - return nil }, user.apiAddrsLock, user.updateChLock) }