mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-09-22 08:16:09 +08:00
sync db <=> redis with sequelize hooks
This commit is contained in:
parent
eac019f536
commit
f678045c4f
|
@ -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));
|
||||
|
|
|
@ -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()
|
||||
|
|
17
packages/nylas-core/hook-account-crud.js
Normal file
17
packages/nylas-core/hook-account-crud.js
Normal 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}) => {
|
||||
// })
|
||||
}
|
32
packages/nylas-core/hook-transaction-log.js
Normal file
32
packages/nylas-core/hook-transaction-log.js
Normal 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"))
|
||||
}
|
|
@ -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
|
Loading…
Reference in a new issue