diff options
author | 2023-08-07 15:43:29 +0300 | |
---|---|---|
committer | 2023-08-09 23:17:24 +0200 | |
commit | 652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77 (patch) | |
tree | 8c9a7accfa76b1661c60a3a039519f24a4738a90 | |
parent | eecda9c0245b4c9af476624451dce24c38d6b96f (diff) | |
download | alps-652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77.tar.gz alps-652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77.tar.bz2 alps-652ea9c7885a6c508d3c69c37b7c65e5bbe4fe77.zip |
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.
-rw-r--r-- | plugins/base/imap.go | 26 |
1 files changed, 21 insertions, 5 deletions
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 |