Files
payload/src/versions/saveVersion.ts
2023-01-31 11:29:52 -05:00

120 lines
3.3 KiB
TypeScript

import { FilterQuery } from 'mongoose';
import { Payload } from '../payload';
import { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types';
import { enforceMaxVersions } from './enforceMaxVersions';
import { PayloadRequest } from '../express/types';
import { SanitizedGlobalConfig } from '../globals/config/types';
import sanitizeInternalFields from '../utilities/sanitizeInternalFields';
type Args = {
payload: Payload
global?: SanitizedGlobalConfig
collection?: SanitizedCollectionConfig
req: PayloadRequest
docWithLocales: any
id?: string | number
autosave?: boolean
draft?: boolean
}
export const saveVersion = async ({
payload,
collection,
global,
id,
docWithLocales: doc,
autosave,
draft,
}: Args): Promise<TypeWithID> => {
let result;
let entityConfig;
let entityType: 'global' | 'collection';
if (collection) {
entityConfig = collection;
entityType = 'collection';
}
if (global) {
entityConfig = global;
entityType = 'global';
}
const VersionModel = payload.versions[entityConfig.slug];
const versionData = { ...doc };
if (draft) versionData._status = 'draft';
if (versionData._id) delete versionData._id;
try {
let createNewVersion = true;
const now = new Date().toISOString();
if (autosave) {
const query: FilterQuery<unknown> = {};
if (collection) query.parent = id;
const latestVersion = await VersionModel.findOne(query, {}, { sort: { updatedAt: 'desc' } });
// overwrite the latest version if it's set to autosave
if (latestVersion?.autosave === true) {
createNewVersion = false;
const data: Record<string, unknown> = {
version: versionData,
createdAt: new Date(latestVersion.createdAt).toISOString(),
updatedAt: draft ? now : new Date(doc.updatedAt).toISOString(),
};
result = await VersionModel.findByIdAndUpdate(
{
_id: latestVersion._id,
},
data,
{ new: true, lean: true },
);
}
}
if (createNewVersion) {
const data: Record<string, unknown> = {
autosave: Boolean(autosave),
version: versionData,
createdAt: draft ? now : new Date(doc.createdAt).toISOString(),
updatedAt: draft ? now : new Date(doc.updatedAt).toISOString(),
};
if (collection) data.parent = id;
result = await VersionModel.create(data);
}
} catch (err) {
let errorMessage: string;
if (collection) errorMessage = `There was an error while saving a version for the ${collection.labels.singular} with ID ${id}.`;
if (global) errorMessage = `There was an error while saving a version for the global ${global.label}.`;
payload.logger.error(errorMessage);
payload.logger.error(err);
}
let max = 100;
if (collection && typeof collection.versions.maxPerDoc === 'number') max = collection.versions.maxPerDoc;
if (global && typeof global.versions.max === 'number') max = global.versions.max;
if (max > 0) {
enforceMaxVersions({
id,
payload,
Model: VersionModel,
slug: entityConfig.slug,
entityType,
max,
});
}
result = result.version;
result = JSON.parse(JSON.stringify(result));
result = sanitizeInternalFields(result);
result.id = id;
return result;
};