mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-03-03 11:36:08 +08:00
Remove filtering from the collection APIs.
Affected collections were categories, contacts, files, messages, and threads.
This commit is contained in:
parent
e10e51ab5d
commit
0fe6343137
6 changed files with 29 additions and 250 deletions
|
@ -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
|
||||
)
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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) => {
|
||||
|
|
|
@ -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) => {
|
||||
|
|
|
@ -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));
|
||||
})
|
||||
})
|
||||
},
|
||||
|
|
|
@ -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));
|
||||
})
|
||||
})
|
||||
},
|
||||
|
|
Loading…
Reference in a new issue