From 2e56d3ced43fbd6a999a3d444eeaded7a7f361b7 Mon Sep 17 00:00:00 2001 From: Halla Moore Date: Mon, 27 Jun 2016 12:30:28 -0700 Subject: [PATCH] Add timestamp queries to threads route --- packages/nylas-api/routes/threads.js | 43 ++++++++++++++++--- packages/nylas-core/models/account/thread.js | 3 ++ .../processors/threading.js | 19 ++++++-- 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/packages/nylas-api/routes/threads.js b/packages/nylas-api/routes/threads.js index 06f7197f9..67dffc401 100644 --- a/packages/nylas-api/routes/threads.js +++ b/packages/nylas-api/routes/threads.js @@ -11,9 +11,13 @@ module.exports = (server) => { tags: ['threads'], validate: { query: { + id: Joi.number().integer().min(0), unread: Joi.boolean(), starred: Joi.boolean(), - id: Joi.number().integer().min(0), + startedBefore: Joi.date().timestamp(), + startedAfter: Joi.date().timestamp(), + lastMessageBefore: Joi.date().timestamp(), + lastMessageAfter: Joi.date().timestamp(), }, }, response: { @@ -25,22 +29,47 @@ module.exports = (server) => { handler: (request, reply) => { request.getAccountDatabase().then((db) => { const {Thread} = db; + const query = request.query; const where = {}; - if (request.query.id) { - where.id = request.query.id; + if (query.id) { + where.id = query.id; } - if (request.query.unread) { + + // Boolean queries + if (query.unread) { where.unreadCount = {gt: 0}; - } else if (request.query.unread !== undefined) { + } else if (query.unread !== undefined) { where.unreadCount = 0; } - if (request.query.starred) { + if (query.starred) { where.starredCount = {gt: 0}; - } else if (request.query.starred !== undefined) { + } else if (query.starred !== undefined) { where.starredCount = 0; } + // Timestamp queries + if (query.lastMessageBefore) { + where.lastMessageReceivedTimestamp = {lt: query.lastMessageBefore}; + } + if (query.lastMessageAfter) { + if (where.lastMessageReceivedTimestamp) { + where.lastMessageReceivedTimestamp.gt = query.lastMessageAfter; + } else { + where.lastMessageReceivedTimestamp = {gt: query.lastMessageAfter}; + } + } + if (query.startedBefore) { + where.firstMessageTimestamp = {lt: query.startedBefore}; + } + if (query.startedAfter) { + if (where.firstMessageTimestamp) { + where.firstMessageTimestamp.gt = query.startedAfter; + } else { + where.firstMessageTimestamp = {gt: query.startedAfter}; + } + } + Thread.findAll({ where: where, limit: 50, diff --git a/packages/nylas-core/models/account/thread.js b/packages/nylas-core/models/account/thread.js index 2789347ca..dc055a751 100644 --- a/packages/nylas-core/models/account/thread.js +++ b/packages/nylas-core/models/account/thread.js @@ -5,6 +5,9 @@ module.exports = (sequelize, Sequelize) => { cleanedSubject: Sequelize.STRING, unreadCount: Sequelize.INTEGER, starredCount: Sequelize.INTEGER, + firstMessageTimestamp: Sequelize.DATE, + lastMessageTimestamp: Sequelize.DATE, + lastMessageReceivedTimestamp: Sequelize.DATE, }, { classMethods: { associate: ({Message}) => { diff --git a/packages/nylas-message-processor/processors/threading.js b/packages/nylas-message-processor/processors/threading.js index bb81f2f22..5cee5538b 100644 --- a/packages/nylas-message-processor/processors/threading.js +++ b/packages/nylas-message-processor/processors/threading.js @@ -127,6 +127,7 @@ function matchThread({db, accountId, message}) { return Thread.create({ subject: message.subject, cleanedSubject: cleanSubject(message.subject), + firstMessageTimestamp: message.date, unreadCount: 0, starredCount: 0, }) @@ -142,6 +143,7 @@ function matchThread({db, accountId, message}) { return Thread.create({ subject: message.subject, cleanedSubject: cleanSubject(message.subject), + firstMessageTimestamp: message.date, unreadCount: 0, starredCount: 0, }) @@ -155,10 +157,19 @@ function addMessageToThread({db, accountId, message}) { return Thread.find({where: {threadId: message.headers['X-GM-THRID']}}) } return matchThread({db, accountId, message}) - .then((thread) => (thread)) + .then((thread) => ({db, thread})) } -function updateThreadProperties({thread, message}) { +function updateThreadProperties({db, thread, message}) { + const {Category} = db; + Category.findById(message.CategoryId).then((category) => { + if (category.role !== 'sent') { + thread.lastMessageReceivedTimestamp = message.date; + thread.save(); + } + }) + thread.lastMessageTimestamp = message.date; + if (message.unread) { thread.unreadCount++; } @@ -172,10 +183,10 @@ function updateThreadProperties({thread, message}) { function processMessage({message, accountId}) { return DatabaseConnector.forAccount(accountId) .then((db) => addMessageToThread({db, accountId, message})) - .then((thread) => { + .then(({db, thread}) => { thread.addMessage(message) message.setThread(thread) - updateThreadProperties({thread, message}) + updateThreadProperties({db, thread, message}) return message }) }