Remove filtering from the collection APIs.

Affected collections were categories, contacts, files, messages, and threads.
This commit is contained in:
Halla Moore 2016-11-21 11:07:57 -08:00
parent e10e51ab5d
commit 0fe6343137
6 changed files with 29 additions and 250 deletions

View file

@ -1,5 +1,5 @@
const Serialization = require('./serialization');
const {PromiseUtils, PubsubConnector, MessageTypes} = require('nylas-core')
const {PubsubConnector, MessageTypes} = require('nylas-core')
module.exports = {
createSyncbackRequest: function createSyncbackRequest(request, reply, syncRequestArgs) {
@ -13,24 +13,4 @@ module.exports = {
})
})
},
findFolderOrLabel: function findFolderOrLabel({Folder, Label}, str) {
return PromiseUtils.props({
folder: Folder.find({
where: { $or: [
{ id: str },
{ name: str },
{ role: str },
]},
}),
label: Label.find({
where: { $or: [
{ id: str },
{ name: str },
{ role: str },
]},
}),
}).then(({folder, label}) =>
folder || label || null
)
},
}

View file

@ -17,7 +17,6 @@ module.exports = (server) => {
query: {
limit: Joi.number().integer().min(1).max(2000).default(100),
offset: Joi.number().integer().min(0).default(0),
view: Joi.string().valid('expanded', 'count'),
},
},
response: {

View file

@ -11,9 +11,6 @@ module.exports = (server) => {
tags: ['contacts'],
validate: {
query: {
name: Joi.string(),
email: Joi.string().email(),
view: Joi.string().valid('expanded', 'count'),
limit: Joi.number().integer().min(1).max(2000).default(100),
offset: Joi.number().integer().min(0).default(0),
},
@ -27,18 +24,7 @@ module.exports = (server) => {
handler: (request, reply) => {
request.getAccountDatabase().then((db) => {
const {Contact} = db;
const query = request.query;
const where = {};
if (query.name) {
where.name = {like: query.name};
}
if (query.email) {
where.email = query.email;
}
Contact.findAll({
where: where,
limit: request.query.limit,
offset: request.query.offset,
}).then((contacts) => {

View file

@ -12,9 +12,6 @@ module.exports = (server) => {
tags: ['files'],
validate: {
query: {
filename: Joi.string(),
message_id: Joi.number().integer().min(0),
content_type: Joi.string(),
limit: Joi.number().integer().min(1).max(2000).default(100),
offset: Joi.number().integer().min(0).default(0),
},
@ -28,21 +25,7 @@ module.exports = (server) => {
handler: (request, reply) => {
request.getAccountDatabase().then((db) => {
const {File} = db;
const query = request.query;
const where = {};
if (query.filename) {
where.filename = query.filename;
}
if (query.message_id) {
where.messageId = query.message_id;
}
if (query.content_type) {
where.contentType = query.content_type;
}
File.findAll({
where: where,
limit: request.query.limit,
offset: request.query.offset,
}).then((files) => {

View file

@ -1,6 +1,6 @@
const Joi = require('joi');
const Serialization = require('../serialization');
const {createSyncbackRequest, findFolderOrLabel} = require('../route-helpers');
const {createSyncbackRequest} = require('../route-helpers');
module.exports = (server) => {
@ -13,17 +13,8 @@ module.exports = (server) => {
tags: ['messages'],
validate: {
query: {
'unread': Joi.boolean(),
'starred': Joi.boolean(),
'subject': Joi.string(),
'thread_id': Joi.number().integer().min(0),
'received_before': Joi.date(),
'received_after': Joi.date(),
'filename': Joi.string(),
'in': Joi.string(),
'limit': Joi.number().integer().min(1).max(2000).default(100),
'offset': Joi.number().integer().min(0).default(0),
'view': Joi.string().valid('expanded', 'count'),
limit: Joi.number().integer().min(1).max(2000).default(100),
offset: Joi.number().integer().min(0).default(0),
},
},
response: {
@ -34,60 +25,13 @@ module.exports = (server) => {
},
handler: (request, reply) => {
request.getAccountDatabase().then((db) => {
const {Message, Folder, Label, File} = db;
const query = request.query;
const where = {};
const include = [];
if (query.unread != null) {
where.unread = query.unread;
}
if (query.starred != null) {
where.starred = query.starred;
}
if (query.subject) {
where.subject = query.subject;
}
if (query.thread_id != null) {
where.threadId = query.thread_id;
}
if (query.received_before) {
where.date = {lt: query.received_before};
}
if (query.received_after) {
if (where.date) {
where.date.gt = query.received_after;
} else {
where.date = {gt: query.received_after};
}
}
if (query.filename) {
include.push({
model: File,
where: {filename: query.filename},
})
}
let loadAssociatedModels = Promise.resolve();
if (query.in) {
loadAssociatedModels = findFolderOrLabel({Folder, Label}, query.in)
.then((container) => {
include.push({
model: container.Model,
where: {id: container.id},
})
})
}
loadAssociatedModels.then(() => {
Message.findAll({
where: where,
limit: query.limit,
offset: query.offset,
include: include,
}).then((messages) => {
reply(Serialization.jsonStringify(messages));
})
const {Message, Folder, Label} = db;
Message.findAll({
limit: request.query.limit,
offset: request.query.offset,
include: [{model: Folder}, {model: Label}],
}).then((messages) => {
reply(Serialization.jsonStringify(messages));
})
})
},

View file

@ -1,7 +1,7 @@
const Joi = require('joi');
const _ = require('underscore');
const Serialization = require('../serialization');
const {createSyncbackRequest, findFolderOrLabel} = require('../route-helpers')
const {createSyncbackRequest} = require('../route-helpers')
module.exports = (server) => {
server.route({
@ -13,19 +13,8 @@ module.exports = (server) => {
tags: ['threads'],
validate: {
query: {
'id': Joi.number().integer().min(0),
'view': Joi.string().valid('expanded', 'count'),
'subject': Joi.string(),
'unread': Joi.boolean(),
'starred': Joi.boolean(),
'started_before': Joi.date().timestamp(),
'started_after': Joi.date().timestamp(),
'last_message_before': Joi.date().timestamp(),
'last_message_after': Joi.date().timestamp(),
'in': Joi.string().allow(Joi.number()),
'filename': Joi.string(),
'limit': Joi.number().integer().min(1).max(2000).default(100),
'offset': Joi.number().integer().min(0).default(0),
limit: Joi.number().integer().min(1).max(2000).default(100),
offset: Joi.number().integer().min(0).default(0),
},
},
response: {
@ -41,123 +30,21 @@ module.exports = (server) => {
},
handler: (request, reply) => {
request.getAccountDatabase().then((db) => {
const {Thread, Folder, Label, Message, File} = db;
const query = request.query;
const where = {};
const include = [];
if (query.id) {
where.id = query.id;
}
if (query.subject) {
// the 'like' operator is case-insenstive in sequelite and for
// non-binary strings in mysql
where.subject = {like: query.subject};
}
// Boolean queries
if (query.unread) {
where.unreadCount = {gt: 0};
} else if (query.unread !== undefined) {
where.unreadCount = 0;
}
if (query.starred) {
where.starredCount = {gt: 0};
} else if (query.starred !== undefined) {
where.starredCount = 0;
}
// Timestamp queries
if (query.last_message_before) {
where.lastMessageReceivedDate = {lt: query.last_message_before};
}
if (query.last_message_after) {
if (where.lastMessageReceivedDate) {
where.lastMessageReceivedDate.gt = query.last_message_after;
} else {
where.lastMessageReceivedDate = {gt: query.last_message_after};
}
}
if (query.started_before) {
where.firstMessageDate = {lt: query.started_before};
}
if (query.started_after) {
if (where.firstMessageDate) {
where.firstMessageDate.gt = query.started_after;
} else {
where.firstMessageDate = {gt: query.started_after};
}
}
// Association queries
let loadAssociatedModels = Promise.resolve();
if (query.in) {
loadAssociatedModels = findFolderOrLabel({Folder, Label}, query.in)
.then((container) => {
include.push({
model: container.Model,
where: {id: container.id},
})
include.push({model: container.Model === Folder ? Label : Folder})
})
} else {
include.push({model: Folder})
include.push({model: Label})
}
const messagesInclude = [];
if (query.filename) {
messagesInclude.push({
model: File,
where: {filename: query.filename},
})
}
if (query.view === 'expanded') {
include.push({
model: Message,
as: 'messages',
attributes: _.without(Object.keys(Message.attributes), 'body'),
include: messagesInclude,
})
} else {
include.push({
model: Message,
as: 'messages',
attributes: ['id'],
include: messagesInclude,
})
}
if (query.view === 'count') {
loadAssociatedModels.then(() => {
return Thread.count({
where: where,
include: include,
}).then((count) => {
reply(Serialization.jsonStringify({count: count}));
});
})
return;
}
loadAssociatedModels.then(() => {
Thread.findAll({
limit: request.query.limit,
offset: request.query.offset,
where: where,
include: include,
}).then((threads) => {
// if the user requested the expanded viw, fill message.folder using
// thread.folders, since it must be a superset.
if (query.view === 'expanded') {
for (const thread of threads) {
for (const msg of thread.messages) {
msg.folder = thread.folders.find(c => c.id === msg.folderId);
}
}
}
reply(Serialization.jsonStringify(threads));
})
const {Thread, Folder, Label, Message} = db;
Thread.findAll({
limit: request.query.limit,
offset: request.query.offset,
include: [
{model: Folder},
{model: Label},
{
model: Message,
as: 'messages',
attributes: _.without(Object.keys(Message.attributes), 'body'),
},
],
}).then((threads) => {
reply(Serialization.jsonStringify(threads));
})
})
},