Add timestamp queries to threads route

This commit is contained in:
Halla Moore 2016-06-27 12:30:28 -07:00
parent ab4c8cf32c
commit 2e56d3ced4
3 changed files with 54 additions and 11 deletions

View file

@ -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,

View file

@ -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}) => {

View file

@ -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
})
}