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 Serialization = require('../serialization');
|
||||||
const {
|
const {
|
||||||
IMAPConnection,
|
IMAPConnection,
|
||||||
PubsubConnector,
|
|
||||||
DatabaseConnector,
|
DatabaseConnector,
|
||||||
SyncPolicy
|
SyncPolicy,
|
||||||
} = require('nylas-core');
|
} = require('nylas-core');
|
||||||
|
|
||||||
const imapSmtpSettings = Joi.object().keys({
|
const imapSmtpSettings = Joi.object().keys({
|
||||||
|
@ -86,11 +85,6 @@ module.exports = (server) => {
|
||||||
AccountToken.create({
|
AccountToken.create({
|
||||||
AccountId: saved.id,
|
AccountId: saved.id,
|
||||||
}).then((accountToken) => {
|
}).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();
|
const response = saved.toJSON();
|
||||||
response.token = accountToken.value;
|
response.token = accountToken.value;
|
||||||
reply(Serialization.jsonStringify(response));
|
reply(Serialization.jsonStringify(response));
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
const Sequelize = require('sequelize');
|
const Sequelize = require('sequelize');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const path = require('path');
|
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
|
require('./database-extensions'); // Extends Sequelize on require
|
||||||
|
|
||||||
|
@ -49,8 +50,7 @@ class DatabaseConnector {
|
||||||
db.Sequelize = Sequelize;
|
db.Sequelize = Sequelize;
|
||||||
db.accountId = accountId;
|
db.accountId = accountId;
|
||||||
|
|
||||||
const transactionLog = new TransactionLog(db);
|
HookTransactionLog(db, sequelize);
|
||||||
transactionLog.setupSQLHooks(sequelize)
|
|
||||||
|
|
||||||
return sequelize.authenticate().then(() =>
|
return sequelize.authenticate().then(() =>
|
||||||
sequelize.sync()
|
sequelize.sync()
|
||||||
|
@ -75,16 +75,7 @@ class DatabaseConnector {
|
||||||
db.sequelize = sequelize;
|
db.sequelize = sequelize;
|
||||||
db.Sequelize = Sequelize;
|
db.Sequelize = Sequelize;
|
||||||
|
|
||||||
const changeObserver = ({dataValues, $modelOptions}) => {
|
HookAccountCRUD(db, sequelize);
|
||||||
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)
|
|
||||||
|
|
||||||
return sequelize.authenticate().then(() =>
|
return sequelize.authenticate().then(() =>
|
||||||
sequelize.sync()
|
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