Add folders and labels to /threads response, version numbers to all models

This commit is contained in:
Ben Gotow 2016-06-29 11:22:38 -07:00
parent 6ecacdd591
commit 9ff7d3aea5
8 changed files with 34 additions and 6 deletions

View file

@ -89,6 +89,8 @@ module.exports = (server) => {
{ role: query.in },
]},
});
} else {
include.push({model: Category})
}
Thread.findAll({

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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