Skip to content

Commit 2ebd96e

Browse files
authored
feat(BRIDGE-288): handle previously existing message in create events… (#423)
feat(BRIDGE-288): handle previously existing message in create events as updates
1 parent e1ad6b5 commit 2ebd96e

File tree

3 files changed

+52
-17
lines changed

3 files changed

+52
-17
lines changed

connector/dummy_simulate.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ func (conn *Dummy) MessageUpdated(message imap.Message, literal []byte, mboxIDs
163163
mboxIDs: mboxIDMap,
164164
}
165165

166-
conn.pushUpdate(imap.NewMessageUpdated(message, literal, mboxIDs, parsedMessage, false))
166+
conn.pushUpdate(imap.NewMessageUpdated(message, literal, mboxIDs, parsedMessage, false, false))
167167

168168
return nil
169169
}

imap/update_message_updated.go

+16-13
Original file line numberDiff line numberDiff line change
@@ -14,37 +14,40 @@ type MessageUpdated struct {
1414
updateBase
1515
*updateWaiter
1616

17-
Message Message
18-
Literal []byte
19-
MailboxIDs []MailboxID
20-
ParsedMessage *ParsedMessage
21-
AllowCreate bool
17+
Message Message
18+
Literal []byte
19+
MailboxIDs []MailboxID
20+
ParsedMessage *ParsedMessage
21+
AllowCreate bool
22+
IgnoreUnknownMailboxIDs bool
2223
}
2324

2425
func NewMessageUpdated(
2526
message Message,
2627
literal []byte,
2728
mailboxIDs []MailboxID,
2829
parsedMessage *ParsedMessage,
29-
allowCreate bool,
30+
allowCreate, ignoreUnkownMailboxIDs bool,
3031
) *MessageUpdated {
3132
return &MessageUpdated{
32-
updateWaiter: newUpdateWaiter(),
33-
Message: message,
34-
Literal: literal,
35-
MailboxIDs: mailboxIDs,
36-
ParsedMessage: parsedMessage,
37-
AllowCreate: allowCreate,
33+
updateWaiter: newUpdateWaiter(),
34+
Message: message,
35+
Literal: literal,
36+
MailboxIDs: mailboxIDs,
37+
ParsedMessage: parsedMessage,
38+
AllowCreate: allowCreate,
39+
IgnoreUnknownMailboxIDs: ignoreUnkownMailboxIDs,
3840
}
3941
}
4042

4143
func (u *MessageUpdated) String() string {
42-
return fmt.Sprintf("MessageUpdated: ID:%v Mailboxes:%v Flags:%s AllowCreate:%v",
44+
return fmt.Sprintf("MessageUpdated: ID:%v Mailboxes:%v Flags:%s AllowCreate:%v IgnoreUnkownMailboxIDs:%v",
4345
u.Message.ID.ShortID(),
4446
xslices.Map(u.MailboxIDs, func(mboxID MailboxID) string {
4547
return mboxID.ShortID()
4648
}),
4749
u.Message.Flags.ToSlice(),
4850
u.AllowCreate,
51+
u.IgnoreUnknownMailboxIDs,
4952
)
5053
}

internal/backend/connector_updates.go

+35-3
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@ func (user *user) applyMessagesCreated(ctx context.Context, update *imap.Message
204204
messageForMBox := make(map[imap.InternalMailboxID][]db.MessageIDPair)
205205
mboxInternalIDMap := make(map[imap.MailboxID]imap.InternalMailboxID)
206206

207+
// for existing messages - we fully update them
208+
var messagesToUpdate []*imap.MessageCreated
209+
207210
err := userDBWrite(ctx, user, func(ctx context.Context, tx db.Transaction) ([]state.Update, error) {
208211
for _, message := range update.Messages {
209212
if slices.Contains(message.MailboxIDs, ids.GluonInternalRecoveryMailboxRemoteID) {
@@ -213,7 +216,7 @@ func (user *user) applyMessagesCreated(ctx context.Context, update *imap.Message
213216

214217
internalID, ok := messagesToCreateFilter[message.Message.ID]
215218
if !ok {
216-
messageID, err := tx.GetMessageIDFromRemoteID(ctx, message.Message.ID)
219+
_, err := tx.GetMessageIDFromRemoteID(ctx, message.Message.ID)
217220
if db.IsErrNotFound(err) {
218221
internalID = imap.NewInternalMessageID()
219222

@@ -237,7 +240,10 @@ func (user *user) applyMessagesCreated(ctx context.Context, update *imap.Message
237240
messagesToCreate = append(messagesToCreate, request)
238241
messagesToCreateFilter[message.Message.ID] = internalID
239242
} else if err == nil {
240-
internalID = messageID
243+
user.log.WithField("MessageID", message.Message.ID.ShortID()).
244+
Info("Found existing message in create event, will update instead")
245+
messagesToUpdate = append(messagesToUpdate, message)
246+
continue
241247
} else {
242248
return nil, err
243249
}
@@ -339,9 +345,23 @@ func (user *user) applyMessagesCreated(ctx context.Context, update *imap.Message
339345
}
340346
}
341347
}
348+
return err
342349
}
343350

344-
return err
351+
for _, message := range messagesToUpdate {
352+
if err := user.applyMessageUpdated(ctx, imap.NewMessageUpdated(
353+
message.Message,
354+
message.Literal,
355+
message.MailboxIDs,
356+
message.ParsedMessage,
357+
false,
358+
update.IgnoreUnknownMailboxIDs,
359+
)); err != nil {
360+
return fmt.Errorf("failed to update previously existing message during creation: %v", err)
361+
}
362+
}
363+
364+
return nil
345365
}
346366

347367
// applyMessageMailboxesUpdated applies a MessageMailboxesUpdated update.
@@ -624,6 +644,12 @@ func (user *user) applyMessageUpdated(ctx context.Context, update *imap.MessageU
624644
for _, mbox := range update.MailboxIDs {
625645
internalMBoxID, err := tx.GetMailboxIDFromRemoteID(ctx, mbox)
626646
if err != nil {
647+
if update.IgnoreUnknownMailboxIDs {
648+
user.log.WithField("MailboxID", mbox.ShortID()).
649+
WithField("MessageID", update.Message.ID.ShortID()).
650+
Warn("Unknown Mailbox ID during message update, skipping add to mailbox")
651+
continue
652+
}
627653
return nil, err
628654
}
629655

@@ -702,6 +728,12 @@ func (user *user) applyMessageUpdated(ctx context.Context, update *imap.MessageU
702728
for _, mbox := range update.MailboxIDs {
703729
internalMBoxID, err := tx.GetMailboxIDFromRemoteID(ctx, mbox)
704730
if err != nil {
731+
if update.IgnoreUnknownMailboxIDs {
732+
user.log.WithField("MailboxID", mbox.ShortID()).
733+
WithField("MessageID", update.Message.ID.ShortID()).
734+
Warn("Unknown Mailbox ID during message update, skipping add to mailbox")
735+
continue
736+
}
705737
return nil, err
706738
}
707739

0 commit comments

Comments
 (0)