sync db <=> redis with sequelize hooks

This commit is contained in:
Ben Gotow 2016-06-23 16:28:51 -07:00
parent eac019f536
commit f678045c4f
5 changed files with 54 additions and 59 deletions

View file

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

View file

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

View file

@ -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}) => {
// })
}

View file

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

View file

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