diff --git a/lib/api/messages.js b/lib/api/messages.js index 8b38eb97..ba3af107 100644 --- a/lib/api/messages.js +++ b/lib/api/messages.js @@ -16,11 +16,11 @@ module.exports = (db, server, messageHandler) => { const schema = Joi.object().keys({ user: Joi.string().hex().lowercase().length(24).required(), mailbox: Joi.string().hex().lowercase().length(24).required(), - limit: Joi.number().default(20).min(1).max(250), - order: Joi.any().allow(['asc', 'desc']).default('desc'), - next: Joi.string().alphanum().max(100), - prev: Joi.string().alphanum().max(100), - page: Joi.number().default(1) + limit: Joi.number().empty('').default(20).min(1).max(250), + order: Joi.any().empty('').allow(['asc', 'desc']).default('desc'), + next: Joi.string().empty('').alphanum().max(100), + previous: Joi.string().empty('').alphanum().max(100), + page: Joi.number().empty('').default(1) }); req.query.user = req.params.user; @@ -44,7 +44,7 @@ module.exports = (db, server, messageHandler) => { let limit = result.value.limit; let page = result.value.page; let pageNext = result.value.next; - let pagePrev = result.value.prev; + let pagePrevious = result.value.previous; let sortAscending = result.value.order === 'asc'; db.database.collection('mailboxes').findOne({ @@ -106,8 +106,8 @@ module.exports = (db, server, messageHandler) => { if (pageNext) { opts.next = pageNext; - } else if (pagePrev) { - opts.prev = pagePrev; + } else if (pagePrevious) { + opts.previous = pagePrevious; } MongoPaging.find(db.users.collection('messages'), opts, (err, result) => { @@ -142,7 +142,9 @@ module.exports = (db, server, messageHandler) => { total, page, prev: prevUrl, + previousCursor: result.hasPrevious ? result.previous : false, next: nextUrl, + nextCursor: result.hasNext ? result.next : false, specialUse: mailboxData.specialUse, results: (result.results || []).map(messageData => { let parsedHeader = (messageData.mimeTree && messageData.mimeTree.parsedHeader) || {}; @@ -351,13 +353,18 @@ module.exports = (db, server, messageHandler) => { user: Joi.string().hex().lowercase().length(24).required(), mailbox: Joi.string().hex().lowercase().length(24).required(), message: Joi.number().min(1).required(), - replaceCidLinks: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).default(false) + replaceCidLinks: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).default(false), + markAsSeen: Joi.boolean().truthy(['Y', 'true', 'yes', 1]).default(false) }); if (req.query.replaceCidLinks) { req.params.replaceCidLinks = req.query.replaceCidLinks; } + if (req.query.markAsSeen) { + req.params.markAsSeen = req.query.markAsSeen; + } + const result = Joi.validate(req.params, schema, { abortEarly: false, convert: true @@ -474,30 +481,49 @@ module.exports = (db, server, messageHandler) => { ); } - res.json({ - success: true, - id: message, - from: from[0], - replyTo, - to, - cc, - subject: messageData.subject, - messageId: messageData.msgid, - date: messageData.hdate.toISOString(), - list, - expires, - seen: !messageData.unseen, - deleted: !messageData.undeleted, - flagged: messageData.flagged, - draft: messageData.draft, - html: messageData.html, - attachments: (messageData.attachments || []).map(attachment => { - attachment.url = server.router.render('attachment', { user, mailbox, message, attachment: attachment.id }); - return attachment; - }), - raw: server.router.render('attachment', { user, mailbox, message }) + let ensureSeen = done => { + if (!result.value.markAsSeen || !messageData.unseen) { + return done(); + } + // we need to mark this message as seen + return messageHandler.update(user, mailbox, message, { seen: true }, err => { + if (err) { + res.json({ + error: err.message + }); + return next(); + } + messageData.unseen = false; + done(); + }); + }; + + ensureSeen(() => { + res.json({ + success: true, + id: message, + from: from[0], + replyTo, + to, + cc, + subject: messageData.subject, + messageId: messageData.msgid, + date: messageData.hdate.toISOString(), + list, + expires, + seen: !messageData.unseen, + deleted: !messageData.undeleted, + flagged: messageData.flagged, + draft: messageData.draft, + html: messageData.html, + attachments: (messageData.attachments || []).map(attachment => { + attachment.url = server.router.render('attachment', { user, mailbox, message, attachment: attachment.id }); + return attachment; + }), + raw: server.router.render('raw', { user, mailbox, message }) + }); + return next(); }); - return next(); }); }); diff --git a/lib/message-handler.js b/lib/message-handler.js index 6383b374..27df7e83 100644 --- a/lib/message-handler.js +++ b/lib/message-handler.js @@ -1141,7 +1141,7 @@ class MessageHandler { uid: messageData.uid, flags: messageData.flags, message: messageData._id, - unseenChange: !!changes.unseen + unseenChange: !!changes.seen }); if (notifyEntries.length >= consts.BULK_BATCH_SIZE) {