From 652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77 Mon Sep 17 00:00:00 2001 From: Konstantinos Koukas Date: Mon, 7 Aug 2023 15:43:29 +0300 Subject: plugins/base: sort search results by date Implement server-side sorting of search results using the SORT extension to IMAP, if the server supports it. Otherwise, fall back to the unordered SEARCH command. Sort messages by sent date, in descending order. --- plugins/base/imap.go | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'plugins/base') diff --git a/plugins/base/imap.go b/plugins/base/imap.go index 8ea88e9..c71f0d3 100644 --- a/plugins/base/imap.go +++ b/plugins/base/imap.go @@ -471,12 +471,28 @@ func searchMessages(conn *imapclient.Client, mboxName, query string, page, messa return nil, 0, err } - criteria := PrepareSearch(query) - data, err := conn.Search(criteria, nil).Wait() - if err != nil { - return nil, 0, fmt.Errorf("UID SEARCH failed: %v", err) + searchCriteria := PrepareSearch(query) + + var nums []uint32 + if !conn.Caps().Has(imap.CapSort) { + data, err := conn.Search(searchCriteria, nil).Wait() + if err != nil { + return nil, 0, fmt.Errorf("SEARCH failed: %v", err) + } + nums = data.AllNums() + } else { + sortOptions := &imapclient.SortOptions{ + SearchCriteria: searchCriteria, + SortCriteria: []imapclient.SortCriterion{ + {Key: imapclient.SortKeyDate, Reverse: true}, + }, + } + nums, err = conn.Sort(sortOptions).Wait() + if err != nil { + return nil, 0, fmt.Errorf("SORT failed: %v", err) + } } - nums := data.AllNums() + total = len(nums) from := page * messagesPerPage -- cgit v1.2.3-59-g8ed1b