From fd7570f6c8fbea2803b34b5ba1699a273cb8ad1e Mon Sep 17 00:00:00 2001 From: Halla Moore Date: Wed, 29 Jun 2016 18:52:58 -0700 Subject: [PATCH] Add various syncback tasks for messages --- packages/nylas-api/routes/messages.js | 63 +++++++++++++++++++ packages/nylas-sync/syncback-task-factory.js | 10 +++ .../mark-message-as-read.imap.js | 18 ++++++ .../mark-message-as-unread.imap.js | 18 ++++++ .../move-message-to-folder.imap.js | 21 +++++++ .../syncback_tasks/star-message.imap.js | 18 ++++++ .../nylas-sync/syncback_tasks/task-helpers.js | 10 +++ .../syncback_tasks/unstar-message.imap.js | 18 ++++++ 8 files changed, 176 insertions(+) create mode 100644 packages/nylas-sync/syncback_tasks/mark-message-as-read.imap.js create mode 100644 packages/nylas-sync/syncback_tasks/mark-message-as-unread.imap.js create mode 100644 packages/nylas-sync/syncback_tasks/move-message-to-folder.imap.js create mode 100644 packages/nylas-sync/syncback_tasks/star-message.imap.js create mode 100644 packages/nylas-sync/syncback_tasks/unstar-message.imap.js diff --git a/packages/nylas-api/routes/messages.js b/packages/nylas-api/routes/messages.js index 06cdd6fee..e4fb5aaf1 100644 --- a/packages/nylas-api/routes/messages.js +++ b/packages/nylas-api/routes/messages.js @@ -1,5 +1,6 @@ const Joi = require('joi'); const Serialization = require('../serialization'); +const {createSyncbackRequest} = require('../route-helpers'); module.exports = (server) => { @@ -80,4 +81,66 @@ module.exports = (server) => { }) }, }) + + server.route({ + method: 'PUT', + path: '/messages/{id}', + config: { + description: 'Update a message', + tags: ['messages'], + validate: { + params: { + id: Joi.string(), + payload: { + folder_id: Joi.string(), + }, + }, + }, + response: { + schema: Serialization.jsonSchema('SyncbackRequest'), + }, + }, + handler: (request, reply) => { + const payload = request.payload + if (payload.folder_id) { + createSyncbackRequest(request, reply, { + type: "MoveMessageToFolder", + props: { + folderId: request.payload.folder_id, + messageId: request.params.id, + }, + }) + } + if (payload.unread === false) { + createSyncbackRequest(request, reply, { + type: "MarkMessageAsRead", + props: { + messageId: request.params.id, + }, + }) + } else if (payload.unread === true) { + createSyncbackRequest(request, reply, { + type: "MarkMessageAsUnread", + props: { + messageId: request.params.id, + }, + }) + } + if (payload.starred === false) { + createSyncbackRequest(request, reply, { + type: "UnstarMessage", + props: { + messageId: request.params.id, + }, + }) + } else if (payload.starred === true) { + createSyncbackRequest(request, reply, { + type: "StarMessage", + props: { + messageId: request.params.id, + }, + }) + } + }, + }); }; diff --git a/packages/nylas-sync/syncback-task-factory.js b/packages/nylas-sync/syncback-task-factory.js index 339b91604..309a8b365 100644 --- a/packages/nylas-sync/syncback-task-factory.js +++ b/packages/nylas-sync/syncback-task-factory.js @@ -16,6 +16,16 @@ class SyncbackTaskFactory { Task = require('./syncback_tasks/star-thread.imap'); break; case "UnstarThread": Task = require('./syncback_tasks/unstar-thread.imap'); break; + case "MoveMessageToFolder": + Task = require('./syncback_tasks/move-message-to-folder.imap'); break; + case "MarkMessageAsRead": + Task = require('./syncback_tasks/mark-message-as-read.imap'); break; + case "MarkMessageAsUnread": + Task = require('./syncback_tasks/mark-message-as-unread.imap'); break; + case "StarMessage": + Task = require('./syncback_tasks/star-message.imap'); break; + case "UnstarMessage": + Task = require('./syncback_tasks/unstar-message.imap'); break; default: throw new Error(`Invalid Task Type: ${syncbackRequest.type}`) } diff --git a/packages/nylas-sync/syncback_tasks/mark-message-as-read.imap.js b/packages/nylas-sync/syncback_tasks/mark-message-as-read.imap.js new file mode 100644 index 000000000..2b513bc33 --- /dev/null +++ b/packages/nylas-sync/syncback_tasks/mark-message-as-read.imap.js @@ -0,0 +1,18 @@ +const SyncbackTask = require('./syncback-task') +const TaskHelpers = require('./task-helpers') + +class MarkMessageAsReadIMAP extends SyncbackTask { + description() { + return `MarkMessageAsRead`; + } + + run(db, imap) { + const messageId = this.syncbackRequestObject().props.messageId + + return TaskHelpers.openMessageBox({messageId, db, imap}) + .then(({box, message}) => { + return box.addFlags(message.categoryImapUID, 'SEEN') + }) + } +} +module.exports = MarkMessageAsReadIMAP; diff --git a/packages/nylas-sync/syncback_tasks/mark-message-as-unread.imap.js b/packages/nylas-sync/syncback_tasks/mark-message-as-unread.imap.js new file mode 100644 index 000000000..56b6ff763 --- /dev/null +++ b/packages/nylas-sync/syncback_tasks/mark-message-as-unread.imap.js @@ -0,0 +1,18 @@ +const SyncbackTask = require('./syncback-task') +const TaskHelpers = require('./task-helpers') + +class MarkMessageAsUnreadIMAP extends SyncbackTask { + description() { + return `MarkMessageAsUnread`; + } + + run(db, imap) { + const messageId = this.syncbackRequestObject().props.messageId + + return TaskHelpers.openMessageBox({messageId, db, imap}) + .then(({box, message}) => { + return box.delFlags(message.categoryImapUID, 'SEEN') + }) + } +} +module.exports = MarkMessageAsUnreadIMAP; diff --git a/packages/nylas-sync/syncback_tasks/move-message-to-folder.imap.js b/packages/nylas-sync/syncback_tasks/move-message-to-folder.imap.js new file mode 100644 index 000000000..8cdb412e6 --- /dev/null +++ b/packages/nylas-sync/syncback_tasks/move-message-to-folder.imap.js @@ -0,0 +1,21 @@ +const SyncbackTask = require('./syncback-task') +const TaskHelpers = require('./task-helpers') + +class MoveMessageToFolderIMAP extends SyncbackTask { + description() { + return `MoveMessageToFolder`; + } + + run(db, imap) { + const messageId = this.syncbackRequestObject().props.messageId + const toFolderId = this.syncbackRequestObject().props.folderId + + return TaskHelpers.openMessageBox({messageId, db, imap}) + .then(({box, message}) => { + return db.Category.findById(toFolderId).then((newCategory) => { + return box.moveFromBox(message.categoryImapUID, newCategory.name) + }) + }) + } +} +module.exports = MoveMessageToFolderIMAP diff --git a/packages/nylas-sync/syncback_tasks/star-message.imap.js b/packages/nylas-sync/syncback_tasks/star-message.imap.js new file mode 100644 index 000000000..81b2e7a31 --- /dev/null +++ b/packages/nylas-sync/syncback_tasks/star-message.imap.js @@ -0,0 +1,18 @@ +const SyncbackTask = require('./syncback-task') +const TaskHelpers = require('./task-helpers') + +class StarMessageIMAP extends SyncbackTask { + description() { + return `StarMessage`; + } + + run(db, imap) { + const messageId = this.syncbackRequestObject().props.messageId + + return TaskHelpers.openMessageBox({messageId, db, imap}) + .then(({box, message}) => { + return box.addFlags(message.categoryImapUID, 'FLAGGED') + }) + } +} +module.exports = StarMessageIMAP; diff --git a/packages/nylas-sync/syncback_tasks/task-helpers.js b/packages/nylas-sync/syncback_tasks/task-helpers.js index 00177cb64..ccff3a279 100644 --- a/packages/nylas-sync/syncback_tasks/task-helpers.js +++ b/packages/nylas-sync/syncback_tasks/task-helpers.js @@ -23,5 +23,15 @@ const TaskHelpers = { ) }) }, + + openMessageBox: function openMessageBox({messageId, db, imap}) { + return db.Message.findById(messageId).then((message) => { + return db.Category.findById(message.categoryId).then((category) => { + return imap.openBox(category.name).then((box) => { + return Promise.resolve({box, message}) + }) + }) + }) + }, } module.exports = TaskHelpers diff --git a/packages/nylas-sync/syncback_tasks/unstar-message.imap.js b/packages/nylas-sync/syncback_tasks/unstar-message.imap.js new file mode 100644 index 000000000..3c8fb7828 --- /dev/null +++ b/packages/nylas-sync/syncback_tasks/unstar-message.imap.js @@ -0,0 +1,18 @@ +const SyncbackTask = require('./syncback-task') +const TaskHelpers = require('./task-helpers') + +class UnstarMessageIMAP extends SyncbackTask { + description() { + return `UnstarMessage`; + } + + run(db, imap) { + const messageId = this.syncbackRequestObject().props.messageId + + return TaskHelpers.openMessageBox({messageId, db, imap}) + .then(({box, message}) => { + return box.delFlags(message.categoryImapUID, 'FLAGGED') + }) + } +} +module.exports = UnstarMessageIMAP;