diff --git a/server/models/Document.js b/server/models/Document.js index 2b0e5d494..e6f222e20 100644 --- a/server/models/Document.js +++ b/server/models/Document.js @@ -18,15 +18,14 @@ const serializer = new MarkdownSerializer(); export const DOCUMENT_VERSION = 2; -const createRevision = (doc, options = {}) => { +const createRevision = async (doc, options = {}) => { // we don't create revisions for autosaves if (options.autosave) return; + const previous = await Revision.findLatest(doc.id); + // we don't create revisions if identical to previous - if ( - doc.text === doc.previous("text") && - doc.title === doc.previous("title") - ) { + if (previous && doc.text === previous.text && doc.title === previous.title) { return; } diff --git a/server/models/Document.test.js b/server/models/Document.test.js index c8e25c6be..ae48995e4 100644 --- a/server/models/Document.test.js +++ b/server/models/Document.test.js @@ -1,5 +1,5 @@ /* eslint-disable flowtype/require-valid-file-annotation */ -import { Document } from "../models"; +import { Document, Revision } from "../models"; import { buildDocument, buildCollection, @@ -11,6 +11,37 @@ import { flushdb } from "../test/support"; beforeEach(() => flushdb()); beforeEach(jest.resetAllMocks); +describe("#createRevision", () => { + test("should create revision on document creation", async () => { + const document = await buildDocument(); + + document.title = "Changed"; + await document.save({ autosave: true }); + + const amount = await Revision.count({ where: { documentId: document.id } }); + expect(amount).toBe(1); + }); + + test("should create revision on document update identical to previous autosave", async () => { + const document = await buildDocument(); + + document.title = "Changed"; + await document.save({ autosave: true }); + + document.title = "Changed"; + await document.save(); + + const amount = await Revision.count({ where: { documentId: document.id } }); + expect(amount).toBe(2); + }); + + test("should not create revision if autosave", async () => { + const document = await buildDocument(); + const amount = await Revision.count({ where: { documentId: document.id } }); + expect(amount).toBe(1); + }); +}); + describe("#getSummary", () => { test("should strip markdown", async () => { const document = await buildDocument({ diff --git a/server/models/Revision.js b/server/models/Revision.js index 711ae0add..46ad2cc57 100644 --- a/server/models/Revision.js +++ b/server/models/Revision.js @@ -40,6 +40,15 @@ Revision.associate = (models) => { ); }; +Revision.findLatest = function (documentId) { + return Revision.findOne({ + where: { + documentId, + }, + order: [["createdAt", "DESC"]], + }); +}; + Revision.prototype.migrateVersion = function () { let migrated = false; diff --git a/server/models/Revision.test.js b/server/models/Revision.test.js new file mode 100644 index 000000000..6bab258b5 --- /dev/null +++ b/server/models/Revision.test.js @@ -0,0 +1,27 @@ +/* eslint-disable flowtype/require-valid-file-annotation */ +import { Revision } from "../models"; +import { buildDocument } from "../test/factories"; +import { flushdb } from "../test/support"; + +beforeEach(() => flushdb()); +beforeEach(jest.resetAllMocks); + +describe("#findLatest", () => { + test("should return latest revision", async () => { + const document = await buildDocument({ + title: "Title", + text: "Content", + }); + + document.title = "Changed 1"; + await document.save(); + + document.title = "Changed 2"; + await document.save(); + + const revision = await Revision.findLatest(document.id); + + expect(revision.title).toBe("Changed 2"); + expect(revision.text).toBe("Content"); + }); +});