From f678045c4f1d80c8b28a55476ce6318c261c08b2 Mon Sep 17 00:00:00 2001 From: Ben Gotow Date: Thu, 23 Jun 2016 16:28:51 -0700 Subject: [PATCH] sync db <=> redis with sequelize hooks --- packages/nylas-api/routes/auth.js | 8 +---- packages/nylas-core/database-connector.js | 17 +++------ packages/nylas-core/hook-account-crud.js | 17 +++++++++ packages/nylas-core/hook-transaction-log.js | 32 +++++++++++++++++ packages/nylas-core/transaction-log.js | 39 --------------------- 5 files changed, 54 insertions(+), 59 deletions(-) create mode 100644 packages/nylas-core/hook-account-crud.js create mode 100644 packages/nylas-core/hook-transaction-log.js delete mode 100644 packages/nylas-core/transaction-log.js diff --git a/packages/nylas-api/routes/auth.js b/packages/nylas-api/routes/auth.js index 9eaf30a67..6077228ca 100644 --- a/packages/nylas-api/routes/auth.js +++ b/packages/nylas-api/routes/auth.js @@ -4,9 +4,8 @@ const _ = require('underscore'); const Serialization = require('../serialization'); const { IMAPConnection, - PubsubConnector, DatabaseConnector, - SyncPolicy + SyncPolicy, } = require('nylas-core'); const imapSmtpSettings = Joi.object().keys({ @@ -86,11 +85,6 @@ module.exports = (server) => { AccountToken.create({ AccountId: saved.id, }).then((accountToken) => { - const client = PubsubConnector.broadcastClient(); - client.lpushAsync('accounts:unclaimed', saved.id).catch((err) => { - console.error(`Auth: Could not queue account sync! ${err.message}`) - }); - const response = saved.toJSON(); response.token = accountToken.value; reply(Serialization.jsonStringify(response)); diff --git a/packages/nylas-core/database-connector.js b/packages/nylas-core/database-connector.js index 812f6427b..ef09e43b0 100644 --- a/packages/nylas-core/database-connector.js +++ b/packages/nylas-core/database-connector.js @@ -1,7 +1,8 @@ const Sequelize = require('sequelize'); const fs = require('fs'); const path = require('path'); -const TransactionLog = require('./transaction-log') +const HookTransactionLog = require('./hook-transaction-log'); +const HookAccountCRUD = require('./hook-account-crud'); require('./database-extensions'); // Extends Sequelize on require @@ -49,8 +50,7 @@ class DatabaseConnector { db.Sequelize = Sequelize; db.accountId = accountId; - const transactionLog = new TransactionLog(db); - transactionLog.setupSQLHooks(sequelize) + HookTransactionLog(db, sequelize); return sequelize.authenticate().then(() => sequelize.sync() @@ -75,16 +75,7 @@ class DatabaseConnector { db.sequelize = sequelize; db.Sequelize = Sequelize; - const changeObserver = ({dataValues, $modelOptions}) => { - if ($modelOptions.name.singular === 'Account') { - const PubsubConnector = require('./pubsub-connector'); - PubsubConnector.notifyAccountChange(dataValues.id); - } - } - - sequelize.addHook("afterCreate", changeObserver) - sequelize.addHook("afterUpdate", changeObserver) - sequelize.addHook("afterDelete", changeObserver) + HookAccountCRUD(db, sequelize); return sequelize.authenticate().then(() => sequelize.sync() diff --git a/packages/nylas-core/hook-account-crud.js b/packages/nylas-core/hook-account-crud.js new file mode 100644 index 000000000..4264c10cc --- /dev/null +++ b/packages/nylas-core/hook-account-crud.js @@ -0,0 +1,17 @@ +const PubsubConnector = require('./pubsub-connector') + +module.exports = (db, sequelize) => { + sequelize.addHook("afterCreate", ({dataValues, $modelOptions}) => { + if ($modelOptions.name.singular === 'Account') { + PubsubConnector.broadcastClient().lpushAsync('accounts:unclaimed', dataValues.id); + } + }) + sequelize.addHook("afterUpdate", ({dataValues, $modelOptions}) => { + if ($modelOptions.name.singular === 'Account') { + PubsubConnector.notifyAccountChange(dataValues.id); + } + }) + // TODO delete account from redis + // sequelize.addHook("afterDelete", ({dataValues, $modelOptions}) => { + // }) +} diff --git a/packages/nylas-core/hook-transaction-log.js b/packages/nylas-core/hook-transaction-log.js new file mode 100644 index 000000000..c2d77818d --- /dev/null +++ b/packages/nylas-core/hook-transaction-log.js @@ -0,0 +1,32 @@ +const PubsubConnector = require('./pubsub-connector') + +module.exports = (db, sequelize) => { + const parseHookData = ({dataValues, _changed, $modelOptions}) => { + return { + objectId: dataValues.id, + modelName: $modelOptions.name.singular, + changedFields: _changed, + } + } + + const isTransaction = ({$modelOptions}) => { + return $modelOptions.name.singular === "Transaction" + } + + const transactionLogger = (type) => { + return (sequelizeHookData) => { + if (isTransaction(sequelizeHookData)) return; + const transactionData = Object.assign({type: type}, + parseHookData(sequelizeHookData) + ); + db.Transaction.create(transactionData); + transactionData.object = sequelizeHookData.dataValues; + + PubsubConnector.notifyAccountDeltas(db.accountId, transactionData); + } + } + + sequelize.addHook("afterCreate", transactionLogger("create")) + sequelize.addHook("afterUpdate", transactionLogger("update")) + sequelize.addHook("afterDelete", transactionLogger("delete")) +} diff --git a/packages/nylas-core/transaction-log.js b/packages/nylas-core/transaction-log.js deleted file mode 100644 index 133efad70..000000000 --- a/packages/nylas-core/transaction-log.js +++ /dev/null @@ -1,39 +0,0 @@ -const PubsubConnector = require('./pubsub-connector') - -class TransactionLog { - constructor(db) { - this.db = db; - } - - parseHookData({dataValues, _changed, $modelOptions}) { - return { - objectId: dataValues.id, - modelName: $modelOptions.name.singular, - changedFields: _changed, - } - } - - isTransaction({$modelOptions}) { - return $modelOptions.name.singular === "Transaction" - } - - transactionLogger(type) { - return (sequelizeHookData) => { - if (this.isTransaction(sequelizeHookData)) return; - const transactionData = Object.assign({type: type}, - this.parseHookData(sequelizeHookData) - ); - this.db.Transaction.create(transactionData); - transactionData.object = sequelizeHookData.dataValues; - - PubsubConnector.notifyAccountDeltas(this.db.accountId, transactionData); - } - } - - setupSQLHooks(sequelize) { - sequelize.addHook("afterCreate", this.transactionLogger("create")) - sequelize.addHook("afterUpdate", this.transactionLogger("update")) - sequelize.addHook("afterDelete", this.transactionLogger("delete")) - } -} -module.exports = TransactionLog