@@ -55,7 +55,7 @@ func CreateMessages(ctx context.Context, tx *ent.Tx, reqs ...*CreateMessageReq)
5555 })... ).Save (ctx )
5656}
5757
58- func AddMessagesToMailbox (ctx context.Context , tx * ent.Tx , messageIDs []imap.InternalMessageID , mboxID imap.InternalMailboxID ) (map [imap.InternalMessageID ]int , error ) {
58+ func AddMessagesToMailbox (ctx context.Context , tx * ent.Tx , messageIDs []imap.InternalMessageID , mboxID imap.InternalMailboxID ) (map [imap.InternalMessageID ]* ent. UID , error ) {
5959 messageUIDs := make (map [imap.InternalMessageID ]int )
6060
6161 mbox , err := tx .Mailbox .Query ().Where (mailbox .MailboxID (mboxID )).Only (ctx )
@@ -88,10 +88,10 @@ func AddMessagesToMailbox(ctx context.Context, tx *ent.Tx, messageIDs []imap.Int
8888 return nil , err
8989 }
9090
91- return messageUIDs , nil
91+ return GetMessageUIDsWithFlags ( ctx , tx . Client (), mboxID , messageIDs )
9292}
9393
94- func BumpMailboxUIDsForMessage (ctx context.Context , tx * ent.Tx , messageIDs []imap.InternalMessageID , mboxID imap.InternalMailboxID ) (map [imap.InternalMessageID ]int , error ) {
94+ func BumpMailboxUIDsForMessage (ctx context.Context , tx * ent.Tx , messageIDs []imap.InternalMessageID , mboxID imap.InternalMailboxID ) (map [imap.InternalMessageID ]* ent. UID , error ) {
9595 messageUIDs := make (map [imap.InternalMessageID ]int )
9696
9797 mbox , err := tx .Mailbox .Query ().Where (mailbox .MailboxID (mboxID )).Only (ctx )
@@ -121,7 +121,7 @@ func BumpMailboxUIDsForMessage(ctx context.Context, tx *ent.Tx, messageIDs []ima
121121 return nil , err
122122 }
123123
124- return messageUIDs , nil
124+ return GetMessageUIDsWithFlags ( ctx , tx . Client (), mboxID , messageIDs )
125125}
126126
127127func RemoveMessagesFromMailbox (ctx context.Context , tx * ent.Tx , messageIDs []imap.InternalMessageID , mboxID imap.InternalMailboxID ) error {
@@ -207,6 +207,7 @@ func GetMessageUIDs(ctx context.Context, client *ent.Client, mboxID imap.Interna
207207 ).
208208 WithMessage (func (query * ent.MessageQuery ) {
209209 query .Select (message .FieldMessageID )
210+ query .Select (message .FieldRemoteID )
210211 }).
211212 All (ctx )
212213 if err != nil {
@@ -222,6 +223,32 @@ func GetMessageUIDs(ctx context.Context, client *ent.Client, mboxID imap.Interna
222223 return res , nil
223224}
224225
226+ func GetMessageUIDsWithFlags (ctx context.Context , client * ent.Client , mboxID imap.InternalMailboxID , messageIDs []imap.InternalMessageID ) (map [imap.InternalMessageID ]* ent.UID , error ) {
227+ messageUIDs , err := client .UID .Query ().
228+ Where (
229+ uid .HasMailboxWith (mailbox .MailboxID (mboxID )),
230+ uid .HasMessageWith (message .MessageIDIn (messageIDs ... )),
231+ ).
232+ WithMessage (func (query * ent.MessageQuery ) {
233+ query .Select (message .FieldMessageID , message .FieldRemoteID )
234+ query .WithFlags (func (query * ent.MessageFlagQuery ) {
235+ query .Select (messageflag .FieldValue )
236+ })
237+ }).
238+ All (ctx )
239+ if err != nil {
240+ return nil , err
241+ }
242+
243+ res := make (map [imap.InternalMessageID ]* ent.UID )
244+
245+ for _ , messageUID := range messageUIDs {
246+ res [messageUID .Edges .Message .MessageID ] = messageUID
247+ }
248+
249+ return res , nil
250+ }
251+
225252// GetMessageFlags returns the flags of the given messages.
226253// It does not include per-mailbox flags (\Deleted, \Recent)!
227254func GetMessageFlags (ctx context.Context , client * ent.Client , messageIDs []imap.InternalMessageID ) (map [imap.InternalMessageID ]imap.FlagSet , error ) {
@@ -467,3 +494,19 @@ func GetMessageIDFromRemoteID(ctx context.Context, client *ent.Client, id imap.M
467494
468495 return message .MessageID , nil
469496}
497+
498+ func NewFlagSet (msgUID * ent.UID , flags []* ent.MessageFlag ) imap.FlagSet {
499+ flagSet := imap .NewFlagSetFromSlice (xslices .Map (flags , func (flag * ent.MessageFlag ) string {
500+ return flag .Value
501+ }))
502+
503+ if msgUID .Deleted {
504+ flagSet = flagSet .Add (imap .FlagDeleted )
505+ }
506+
507+ if msgUID .Recent {
508+ flagSet = flagSet .Add (imap .FlagRecent )
509+ }
510+
511+ return flagSet
512+ }
0 commit comments