public static function boot()
{
parent::boot();
static::creating(function ($page) {
$slugifier = new Slugify();
$page->setJsonAttribute('metadata', 'author', UserProvider::getCurrentUserId());
$page->setJsonAttribute('metadata', 'slug', $slugifier->slugify($page->title));
});
static::created(function ($page) {
$revision = new PageRevision();
$revision->page_id = $page->id;
$revision->revision_id = 0;
$dmp = new DiffMatchPatch();
// Content patch
$contentPatches = $dmp->patch_make("", $page->content);
$revision->content_patch = $dmp->patch_toText($contentPatches);
// Metadata patch
$revision->metadata_patch = json_encode(JsonPatch::diff([], json_decode($page->metadata, 1)));
$revision->author = UserProvider::getCurrentUserId();
$revision->created_at = Carbon::now();
$revision->save();
});
static::updating(function ($updatingPage) {
// Get the page again from DB so we are sure we have up-to-date content to make the diff from
$page = Page::find($updatingPage->id);
$lastRevision = PageRevision::where('page_id', $page->id)->orderBy('revision_id', 'DESC')->firstOrFail();
$revision = new PageRevision();
$revision->page_id = $page->id;
$revision->revision_id = $lastRevision->revision_id + 1;
$dmp = new DiffMatchPatch();
// Content patch
$contentPatches = $dmp->patch_make($page->getOriginal('content'), $updatingPage->content);
$revision->content_patch = $dmp->patch_toText($contentPatches);
// Metadata patch
$revision->metadata_patch = json_encode(JsonPatch::diff(json_decode($page->metadata, 1), json_decode($updatingPage->metadata, 1)));
$revision->author = UserProvider::getCurrentUserId();
$revision->created_at = Carbon::now();
$revision->save();
});
}