Base model refactor (#810)
* Big upgrades * WIP: Stash * Stash, 30 flow errors left * Downgrade mobx * WIP * When I understand the difference between class and instance methods * 💚 * Fixes: File import Model saving edge cases pinning and starring docs Collection editing Upgrade mobx devtools * Notification settings saving works * Disabled settings * Document mailer * Working notifications * Colletion created notification Ensure not notified for own actions * Tidy up * Document updated event only for document creation Add indexes Notification setting on user creation * Commentary * Fixed: Notification setting on signup * Fix document move / duplicate stale data Add BaseModel.refresh method * Fixes: Title in sidebar not updated after editing document * 💚 * Improve / restore error handling Better handle offline errors * 👕
This commit is contained in:
@@ -30,7 +30,6 @@ const Collection = sequelize.define(
|
||||
type: DataTypes.STRING,
|
||||
validate: { isIn: allowedCollectionTypes },
|
||||
},
|
||||
creatorId: DataTypes.UUID,
|
||||
|
||||
/* type: atlas */
|
||||
documentStructure: DataTypes.JSONB,
|
||||
@@ -86,6 +85,10 @@ Collection.associate = models => {
|
||||
foreignKey: 'collectionId',
|
||||
onDelete: 'cascade',
|
||||
});
|
||||
Collection.belongsTo(models.User, {
|
||||
as: 'user',
|
||||
foreignKey: 'creatorId',
|
||||
});
|
||||
Collection.belongsTo(models.Team, {
|
||||
as: 'team',
|
||||
});
|
||||
|
||||
@@ -285,6 +285,10 @@ Document.addHook('afterCreate', async model => {
|
||||
return model;
|
||||
});
|
||||
|
||||
Document.addHook('afterUpdate', model =>
|
||||
events.add({ name: 'documents.update', model })
|
||||
);
|
||||
|
||||
Document.addHook('afterDestroy', model =>
|
||||
events.add({ name: 'documents.delete', model })
|
||||
);
|
||||
|
||||
36
server/models/Notification.js
Normal file
36
server/models/Notification.js
Normal file
@@ -0,0 +1,36 @@
|
||||
// @flow
|
||||
import { DataTypes, sequelize } from '../sequelize';
|
||||
|
||||
const Notification = sequelize.define(
|
||||
'notification',
|
||||
{
|
||||
id: {
|
||||
type: DataTypes.UUID,
|
||||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true,
|
||||
},
|
||||
event: {
|
||||
type: DataTypes.STRING,
|
||||
},
|
||||
email: {
|
||||
type: DataTypes.BOOLEAN,
|
||||
},
|
||||
},
|
||||
{
|
||||
timestamps: true,
|
||||
updatedAt: false,
|
||||
}
|
||||
);
|
||||
|
||||
Notification.associate = models => {
|
||||
Notification.belongsTo(models.User, {
|
||||
as: 'actor',
|
||||
foreignKey: 'actorId',
|
||||
});
|
||||
Notification.belongsTo(models.User, {
|
||||
as: 'user',
|
||||
foreignKey: 'userId',
|
||||
});
|
||||
};
|
||||
|
||||
export default Notification;
|
||||
33
server/models/NotificationSetting.js
Normal file
33
server/models/NotificationSetting.js
Normal file
@@ -0,0 +1,33 @@
|
||||
// @flow
|
||||
import { DataTypes, sequelize } from '../sequelize';
|
||||
|
||||
const NotificationSetting = sequelize.define(
|
||||
'notification_setting',
|
||||
{
|
||||
id: {
|
||||
type: DataTypes.UUID,
|
||||
defaultValue: DataTypes.UUIDV4,
|
||||
primaryKey: true,
|
||||
},
|
||||
event: {
|
||||
type: DataTypes.STRING,
|
||||
},
|
||||
},
|
||||
{
|
||||
timestamps: true,
|
||||
updatedAt: false,
|
||||
}
|
||||
);
|
||||
|
||||
NotificationSetting.associate = models => {
|
||||
NotificationSetting.belongsTo(models.User, {
|
||||
as: 'user',
|
||||
foreignKey: 'userId',
|
||||
});
|
||||
NotificationSetting.belongsTo(models.Team, {
|
||||
as: 'team',
|
||||
foreignKey: 'teamId',
|
||||
});
|
||||
};
|
||||
|
||||
export default NotificationSetting;
|
||||
@@ -6,7 +6,7 @@ import subMinutes from 'date-fns/sub_minutes';
|
||||
import { DataTypes, sequelize, encryptedFields } from '../sequelize';
|
||||
import { publicS3Endpoint, uploadToS3FromUrl } from '../utils/s3';
|
||||
import { sendEmail } from '../mailer';
|
||||
import { Star, ApiKey } from '.';
|
||||
import { Star, NotificationSetting, ApiKey } from '.';
|
||||
|
||||
const User = sequelize.define(
|
||||
'user',
|
||||
@@ -132,4 +132,17 @@ User.beforeSave(uploadAvatar);
|
||||
User.beforeCreate(setRandomJwtSecret);
|
||||
User.afterCreate(user => sendEmail('welcome', user.email));
|
||||
|
||||
// By default when a user signs up we subscribe them to email notifications
|
||||
// when documents they created are edited by other team members.
|
||||
User.afterCreate((user, options) =>
|
||||
NotificationSetting.findOrCreate({
|
||||
where: {
|
||||
userId: user.id,
|
||||
teamId: user.teamId,
|
||||
event: 'documents.update',
|
||||
},
|
||||
transaction: options.transaction,
|
||||
})
|
||||
);
|
||||
|
||||
export default User;
|
||||
|
||||
@@ -5,6 +5,8 @@ import Collection from './Collection';
|
||||
import Document from './Document';
|
||||
import Event from './Event';
|
||||
import Integration from './Integration';
|
||||
import Notification from './Notification';
|
||||
import NotificationSetting from './NotificationSetting';
|
||||
import Revision from './Revision';
|
||||
import Share from './Share';
|
||||
import Star from './Star';
|
||||
@@ -19,6 +21,8 @@ const models = {
|
||||
Document,
|
||||
Event,
|
||||
Integration,
|
||||
Notification,
|
||||
NotificationSetting,
|
||||
Revision,
|
||||
Share,
|
||||
Star,
|
||||
@@ -41,6 +45,8 @@ export {
|
||||
Document,
|
||||
Event,
|
||||
Integration,
|
||||
Notification,
|
||||
NotificationSetting,
|
||||
Revision,
|
||||
Share,
|
||||
Star,
|
||||
|
||||
Reference in New Issue
Block a user