Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
1 line
13 KiB
Plaintext
1 line
13 KiB
Plaintext
{"version":3,"sources":["../../../../../src/versions/migrations/localizeStatus/sql/down.ts"],"sourcesContent":["import type { Payload } from '../../../../types/index.js'\n\nimport { hasLocalizeStatusEnabled } from '../../../../utilities/getVersionsConfig.js'\nimport { toSnakeCase } from '../shared.js'\n\nexport type LocalizeStatusArgs = {\n collectionSlug?: string\n db: any\n globalSlug?: string\n payload: Payload\n req?: any\n sql: any\n}\n\nexport async function down(args: LocalizeStatusArgs): Promise<void> {\n const { collectionSlug, db, globalSlug, payload, sql } = args\n\n if (!collectionSlug && !globalSlug) {\n throw new Error('Either collectionSlug or globalSlug must be provided')\n }\n\n if (collectionSlug && globalSlug) {\n throw new Error('Cannot provide both collectionSlug and globalSlug')\n }\n\n const entitySlug = collectionSlug || globalSlug\n // Convert camelCase slugs to snake_case and add version prefix/suffix\n const versionsTable = collectionSlug\n ? `_${toSnakeCase(collectionSlug)}_v`\n : `_${toSnakeCase(globalSlug!)}_v`\n const localesTable = `${versionsTable}_locales`\n\n if (!payload.config.localization) {\n throw new Error('Localization is not enabled in payload config')\n }\n\n const entityConfig = collectionSlug\n ? payload.config.collections.find((c) => c.slug === collectionSlug)\n : payload.config.globals.find((g) => g.slug === globalSlug!)\n\n if (!entityConfig) {\n throw new Error(\n `${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`,\n )\n }\n\n if (hasLocalizeStatusEnabled(entityConfig)) {\n throw new Error(\n `${entitySlug} has localizeStatus enabled, cannot run down migration. ` +\n `Please disable localizeStatus in your config before rolling back this migration.`,\n )\n }\n\n const defaultLocale = payload.config.localization.defaultLocale\n\n payload.logger.info({\n msg: `Rolling back _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}`,\n })\n\n // 1. Restore version__status column to main table\n payload.logger.info({ msg: `Restoring version__status column to ${versionsTable}` })\n\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n ALTER TABLE ${sql.identifier(versionsTable)} ADD COLUMN version__status VARCHAR\n `,\n })\n\n // 2. Copy status from default locale back to main table\n payload.logger.info({\n msg: `Copying status from default locale (${defaultLocale}) back to main table`,\n })\n\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n UPDATE ${sql.identifier(versionsTable)} pv\n SET version__status = pl.version__status\n FROM ${sql.identifier(localesTable)} pl\n WHERE pv.id = pl._parent_id\n AND pl._locale = ${defaultLocale}\n `,\n })\n\n // 3. Check if there are other localized fields besides version__status\n const columnCheckResult = await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n SELECT COUNT(*) as count\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = ${localesTable}\n AND column_name NOT IN ('id', '_locale', '_parent_id', 'version__status')\n `,\n })\n\n const hasOtherLocalizedFields = Number(columnCheckResult.rows[0]?.count) > 0\n\n if (!hasOtherLocalizedFields) {\n // SCENARIO 1 ROLLBACK: No other localized fields, drop entire table\n payload.logger.info({ msg: `Dropping entire locales table: ${localesTable}` })\n\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`DROP TABLE ${sql.identifier(localesTable)} CASCADE`,\n })\n } else {\n // SCENARIO 2 ROLLBACK: Other localized fields exist, just drop version__status column\n payload.logger.info({ msg: `Dropping version__status column from ${localesTable}` })\n\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n ALTER TABLE ${sql.identifier(localesTable)} DROP COLUMN version__status\n `,\n })\n }\n\n // 4. Restore _status to main collection/global table if it was dropped\n const mainTable = collectionSlug ? toSnakeCase(collectionSlug) : toSnakeCase(globalSlug!)\n const mainLocalesTable = `${mainTable}_locales`\n\n // Check if _status exists in the main table\n const statusInMainTableCheck = await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n SELECT EXISTS (\n SELECT FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = ${mainTable}\n AND column_name = '_status'\n ) as exists\n `,\n })\n\n if (!statusInMainTableCheck.rows[0]?.exists) {\n // _status column doesn't exist in main table, need to restore it\n // Check if main collection/global has a locales table\n const mainLocalesTableCheck = await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n SELECT EXISTS (\n SELECT FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_name = ${mainLocalesTable}\n ) as exists\n `,\n })\n\n if (mainLocalesTableCheck.rows[0]?.exists) {\n // Locales table exists - check if _status is there\n const statusInLocalesCheck = await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n SELECT EXISTS (\n SELECT FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = ${mainLocalesTable}\n AND column_name = '_status'\n ) as exists\n `,\n })\n\n if (statusInLocalesCheck.rows[0]?.exists) {\n // Add _status back to main table\n payload.logger.info({ msg: `Restoring _status column to ${mainTable}` })\n\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n ALTER TABLE ${sql.identifier(mainTable)} ADD COLUMN _status VARCHAR\n `,\n })\n\n // Copy status from default locale back to main table\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n UPDATE ${sql.identifier(mainTable)} m\n SET _status = l._status\n FROM ${sql.identifier(mainLocalesTable)} l\n WHERE m.id = l._parent_id\n AND l._locale = ${defaultLocale}\n `,\n })\n\n // Drop _status from locales table\n payload.logger.info({ msg: `Dropping _status column from ${mainLocalesTable}` })\n\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n ALTER TABLE ${sql.identifier(mainLocalesTable)} DROP COLUMN _status\n `,\n })\n }\n } else {\n // No locales table exists - this means collection/global has no localized fields\n // Just add _status back to main table with default values\n payload.logger.info({\n msg: `Restoring _status column to ${mainTable} (no locales table exists)`,\n })\n\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n ALTER TABLE ${sql.identifier(mainTable)} ADD COLUMN _status VARCHAR\n `,\n })\n\n // Set default status based on latest version status for each document\n // Get all documents in the collection\n const documents = await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n SELECT DISTINCT id\n FROM ${sql.identifier(mainTable)}\n `,\n })\n\n for (const doc of documents.rows) {\n // Get latest version status for this document\n const latestVersionStatus = await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n SELECT version__status\n FROM ${sql.identifier(versionsTable)}\n WHERE parent_id = ${doc.id}\n ORDER BY created_at DESC\n LIMIT 1\n `,\n })\n\n const status = latestVersionStatus.rows[0]?.version__status || 'draft'\n\n await db.execute({\n drizzle: db.drizzle,\n sql: sql`\n UPDATE ${sql.identifier(mainTable)}\n SET _status = ${status}\n WHERE id = ${doc.id}\n `,\n })\n }\n\n payload.logger.info({ msg: `Restored _status for ${documents.rows.length} documents` })\n }\n }\n\n payload.logger.info({ msg: 'Rollback completed successfully' })\n}\n"],"names":["hasLocalizeStatusEnabled","toSnakeCase","down","args","collectionSlug","db","globalSlug","payload","sql","Error","entitySlug","versionsTable","localesTable","config","localization","entityConfig","collections","find","c","slug","globals","g","defaultLocale","logger","info","msg","execute","drizzle","identifier","columnCheckResult","hasOtherLocalizedFields","Number","rows","count","mainTable","mainLocalesTable","statusInMainTableCheck","exists","mainLocalesTableCheck","statusInLocalesCheck","documents","doc","latestVersionStatus","id","status","version__status","length"],"mappings":"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"} |