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:
Tom Moor
2018-12-04 22:24:30 -08:00
committed by GitHub
parent 67cd250316
commit 8cbcb77486
222 changed files with 2273 additions and 2361 deletions

View File

@@ -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',
});

View File

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

View 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;

View 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;

View File

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

View File

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