diff --git a/packages/nylas-api/routes/threads.js b/packages/nylas-api/routes/threads.js index a80fe76f1..661789457 100644 --- a/packages/nylas-api/routes/threads.js +++ b/packages/nylas-api/routes/threads.js @@ -89,6 +89,8 @@ module.exports = (server) => { { role: query.in }, ]}, }); + } else { + include.push({model: Category}) } Thread.findAll({ diff --git a/packages/nylas-core/database-connector.js b/packages/nylas-core/database-connector.js index 2c09ea79d..4c0e7e6ea 100644 --- a/packages/nylas-core/database-connector.js +++ b/packages/nylas-core/database-connector.js @@ -3,6 +3,7 @@ const fs = require('fs'); const path = require('path'); const HookTransactionLog = require('./hook-transaction-log'); const HookAccountCRUD = require('./hook-account-crud'); +const HookIncrementVersionOnSave = require('./hook-increment-version-on-save'); require('./database-extensions'); // Extends Sequelize on require @@ -46,12 +47,13 @@ class DatabaseConnector { const modelsPath = path.join(__dirname, 'models/account'); const db = this._readModelsInDirectory(sequelize, modelsPath) + HookTransactionLog(db, sequelize); + HookIncrementVersionOnSave(db, sequelize); + db.sequelize = sequelize; db.Sequelize = Sequelize; db.accountId = accountId; - HookTransactionLog(db, sequelize); - return sequelize.authenticate().then(() => sequelize.sync() ).thenReturn(db); @@ -72,11 +74,11 @@ class DatabaseConnector { const modelsPath = path.join(__dirname, 'models/shared'); const db = this._readModelsInDirectory(sequelize, modelsPath) + HookAccountCRUD(db, sequelize); + db.sequelize = sequelize; db.Sequelize = Sequelize; - HookAccountCRUD(db, sequelize); - return sequelize.authenticate().then(() => sequelize.sync() ).thenReturn(db); diff --git a/packages/nylas-core/hook-account-crud.js b/packages/nylas-core/hook-account-crud.js index 0ded2094e..9f828b341 100644 --- a/packages/nylas-core/hook-account-crud.js +++ b/packages/nylas-core/hook-account-crud.js @@ -7,7 +7,7 @@ module.exports = (db, sequelize) => { PubsubConnector.broadcastClient().lpushAsync('accounts:unclaimed', dataValues.id); PubsubConnector.notify({ accountId: dataValues.id, - type: MessageTypes.ACCOUNT_UPDATED + type: MessageTypes.ACCOUNT_UPDATED, }); } }) @@ -15,7 +15,7 @@ module.exports = (db, sequelize) => { if ($modelOptions.name.singular === 'Account') { PubsubConnector.notify({ accountId: dataValues.id, - type: MessageTypes.ACCOUNT_UPDATED + type: MessageTypes.ACCOUNT_UPDATED, }); } }) diff --git a/packages/nylas-core/hook-increment-version-on-save.js b/packages/nylas-core/hook-increment-version-on-save.js new file mode 100644 index 000000000..3751d0fcf --- /dev/null +++ b/packages/nylas-core/hook-increment-version-on-save.js @@ -0,0 +1,13 @@ + +module.exports = (db) => { + for (const modelName of Object.keys(db)) { + const model = db[modelName]; + + model.beforeCreate('increment-version-c', (instance) => { + instance.version = 1; + }); + model.beforeUpdate('increment-version-u', (instance) => { + instance.version = instance.version ? instance.version + 1 : 1; + }); + } +} diff --git a/packages/nylas-core/models/account/category.js b/packages/nylas-core/models/account/category.js index 995622fc6..be7795ae1 100644 --- a/packages/nylas-core/models/account/category.js +++ b/packages/nylas-core/models/account/category.js @@ -3,6 +3,7 @@ const {JSONType} = require('../../database-types'); module.exports = (sequelize, Sequelize) => { const Category = sequelize.define('category', { accountId: { type: Sequelize.STRING, allowNull: false }, + version: Sequelize.INTEGER, name: Sequelize.STRING, role: Sequelize.STRING, type: Sequelize.ENUM('folder', 'label'), diff --git a/packages/nylas-core/models/account/file.js b/packages/nylas-core/models/account/file.js index 3cc619b39..8655189df 100644 --- a/packages/nylas-core/models/account/file.js +++ b/packages/nylas-core/models/account/file.js @@ -1,6 +1,7 @@ module.exports = (sequelize, Sequelize) => { const File = sequelize.define('file', { accountId: { type: Sequelize.STRING, allowNull: false }, + version: Sequelize.INTEGER, filename: Sequelize.STRING, contentId: Sequelize.STRING, contentType: Sequelize.STRING, diff --git a/packages/nylas-core/models/account/message.js b/packages/nylas-core/models/account/message.js index e9295900f..f7cba8982 100644 --- a/packages/nylas-core/models/account/message.js +++ b/packages/nylas-core/models/account/message.js @@ -7,6 +7,7 @@ const {JSONType, JSONARRAYType} = require('../../database-types'); module.exports = (sequelize, Sequelize) => { const Message = sequelize.define('message', { accountId: { type: Sequelize.STRING, allowNull: false }, + version: Sequelize.INTEGER, messageId: Sequelize.STRING, body: Sequelize.STRING, headers: JSONType('headers'), diff --git a/packages/nylas-core/models/account/thread.js b/packages/nylas-core/models/account/thread.js index fd1fc1f6a..d4c305eb2 100644 --- a/packages/nylas-core/models/account/thread.js +++ b/packages/nylas-core/models/account/thread.js @@ -3,6 +3,7 @@ const {JSONARRAYType} = require('../../database-types'); module.exports = (sequelize, Sequelize) => { const Thread = sequelize.define('thread', { accountId: { type: Sequelize.STRING, allowNull: false }, + version: Sequelize.INTEGER, threadId: Sequelize.STRING, subject: Sequelize.STRING, snippet: Sequelize.STRING, @@ -22,9 +23,16 @@ module.exports = (sequelize, Sequelize) => { }, instanceMethods: { toJSON: function toJSON() { + if (!this.categories) { + throw new Error("Thread.toJSON called on a thread where categories were not eagerly loaded.") + } + const folders = this.categories.filter(c => c.type === 'folder'); + const labels = this.categories.filter(c => c.type === 'label'); return { id: this.id, object: 'thread', + folders: folders, + labels: labels, account_id: this.accountId, participants: this.participants, subject: this.subject,