Skip to content

Commit d0bd732

Browse files
authored
fix(messages-search): ZMS-265: messages.js search, allow to search for only seen messages (#865)
1 parent aab6608 commit d0bd732

File tree

2 files changed

+28
-20
lines changed

2 files changed

+28
-20
lines changed

lib/api/messages.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,8 @@ module.exports = (db, server, messageHandler, userHandler, storageHandler, setti
647647
maxSize: Joi.number().empty('').description('Maximal message size in bytes'),
648648
attachments: booleanSchema.description('If true, then matches only messages with attachments'),
649649
flagged: booleanSchema.description('If true, then matches only messages with \\Flagged flags'),
650-
unseen: booleanSchema.description('If true, then matches only messages without \\Seen flags'),
650+
unseen: booleanSchema.description('If true, then matches only messages without \\Seen flags. Takes precedence over the seen flag'),
651+
seen: booleanSchema.description('If true, then matches only messages with \\Seen flags'),
651652
includeHeaders: Joi.string()
652653
.max(1024)
653654
.trim()

lib/prepare-search-filter.js

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,26 @@ const uidRangeStringToQuery = uidRange => {
4747
};
4848

4949
const prepareSearchFilter = async (db, user, payload) => {
50-
let mailbox = payload.mailbox ? new ObjectId(payload.mailbox) : false;
51-
let idQuery = uidRangeStringToQuery(payload.id);
52-
let thread = payload.thread ? new ObjectId(payload.thread) : false;
53-
54-
let orTerms = payload.or || {};
55-
let orQuery = [];
56-
57-
let query = payload.query;
58-
let datestart = payload.datestart || false;
59-
let dateend = payload.dateend || false;
60-
let filterFrom = payload.from;
61-
let filterTo = payload.to;
62-
let filterSubject = payload.subject;
63-
let filterAttachments = payload.attachments;
64-
let filterFlagged = payload.flagged;
65-
let filterUnseen = payload.unseen;
66-
let filterSearchable = payload.searchable;
67-
let filterMinSize = payload.minSize;
68-
let filterMaxSize = payload.maxSize;
50+
const mailbox = payload.mailbox ? new ObjectId(payload.mailbox) : false;
51+
const idQuery = uidRangeStringToQuery(payload.id);
52+
const thread = payload.thread ? new ObjectId(payload.thread) : false;
53+
54+
const orTerms = payload.or || {};
55+
const orQuery = [];
56+
57+
const query = payload.query;
58+
const datestart = payload.datestart || false;
59+
const dateend = payload.dateend || false;
60+
const filterFrom = payload.from;
61+
const filterTo = payload.to;
62+
const filterSubject = payload.subject;
63+
const filterAttachments = payload.attachments;
64+
const filterFlagged = payload.flagged;
65+
const filterUnseen = payload.unseen;
66+
const filterSeen = payload.seen;
67+
const filterSearchable = payload.searchable;
68+
const filterMinSize = payload.minSize;
69+
const filterMaxSize = payload.maxSize;
6970

7071
let userData;
7172
try {
@@ -144,6 +145,12 @@ const prepareSearchFilter = async (db, user, payload) => {
144145
filter.flagged = true;
145146
}
146147

148+
if (filterSeen) {
149+
filter.unseen = false;
150+
filter.searchable = true;
151+
}
152+
153+
// Unseen takes precedence over seen
147154
if (filterUnseen) {
148155
filter.unseen = true;
149156
filter.searchable = true;

0 commit comments

Comments
 (0)