// @flow import { DataTypes, sequelize } from "../sequelize"; import MarkdownSerializer from "slate-md-serializer"; const serializer = new MarkdownSerializer(); const Revision = sequelize.define("revision", { id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true, }, version: DataTypes.SMALLINT, editorVersion: DataTypes.STRING, title: DataTypes.STRING, text: DataTypes.TEXT, // backup contains a record of text at the moment it was converted to v2 // this is a safety measure during deployment of new editor and will be // dropped in a future update backup: DataTypes.TEXT, }); Revision.associate = (models) => { Revision.belongsTo(models.Document, { as: "document", foreignKey: "documentId", onDelete: "cascade", }); Revision.belongsTo(models.User, { as: "user", foreignKey: "userId", }); Revision.addScope( "defaultScope", { include: [{ model: models.User, as: "user", paranoid: false }], }, { override: true } ); }; Revision.prototype.migrateVersion = function () { let migrated = false; // migrate from document version 0 -> 1 if (!this.version) { // removing the title from the document text attribute this.text = this.text.replace(/^#\s(.*)\n/, ""); this.version = 1; migrated = true; } // migrate from document version 1 -> 2 if (this.version === 1) { const nodes = serializer.deserialize(this.text); this.backup = this.text; this.text = serializer.serialize(nodes, { version: 2 }); this.version = 2; migrated = true; } if (migrated) { return this.save({ silent: true, hooks: false }); } }; export default Revision;