54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import isEqual from "fast-deep-equal";
|
|
import revisionCreator from "@server/commands/revisionCreator";
|
|
import { Revision, Document, User } from "@server/models";
|
|
import { DocumentEvent, RevisionEvent, Event } from "@server/types";
|
|
import BaseProcessor from "./BaseProcessor";
|
|
|
|
export default class RevisionsProcessor extends BaseProcessor {
|
|
static applicableEvents: Event["name"][] = [
|
|
"documents.publish",
|
|
"documents.update",
|
|
"documents.update.debounced",
|
|
];
|
|
|
|
async perform(event: DocumentEvent | RevisionEvent) {
|
|
switch (event.name) {
|
|
case "documents.publish":
|
|
case "documents.update.debounced":
|
|
case "documents.update": {
|
|
if (event.name === "documents.update" && !event.data.done) {
|
|
return;
|
|
}
|
|
|
|
const document = await Document.findByPk(event.documentId, {
|
|
paranoid: false,
|
|
rejectOnEmpty: true,
|
|
});
|
|
const previous = await Revision.findLatest(document.id);
|
|
|
|
// we don't create revisions if identical to previous revision, this can happen if a manual
|
|
// revision was created from another service or user.
|
|
if (
|
|
previous &&
|
|
isEqual(document.content, previous.content) &&
|
|
document.title === previous.title
|
|
) {
|
|
return;
|
|
}
|
|
|
|
const user = await User.findByPk(event.actorId, {
|
|
paranoid: false,
|
|
rejectOnEmpty: true,
|
|
});
|
|
await revisionCreator({
|
|
user,
|
|
document,
|
|
});
|
|
break;
|
|
}
|
|
|
|
default:
|
|
}
|
|
}
|
|
}
|