chore: Refactor backlinks and revisions (#1611)

* Update backlinks service to not rely on revisions

* fix: Add missing index for finding backlinks

* Debounce revision creation (#1616)

* refactor debounce logic to service

* Debounce slack notification

* Revisions created by service

* fix: Revision sidebar latest

* test: Add tests for notifications
This commit is contained in:
Tom Moor
2020-11-01 10:26:39 -08:00
committed by GitHub
parent 7735aa12d7
commit 3d09c8f655
20 changed files with 487 additions and 246 deletions

View File

@@ -19,32 +19,6 @@ const serializer = new MarkdownSerializer();
export const DOCUMENT_VERSION = 2;
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 (previous && doc.text === previous.text && doc.title === previous.title) {
return;
}
return Revision.create(
{
title: doc.title,
text: doc.text,
userId: doc.lastModifiedById,
editorVersion: doc.editorVersion,
version: doc.version,
documentId: doc.id,
},
{
transaction: options.transaction,
}
);
};
const createUrlId = (doc) => {
return (doc.urlId = doc.urlId || randomstring.generate(10));
};
@@ -118,8 +92,6 @@ const Document = sequelize.define(
beforeValidate: createUrlId,
beforeCreate: beforeCreate,
beforeUpdate: beforeSave,
afterCreate: createRevision,
afterUpdate: createRevision,
},
getterMethods: {
url: function () {

View File

@@ -1,5 +1,5 @@
/* eslint-disable flowtype/require-valid-file-annotation */
import { Document, Revision } from "../models";
import { Document } from "../models";
import {
buildDocument,
buildCollection,
@@ -11,37 +11,6 @@ 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({

View File

@@ -48,6 +48,12 @@ Event.afterCreate((event) => {
events.add(event, { removeOnComplete: true });
});
// add can be used to send events into the event system without recording them
// in the database / audit trail
Event.add = (event) => {
events.add(Event.build(event), { removeOnComplete: true });
};
Event.ACTIVITY_EVENTS = [
"users.create",
"documents.publish",

View File

@@ -49,6 +49,21 @@ Revision.findLatest = function (documentId) {
});
};
Revision.createFromDocument = function (document) {
return Revision.create({
title: document.title,
text: document.text,
userId: document.lastModifiedById,
editorVersion: document.editorVersion,
version: document.version,
documentId: document.id,
// revision time is set to the last time document was touched as this
// handler can be debounced in the case of an update
createdAt: document.updatedAt,
});
};
Revision.prototype.migrateVersion = function () {
let migrated = false;

View File

@@ -12,12 +12,15 @@ describe("#findLatest", () => {
title: "Title",
text: "Content",
});
await Revision.createFromDocument(document);
document.title = "Changed 1";
await document.save();
await Revision.createFromDocument(document);
document.title = "Changed 2";
await document.save();
await Revision.createFromDocument(document);
const revision = await Revision.findLatest(document.id);