fix: creates backup of latest version after restoring draft #1873

This commit is contained in:
Jacob Fletcher
2023-01-16 11:05:42 -05:00
parent 4a49640c3f
commit bd4da37f23
3 changed files with 41 additions and 16 deletions

View File

@@ -9,6 +9,7 @@ import { Where } from '../../types';
import sanitizeInternalFields from '../../utilities/sanitizeInternalFields';
import { afterChange } from '../../fields/hooks/afterChange';
import { afterRead } from '../../fields/hooks/afterRead';
import { getLatestCollectionVersion } from '../../versions/getLatestCollectionVersion';
export type Arguments = {
collection: Collection
@@ -23,6 +24,7 @@ export type Arguments = {
async function restoreVersion<T extends TypeWithID = any>(args: Arguments): Promise<T> {
const {
collection,
collection: {
Model,
config: collectionConfig,
@@ -99,10 +101,11 @@ async function restoreVersion<T extends TypeWithID = any>(args: Arguments): Prom
// fetch previousDoc
// /////////////////////////////////////
const previousDoc = await payload.findByID({
collection: collectionConfig.slug,
const prevDocWithLocales = await getLatestCollectionVersion({
payload,
collection,
id: parentDocID,
depth,
query,
});
// /////////////////////////////////////
@@ -123,6 +126,22 @@ async function restoreVersion<T extends TypeWithID = any>(args: Arguments): Prom
result = JSON.parse(result);
result = sanitizeInternalFields(result);
// /////////////////////////////////////
// Save `previousDoc` as a version after restoring
// /////////////////////////////////////
const prevVersion = { ...prevDocWithLocales };
delete prevVersion.id;
await VersionModel.create({
parent: parentDocID,
version: prevVersion,
autosave: false,
createdAt: prevVersion.createdAt,
updatedAt: new Date().toISOString(),
});
// /////////////////////////////////////
// afterRead - Fields
// /////////////////////////////////////
@@ -156,7 +175,7 @@ async function restoreVersion<T extends TypeWithID = any>(args: Arguments): Prom
result = await afterChange({
data: result,
doc: result,
previousDoc,
previousDoc: prevDocWithLocales,
entityConfig: collectionConfig,
operation: 'update',
req,
@@ -172,7 +191,7 @@ async function restoreVersion<T extends TypeWithID = any>(args: Arguments): Prom
result = await hook({
doc: result,
req,
previousDoc,
previousDoc: prevDocWithLocales,
operation: 'update',
}) || result;
}, Promise.resolve());

View File

@@ -1,6 +1,7 @@
import { Document } from '../types';
import { Payload } from '../payload';
import { Collection, TypeWithID } from '../collections/config/types';
import sanitizeInternalFields from '../utilities/sanitizeInternalFields';
type Args = {
payload: Payload
@@ -29,13 +30,16 @@ export const getLatestCollectionVersion = async <T extends TypeWithID = any>({
lean,
});
}
const collection = await Model.findOne(query, {}, { lean }) as Document;
let collection = await Model.findOne(query, {}, { lean }) as Document;
version = await version;
if (!version || version.updatedAt < collection.updatedAt) {
collection.id = collection._id;
collection = sanitizeInternalFields(collection);
return collection;
}
return {
...version.version,
id,
updatedAt: version.updatedAt,
createdAt: version.createdAt,
};

View File

@@ -47,7 +47,7 @@ describe('Versions', () => {
describe('Collections - Local', () => {
describe('Create', () => {
it('should allow a new version to be created', async () => {
it('should allow a new version to be created and updated', async () => {
const autosavePost = await payload.create({
collection,
data: {
@@ -56,10 +56,10 @@ describe('Versions', () => {
},
});
const updatedTitle = 'Here is an updated post title in EN';
collectionLocalPostID = autosavePost.id;
const updatedTitle = 'Here is an updated post title in EN';
const updatedPost: {
title: string
_status?: string
@@ -71,15 +71,15 @@ describe('Versions', () => {
},
});
expect(updatedPost.title).toBe(updatedTitle);
expect(updatedPost._status).toStrictEqual('draft');
const versions = await payload.findVersions({
collection,
});
collectionLocalVersionID = versions.docs[0].id;
expect(updatedPost.title).toBe(updatedTitle);
expect(updatedPost._status).toStrictEqual('draft');
expect(collectionLocalVersionID).toBeDefined();
});
@@ -99,6 +99,7 @@ describe('Versions', () => {
description: 'description 2',
},
});
const finalDescription = 'final description';
const secondUpdate = await payload.update({
@@ -187,20 +188,21 @@ describe('Versions', () => {
collection,
});
const restore = await payload.restoreVersion({
// restore to latest version
const restoredVersion = await payload.restoreVersion({
collection,
id: versions.docs[1].id,
});
expect(restore.title).toBeDefined();
expect(restoredVersion.title).toBeDefined();
const restoredPost = await payload.findByID({
const latestDraft = await payload.findByID({
collection,
id: collectionLocalPostID,
draft: true,
});
expect(restoredPost.title).toBe(versions.docs[1].version.title);
expect(latestDraft.title).toBe(versions.docs[1].version.title);
});
});