UNPKG

payload

Version:

Node, React, Headless CMS and Application Framework built on Next.js

112 lines (111 loc) 5.11 kB
import { hasLocalizeStatusEnabled } from '../../../../utilities/getVersionsConfig.js'; export async function down(args) { const { collectionSlug, globalSlug, payload } = args; if (!collectionSlug && !globalSlug) { throw new Error('Either collectionSlug or globalSlug must be provided'); } if (collectionSlug && globalSlug) { throw new Error('Cannot provide both collectionSlug and globalSlug'); } const entitySlug = collectionSlug || globalSlug; // MongoDB collection names are case-insensitive and stored as lowercase const versionsCollection = `_${entitySlug}_versions`.toLowerCase(); if (!payload.config.localization) { throw new Error('Localization is not enabled in payload config'); } const entityConfig = collectionSlug ? payload.config.collections.find((c)=>c.slug === collectionSlug) : payload.config.globals.find((g)=>g.slug === globalSlug); if (!entityConfig) { throw new Error(`${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`); } if (hasLocalizeStatusEnabled(entityConfig)) { throw new Error(`${entitySlug} has localizeStatus enabled, cannot run down migration. ` + `Please disable localizeStatus in your config before rolling back this migration.`); } const defaultLocale = payload.config.localization.defaultLocale; payload.logger.info({ msg: `Rolling back _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}` }); // Get MongoDB connection const connection = payload.db.connection; payload.logger.info({ msg: 'Fetching all version documents...' }); // Get all versions const allVersions = await connection.collection(versionsCollection).find({}).toArray(); payload.logger.info({ msg: `Found ${allVersions.length} version documents` }); // Update each version document: convert version._status from object to string let updateCount = 0; for (const doc of allVersions){ const currentStatus = doc.version?._status; if (!currentStatus || typeof currentStatus === 'string') { continue; } // Convert from { en: 'published', es: 'draft' } to 'published' (using default locale) const statusValue = typeof currentStatus === 'object' ? currentStatus[defaultLocale] || 'draft' : 'draft'; await connection.collection(versionsCollection).updateOne({ _id: doc._id }, { $set: { 'version._status': statusValue } }); updateCount++; } payload.logger.info({ msg: `Updated ${updateCount} version documents` }); // Rollback main collection/global document status if (collectionSlug) { const mainCollection = collectionSlug; const mainDoc = await connection.collection(mainCollection).findOne({}); if (mainDoc && '_status' in mainDoc && typeof mainDoc._status === 'object') { payload.logger.info({ msg: `Rolling back main collection documents for: ${mainCollection}` }); const allDocs = await connection.collection(mainCollection).find({}).toArray(); for (const doc of allDocs){ if (typeof doc._status === 'object' && !Array.isArray(doc._status)) { // Convert from { en: 'published', es: 'draft' } to 'published' (using default locale) const statusValue = doc._status[defaultLocale] || 'draft'; await connection.collection(mainCollection).updateOne({ _id: doc._id }, { $set: { _status: statusValue } }); } } payload.logger.info({ msg: `Rolled back ${allDocs.length} collection documents` }); } } else if (globalSlug) { const globalDoc = await connection.collection('globals').findOne({ globalType: globalSlug }); if (globalDoc && '_status' in globalDoc && typeof globalDoc.status === 'object') { payload.logger.info({ msg: `Rolling back main global document for: ${globalSlug}` }); // Convert from { en: 'published', es: 'draft' } to 'published' (using default locale) const statusValue = typeof globalDoc._status === 'object' && !Array.isArray(globalDoc._status) ? globalDoc._status[defaultLocale] || 'draft' : 'draft'; await connection.collection('globals').updateOne({ _id: globalDoc._id, globalType: globalSlug }, { $set: { _status: statusValue } }); payload.logger.info({ msg: 'Rolled back global document' }); } } payload.logger.info({ msg: 'Rollback completed successfully' }); } //# sourceMappingURL=down.js.map