@@ -70,27 +70,43 @@ func RenameMailboxWithRemoteID(ctx context.Context, tx *ent.Tx, mboxID imap.Labe
7070 return nil
7171}
7272
73- func DeleteMailboxWithRemoteID (ctx context.Context , tx * ent.Tx , mboxID imap.LabelID ) error {
74- // get uid validity
73+ // DeleteMailboxWithRemoteID deletes the mailbox with the given remote ID.
74+ // It returns the (potentially new) global UID validity, along with a bool indicating whether it has been increased.
75+ func DeleteMailboxWithRemoteID (ctx context.Context , tx * ent.Tx , mboxID imap.LabelID ) (imap.UID , bool , error ) {
7576 mbox , err := tx .Mailbox .Query ().
7677 Where (mailbox .RemoteID (mboxID )).
7778 Select (mailbox .FieldUIDValidity ).
7879 Only (ctx )
7980 if err != nil {
80- return err
81+ return 0 , false , err
8182 }
8283
83- if err := updateGlobalUIDValidity (ctx , tx , mbox .UIDValidity ); err != nil {
84- return err
84+ curUIDValidity , err := getGlobalUIDValidity (ctx , tx )
85+ if err != nil {
86+ return 0 , false , err
87+ }
88+
89+ var newUIDValidity imap.UID
90+
91+ if mbox .UIDValidity == curUIDValidity {
92+ newUIDValidity = curUIDValidity .Add (1 )
93+ } else {
94+ newUIDValidity = curUIDValidity
95+ }
96+
97+ if newUIDValidity > curUIDValidity {
98+ if err := setGlobalUIDValidity (ctx , tx , newUIDValidity ); err != nil {
99+ return 0 , false , err
100+ }
85101 }
86102
87103 if _ , err := tx .Mailbox .Delete ().
88104 Where (mailbox .RemoteID (mboxID )).
89105 Exec (ctx ); err != nil {
90- return err
106+ return 0 , false , err
91107 }
92108
93- return nil
109+ return newUIDValidity , newUIDValidity > curUIDValidity , nil
94110}
95111
96112func UpdateRemoteMailboxID (ctx context.Context , tx * ent.Tx , internalID imap.InternalMailboxID , remoteID imap.LabelID ) error {
@@ -303,42 +319,42 @@ func FilterMailboxContains(ctx context.Context, client *ent.Client, mboxID imap.
303319 return result , nil
304320}
305321
306- func getGlobalUIDValidity (ctx context.Context , tx * ent.Tx ) (imap.UID , error ) {
307- globalUIDValidity , err := tx .UIDValidity .Query ().
308- Select (uidvalidity .FieldUIDValidity ).
309- Only (ctx )
322+ func InitGlobalUIDValidity (ctx context.Context , tx * ent.Tx , uidValidity imap.UID ) error {
323+ curUIDValidity , err := tx .UIDValidity .Query ().Select (uidvalidity .FieldUIDValidity ).Only (ctx )
324+ if err != nil {
325+ if ! ent .IsNotFound (err ) {
326+ return fmt .Errorf ("failed to get current UID validity: %w" , err )
327+ }
310328
311- if ent .IsNotFound (err ) {
312- _ , err := tx .UIDValidity .Create ().
313- SetUIDValidity (mailbox .DefaultUIDValidity ).
314- Save (ctx )
315- if err != nil {
316- return 0 , err
329+ if _ , err := tx .UIDValidity .Create ().SetUIDValidity (uidValidity ).Save (ctx ); err != nil {
330+ return fmt .Errorf ("failed to create UID validity entry: %w" , err )
317331 }
318332
319- return mailbox . DefaultUIDValidity , nil
333+ return nil
320334 }
321335
322- if err != nil {
323- return 0 , err
336+ if uidValidity > curUIDValidity .UIDValidity {
337+ if err := setGlobalUIDValidity (ctx , tx , uidValidity ); err != nil {
338+ return fmt .Errorf ("failed to set UID validity: %w" , err )
339+ }
324340 }
325341
326- return globalUIDValidity . UIDValidity , nil
342+ return nil
327343}
328344
329- func updateGlobalUIDValidity (ctx context.Context , tx * ent.Tx , deletedUIDValidity imap.UID ) error {
330- globalUIDValidity , err := getGlobalUIDValidity ( ctx , tx )
345+ func getGlobalUIDValidity (ctx context.Context , tx * ent.Tx ) ( imap.UID , error ) {
346+ uidValidity , err := tx . UIDValidity . Query (). Select ( uidvalidity . FieldUIDValidity ). Only ( ctx )
331347 if err != nil {
332- return err
348+ return 0 , err
333349 }
334350
335- if deletedUIDValidity < globalUIDValidity {
336- return nil
337- }
351+ return uidValidity .UIDValidity , nil
352+ }
338353
339- _ , err = tx .UIDValidity .Update ().
340- SetUIDValidity (deletedUIDValidity .Add (1 )).
341- Save (ctx )
354+ func setGlobalUIDValidity (ctx context.Context , tx * ent.Tx , uidValidity imap.UID ) error {
355+ if _ , err := tx .UIDValidity .Update ().SetUIDValidity (uidValidity ).Save (ctx ); err != nil {
356+ return err
357+ }
342358
343- return err
359+ return nil
344360}
0 commit comments